Zero-config capture
SquatchMail attaches to Swoosh's telemetry at boot and observes every send your app already makes. No adapter swap. No proxy. It was watching the whole time.
// Field station 001 — Amazon SES observability for Phoenix
The self-hosted Amazon SES dashboard for Elixir, shipped as a Hex package. Add the dep, run one migration, mount one route — and every email your Phoenix app sends leaves a trackable footprint in your own Postgres.Big footprint. Tiny bill.
// Live from the forest floor
Every send is a Sighting. Every SES event is a Footprint. This is the Trail Log — the part of the dashboard you'll leave open in a tab and glance at like a trail camera.
mulder@fbi.example
I want to believe (your receipt)
scully@fbi.example
Evidence attached: invoice #1967
ranger@pnw.example
Trail conditions: muddy, mysterious
bear@forest.example
You are NOT the cryptid we ordered
patterson@gimlin.example
Frame 352: your weekly digest
1
migration to run
0
extra services to babysit
0
blurry photos — raw payloads kept
100%
of the evidence in YOUR postgres
// What the expedition has confirmed
Most researchers spend decades without a single confirmed sighting. You'll have one before your coffee cools.
SquatchMail attaches to Swoosh's telemetry at boot and observes every send your app already makes. No adapter swap. No proxy. It was watching the whole time.
Deliveries, opens, clicks, bounces, complaints, delays — every SNS notification becomes a Footprint on a per-email timeline. Signatures hand-verified. No blurry evidence.
"Connect SES" provisions the configuration set, SNS topic, HTTPS subscription, and event destination for you. The afternoon you'd lose in the AWS console, done from a button.
Hard bounces and complaints are suppressed permanently; soft bounces expire. Some addresses have asked to be left alone. The Squatch respects boundaries.
The Guard auto-pauses sending at a 0.1% complaint rate — SES's own account-suspension threshold — before AWS pauses it for you, less politely.
A late delivery notification can't un-click an email. Statuses only ever upgrade; bounces and complaints always win outright. The trail record is sacred.
The Pruner sweeps old emails and footprints past your retention window on a timer. The forest doesn't accumulate footprints forever. Leave no trace.
Everything lives in its own squatch_mail Postgres schema inside your existing database, versioned and migrated the Oban / ErrorTracker way. No queue. No Redis. No cryptid infrastructure.
// How a sighting gets tracked
Outbound — a send happens
Your Swoosh mailer delivers — exactly as it does today. No adapter swap, no proxy, no code changes to your send path.
Telemetry hears the branch snap — SquatchMail captures the send from inside your BEAM node, asynchronously. It never blocks a delivery.
The Sighting is logged — recipients, subject, attachments, all filed in the squatch_mail schema of your own database.
Inbound — SES reports back
SES → SNS → your webhook — delivery, open, click, bounce, complaint, delay. Signed notifications, straight to your app.
The evidence is authenticated — SigV1/SigV2 signatures hand-verified against :public_key. Forged footprints don't make it past the perimeter.
Footprints hit the timeline — statuses upgrade, suppressions update themselves, and the Trail Log moves. No queue, no polling, no séance.
// Actual footage — not an artist's rendering
Sixty years of blurry evidence, and then this: the Trail Log, captured in the wild, every pixel sharp. Sightings on the left, delivery stats up top, the whole forest accounted for.
Exhibit 001 — unretouched

// Know your local wildlife
Amazon SES hands you a message ID and wishes you luck. Hosted wrappers keep your evidence on their servers. There is a third path through the trees.
| Capability | Raw SES | Hosted wrapper | SquatchMail |
|---|---|---|---|
| Send observability | A message ID and silence | Yes, on their servers | Yes, in your Postgres — zero code changes |
| Bounce & complaint handling | Wire up SNS yourself | Built in | Built in, signatures hand-verified |
| Suppression list | Build and enforce it yourself | Built in | Built in, bounce-type-aware expiry + optional send blocking |
| Where your data lives | Nowhere — SES keeps no timeline | Their database, their retention | Your database, your schema, your rules |
| Setup | The AWS console, by hand, in the rain | API key + their SDK | mix igniter.install squatch_mail |
| Extra infrastructure | None (but also none of the above) | A vendor dependency | None. It's a library, not a lodge fee. |
// Speak fluent cryptid
The code underneath is boring on purpose — Email,EmailEvent,Suppression. The bigfoot is a costume the UI wears, not a religion the codebase practices.
// Two ways into the woods
Elixir 1.15+, Ecto 3.13+, Phoenix LiveView 1.0+, PostgreSQL. If your Phoenix app already talks to SES, SquatchMail is mostly just…there — the way a footprint is there whether or not you were looking for it.
# one command. the installer does the rest:
# dep, config, migration, route, raw-body reader.
mix igniter.install squatch_mail
# then run the migration and go look at your woods
mix ecto.migrate
mix phx.server # → http://localhost:4000/squatch
Full trail map — including the one endpoint tweak the installer can't always do for you — in the installation guide.

// The hide-and-seek world champion, on your side for once
Open source, MIT licensed, and self-hosted — because the best proof is the kind that lives in your own database.