16 dependencies · 0 you babysit at 3am
Boring on purpose. Argued for, every one.
No Redis. No Node in production. No queue service, no CDN vendor, no platform between you and the box. What's left is a stack one person can hold in their head — and an AI agent already knows by heart.
Last updated: July 24, 2026
Redis, Node runtimes, or queue services in production
command from your laptop to production
a month runs the whole thing, on a box you own
codebase for web, JSON API, and the iOS app
01 / The shape of it
How does one request flow, end to end?
This is the entire production topology. The interesting part is how little of it there is.
web · PWA · Hotwire Native iOS
one $6/mo VPS you own
TLS · HTTP cache · asset compression
Phlex views · Hotwire · jobs · JSON API
app · cache · queue · cable · events
That's the whole list.
02 / What's missing
Why no Redis, no Node, no queue service?
Every line below is a service you don't secure, monitor, back up, or pay for — and a category of outage that can't page you.
03 / The dependencies
Why these sixteen dependencies — and what did each cost?
Names link to the official docs — don't take this page's word for any of it.
Core
03Rails 8.1 · Ruby 4.0
docsOne app: web, JSON API, jobs, mail. Every question has a boring answer your agent already knows.
- instead of
- a Node backend, or a service per domain
- costs you
- slower per core than Go — a bill that arrives years later
dry-rb · app/core
docsOne entry point per use case, returning explicit success or failure. Features live in bounded contexts you can delete whole.
- instead of
- fat models and a folder of loose services
- costs you
- more files and ceremony for a three-line change
Rails Event Store
docsEvery state change is a replayable fact, browsable at /res. Disputes end with evidence, not log archaeology.
- instead of
- ActiveRecord callbacks and direct calls
- costs you
- one extra hop to the handler; the table only grows
Data & jobs
03PostgreSQL ×5
docsFive logical databases on one engine. Jobs and events never share a connection pool with your product data.
- instead of
- SQLite, MySQL, or one database for everything
- costs you
- five things to provision and back up, not one
Solid Queue · Cache · Cable
docsJobs, cache, and websockets on Postgres. A job enqueues inside the transaction that caused it — roll back and it's gone.
- instead of
- Redis with Sidekiq
- costs you
- needs tuning past tens of thousands of jobs a minute
Mission Control
docsWatch, retry, and discard jobs in the browser at /jobs. No log tailing to find a stuck email.
- instead of
- grepping production logs
- costs you
- one more engine to keep behind admin auth
Interface
05Phlex 2
docsViews are Ruby objects — unit-testable, refactorable with the same tools as everything else, and far cheaper in agent tokens than ERB.
- instead of
- ERB or ViewComponent templates
- costs you
- pasted HTML has to be translated first
Hotwire — Turbo + Stimulus
docsThe server sends HTML. No client router, no duplicate state model, no API that exists only to feed your own frontend.
- instead of
- React or Vue on a JSON API
- costs you
- canvas-grade interactivity needs a JS island
Tailwind 4
docsStyles sit next to the markup they apply to — which matters more than usual when your agent is editing the markup.
- instead of
- hand-written CSS that drifts
- costs you
- verbose markup, and a day to get used to it
Bun
docsBundles JavaScript at build time. The production image has no Node runtime at all — smaller container, narrower attack surface.
- instead of
- webpack or Vite
- costs you
- a younger ecosystem than Node's
Hotwire Native
docsAn iOS shell and an installable PWA over the screens you already built. App Store presence, one codebase.
- instead of
- a second app and a second team
- costs you
- truly native gestures still need Swift
Ship & run
03Kamal 2 · Docker
docsOne command from laptop to your server. Zero-downtime deploys and rollbacks included; no platform can reprice you.
- instead of
- Heroku, Render, or Kubernetes
- costs you
- you're the operator — the pager is yours
Thruster
docsSits in front of Puma and handles TLS, HTTP caching, and asset compression. No nginx config, no CDN contract.
- instead of
- nginx plus a CDN plan
- costs you
- one box means one region, until you add more
Cloudflare R2
docsS3-compatible uploads with zero egress fees, plus optional envelope encryption at rest. Dev and test stay on local disk.
- instead of
- Amazon S3 and its egress pricing
- costs you
- one more vendor whose outage becomes yours
Money & control
02Stripe
docsCheckout, portal, and webhooks that dedupe, dead-letter, and replay from admin. Prices are DB rows mirroring Stripe objects.
- instead of
- Paddle or Lemon Squeezy
- costs you
- not merchant of record — EU VAT is your problem
Flipper
docsShip features dark, flip them on from admin without a deploy, and switch off the template features you don't want.
- instead of
- long-lived branches and forks
- costs you
- a flag left on becomes a branch nobody remembers
04 / The honest part
When is this the wrong stack?
This stack, already wired.
Auth, billing, admin, jobs, deploys — running on exactly the topology above, with a doc for every piece.