Skip to main content
§ VII Chronicle

Journal.

Field notes from shipping Rails SaaS with AI inside. Process, tradeoffs, lessons.

2026.

Vol. 02
31 MAY

Stripe 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
30 MAY

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
28 MAY

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
27 MAY

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
25 MAY

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
23 MAY

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
22 MAY

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
21 MAY

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
20 MAY

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
19 MAY

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
18 MAY

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
17 MAY

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
16 MAY

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
16 MAY

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