Journal.
Field notes from shipping Rails SaaS with AI inside. Process, tradeoffs, lessons.
2026.
Vol. 02Stripe billing in a Rails SaaS MVP: the minimum viable schema
Store Stripe IDs and mirrored status, never derive money locally — the moment you add a price_cents column, you're reconciling two ledgers that disagree.
- #stripe
- #rails
- #saas billing
- #subscriptions
- #mvp
Solid Queue in Rails 8 production: ditching Redis on a one-box deploy
Rails 8 ships Solid Queue as the default job backend. My rubric for dropping Sidekiq and Redis on one box: one Postgres, one supervisor, FOR UPDATE SKIP LOCKED.
- #solid-queue
- #rails 8
- #background jobs
- #active job
- #sidekiq
Adding semantic search to a Rails app with pgvector in one weekend
Embeddings are just another column and the query is ORDER BY — no vector database, no SaaS. The chunking-and-dimensions decision that eats your Saturday if you skip it.
- #rails
- #pgvector
- #semantic search
- #postgres
- #embeddings
LLM routing in Rails: OpenRouter with fallback chains and budget caps
Route LLM calls through OpenRouter with an ordered fallback chain and a spend gate — a service object and config file, no gem, with a tier-by-tier ordering rubric.
- #rails
- #openrouter
- #llm
- #fallback
- #service objects
Zero-downtime Rails migrations: four moves that cover 90% of cases
A locking-aware rubric for safe Rails schema changes, down to why ADD COLUMN with a constant default stopped rewriting the table in Postgres 11.
- #rails
- #postgres
- #database migrations
- #zero-downtime
- #devops
Rails multi-tenancy patterns: row-scoping vs schema vs database per tenant
A rubric for picking row-scoped, schema-per-tenant, or database-per-tenant in Rails — and what each pattern costs you when a query forgets the fence.
- #rails
- #multi-tenancy
- #postgres
- #architecture
- #saas
Kamal vs Fly.io vs Render: a solo Rails founder's rubric
Five-axis scorecard for picking between Kamal, Fly.io, and Render when you're the only engineer running a Rails app, a DB, and a worker.
- #rails
- #deployment
- #kamal
- #fly.io
- #render
Devise vs Rodauth in 2026: picking auth for a new Rails app
A five-axis rubric for choosing between Devise and Rodauth on a green-field Rails 8 SaaS — with the trade-offs you inherit on day 400.
- #rails
- #devise
- #rodauth
- #authentication
- #saas
Hotwire vs React for a B2B SaaS dashboard: a Rails engineer's rubric
Five questions I score before picking Hotwire or a React SPA on a Rails API for a B2B SaaS dashboard — and the failure modes each one hides.
- #hotwire
- #react
- #rails
- #b2b saas
- #architecture
Sidekiq vs Solid Queue in 2026: when to switch and when not to
A four-question rubric for choosing between Sidekiq and Solid Queue in Rails 8, with one falsifiable line on where the switch pays off.
- #rails
- #sidekiq
- #solid queue
- #background jobs
- #redis
Fixed-price vs hourly software development: the MVP math nobody shows
Pricing model is a risk allocation choice, not a rate choice. Here's the variance rubric I run before quoting a SaaS MVP, with a worked example.
- #pricing
- #saas mvp
- #contracting
- #scope
- #risk
A SaaS discovery call agenda that actually fits in 30 minutes
Seven blocks, three to five minutes each, that replace the consulting-firm script with the agenda I run on solo founder calls.
- #discovery call
- #saas
- #consulting
- #solo engineer
- #sales
Atelier redesign and switching chat to Workers AI
Tossing the glass-blur AI-purple aesthetic for an editorial typographic system, and swapping the chat backend to Cloudflare Workers AI in an afternoon.
- #design
- #ai
- #astro
- #cloudflare
Postgres RAG with pgvector: skip Pinecone, ship on one box
How a single-box Rails setup with pgvector and ruby_llm replaced a managed vector DB — 180 lines, 50k chunks, three pitfalls.
- #pgvector
- #rag
- #postgres
- #ruby-llm
- #rails