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

0

Redis, Node runtimes, or queue services in production

1

command from your laptop to production

$6

a month runs the whole thing, on a box you own

1

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.

Browser or app

web · PWA · Hotwire Native iOS

HTTPS

one $6/mo VPS you own

Thruster

TLS · HTTP cache · asset compression

Rails 8.1

Phlex views · Hotwire · jobs · JSON API

PostgreSQL ×5

app · cache · queue · cable · events

outside the box:Cloudflare R2 — filesStripe — money

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.

RedisSolid Queue · Cache · Cable, on Postgres
SidekiqSolid Queue + Mission Control at /jobs
Node runtime in productionBun, at build time only
React + a JSON API for your own UIHotwire — the server sends HTML
ERB templatesPhlex — views are plain Ruby objects
S3 egress billsCloudflare R2 — zero egress fees
Heroku or KubernetesKamal 2 over SSH to your own box
A second codebase for mobileHotwire Native on the same screens

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

03

Rails 8.1 · Ruby 4.0

docs

One 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

docs

One 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

docs

Every 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

03

PostgreSQL ×5

docs

Five 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

docs

Jobs, 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

docs

Watch, 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

05

Phlex 2

docs

Views 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

docs

The 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

docs

Styles 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

docs

Bundles 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

docs

An 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

03

Kamal 2 · Docker

docs

One 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

docs

Sits 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

docs

S3-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

02

Stripe

docs

Checkout, 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

docs

Ship 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?

Heavy client stateCollaborative editors, canvases, offline-first apps — real local state wants React, not Turbo.
50k jobs a minute on day oneA Postgres-backed queue will need its own server. Swap the Solid Queue adapter for Sidekiq and move on.
You want EU VAT handledStripe isn't a merchant of record. Paddle or Lemon Squeezy will take that off your plate — for a cut.
You don't want to run a serverNobody else patches the kernel or watches the disk fill. If that's a dealbreaker, stay on a platform.

This stack, already wired.

Auth, billing, admin, jobs, deploys — running on exactly the topology above, with a doc for every piece.