Buttondown
Newsletters on Django, Heroku, and one Stripe engineer’s nights
Justin Duke built Buttondown while working at Stripe — a minimalist newsletter tool on Django and Postgres, hosted mostly on Heroku with Redis/RQ for email scheduling. ~45k lines of Django later, still one monolith, deliberately boring.
2016–2018
Side-project Django, marketing in the same repo
Duke wanted a newsletter tool that did not feel like a growth-hacked social network. Buttondown shipped as plain Django with marketing pages in the same codebase — a decision he later mildly regretted but never rewrote into microservices.
On the Running in Production podcast he described choosing boring tech so he could iterate after hours without learning a new framework per quarter.
Lesson
Monoliths are a feature when you are one person with a day job. Context switches kill more startups than Heroku dynos.
2018–2021
100k+ emails, RQ crons, ~12 dynos
Growth meant scheduling and deliverability, not re-architecture. Duke built django-rq-cron after Heroku’s scheduler missed windows — sensitive crons now run inside the same RQ workers that send mail.
He split logic into ~8 Django apps (`emails` sun, `api`, `monetization`, etc.) but kept one deployable unit on Heroku with roughly a dozen dynos — enough headroom without hiring a platform team.
Lesson
Fix scheduling with code you control before you fix it with another SaaS bill.
2022–today
Still Django-shaped, stack page honesty
Duke’s 2022 “how I organize Django apps” post is the receipts: 45k lines, checker framework for invariants, Stripe Connect mirrored in Postgres for speed — still not Kubernetes.
Buttondown’s public /stack page lists every dependency and what they removed (Heroku Redis → other providers → Postgres-backed caching experiments). That transparency is the anti-over-engineering flex.
Lesson
Document your stack like you document your API. Future-you is also a maintainer.
Sources
- Justin Duke — How I organize Buttondown’s Django applications (2022)
- Running in Production — Buttondown podcast (Heroku, RQ, scale)
- Buttondown — Announcing django-rq-cron
Facts drawn from public engineering posts and interviews. Numbers are approximate where sources disagree — we're stack advisors, not historians.
Get the right stack for YOUR scale — not theirs
Buttondown's stack made sense for Buttondown. Yours won't — and copying theirs is how you end up with a $4k/month bill and three unused Kubernetes clusters.
Plan my stack — free