Mailpit
The dev mail catcher - every test email from every app in your project, in one searchable UI, for $5/month.
One-click deploy, from $5/mo on a Miget plan.
Every stack sends email eventually - signups, resets, invoices - and testing it against real inboxes is how staging secrets leak and customers get confused. Mailpit is the modern answer (MailHog stopped updating in 2020): an SMTP sink that catches everything, with a fast UI for search, HTML preview, and link checking.
The project-network deployment is the killer version of it: every app in your Miget project points its SMTP settings at mailpit:1025 - Ghost, Chatwoot, Keycloak, Typebot, anything - and all their mail lands in one authenticated UI. No per-inbox setup, no third party seeing your test data.
One tiny Go container, one variable, $5/month. Hosted email-testing sandboxes charge ~$14/month for 500 test emails; Mailpit keeps your last 5,000 with no meter.
Upstream project: Mailpit
#what you get
- Catches all SMTP from the project network (mailpit:1025)
- Web UI: search, HTML/source preview, link checking, API
- Basic-auth protected UI; messages persist on the volume
- MIT, actively maintained - the de-facto MailHog successor
- Zero configuration beyond one auth variable
- The cheapest genuinely useful template in the catalogue
#topology
| Service | Role | Public |
|---|---|---|
| mailpit | web UI (:5000 public) + SMTP sink (:1025 project-internal) | UI only |
#miget sizing
// this stack needs
256 MiB RAM · 1 GB disk · 1 service
A single Go binary that idles around 30 MB - 256 MiB is generous. The 5,000-message cap keeps the volume tiny.
Hobby - recommended fit
$5/mo
1 vCPU · 512 MiB · 10 GiB disk
Headroom for your own apps: 1 GiB at $7/mo
Professional - production
$22/mo
1 vCPU · 2 GiB · 10 GiB disk
Dedicated resources, production SLOs - plan details
One Miget plan is a fixed pool of compute - the whole stack (managed databases included) deploys inside it, and anything left over runs your other apps. No per-service or per-seat math.
#vs. the managed service
What the hosted equivalents charge, against the flat Miget plan this stack fits on. Prices as of June 2026, sources linked.
| Service | Plan | Monthly | What you get |
|---|---|---|---|
| Mailpit on Miget ★ | 512 MiB plan | $5 | this whole stack, flat - no usage meters, and room left for your own apps |
| Mailtrap | Testing Basic | ~$14 | ~500 test emails/mo in the sandbox product - the exact job Mailpit does unmetered |
#vs. other PaaS
Estimated monthly cost of running this exact stack (256 MiB RAM, 1 GB disk, 1 container) elsewhere, from published June 2026 rates.
| Platform | Est. monthly | Notes |
|---|---|---|
| Miget ★ | $5 flat | compose stacks first-class: one deploy, dedicated vCPU, managed Postgres/Valkey, volumes and TLS all included in the plan |
| Heroku | ~$13 | no volumes; nothing between 1 GB ($50) and 2.5 GB ($250) dynos - 2 GB containers cost far more than shown |
| DO App Platform | ~$10 | no persistent volumes - stateful containers need managed DBs/Spaces (base $5 Spaces included here) |
| Render | ~$7 | per-service instances (0.5 GB $7, 2 GB $25) - every container is its own paid service |
| Railway | ~$3 | usage-based ($10/GB RAM-mo); vCPU billed separately at $20/vCPU-mo on top |
| Fly.io | ~$2 | cheapest sticker price - but burstable shared CPUs (1/16 core; dedicated vCPUs cost ~2-3×), no compose deploys (one app per container, manual wiring), managed DBs billed extra |
Estimates assume RAM fully allocated at published on-demand rates - and sticker price isn't the whole comparison: the cheaper rows buy burstable shared CPUs, per-service wiring instead of a compose deploy, and managed databases billed separately. Heroku and DO App Platform have no persistent volumes at all - stateful stacks like this one need workarounds there.
#deploy it
On Miget
- Create a Compose Stack in app.miget.com pointing at the templates repository
- Set the stack path to
mailpit -
Set the required variable:
MP_UI_AUTH, user:password for the web UI
- Deploy. Miget layers
compose.miget.yaml(RAM, privacy, volumes, managed services) automatically
Locally first?
Every template is portable, vanilla Docker Compose - the Miget overrides are ignored locally:
git clone https://github.com/deployable-sh/stacks
cd miget-compose-templates/mailpit
docker compose up -d Same files, same behavior. The template README covers connection strings and scaling notes.
#faq
How is this different from Mailtrap?
Same job - catch test email before it reaches humans - without the meter: Mailtrap’s testing plans start around $14/month for 500 test emails. Mailpit on the $5 plan keeps 5,000 with full search, and your message contents never leave your project.
How do apps send to it?
Set SMTP host mailpit, port 1025, no auth, no TLS - the project network is the boundary, and the SMTP port has no public route. Every template in this catalogue with SMTP settings works against it unchanged.
Is this for production email?
No - deliberately. Mailpit catches mail; it never delivers it. For real sending, configure a relay (SES, Resend, Postmark) in your apps, and use the listmonk template when the job is newsletters.
Ship Mailpit today
One compose stack, 256 MiB of RAM, from $5/month flat, and it runs on your laptop with the same files.