<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Le Tay · Journal</title><description>Field notes from shipping Rails SaaS with AI inside.</description><link>https://taywind.com/</link><language>en-US</language><item><title>Stripe billing in a Rails SaaS MVP: the minimum viable schema</title><link>https://taywind.com/en/blog/stripe-billing-in-a-rails-saas-mvp-the-minimum-viable-schema/</link><guid isPermaLink="true">https://taywind.com/en/blog/stripe-billing-in-a-rails-saas-mvp-the-minimum-viable-schema/</guid><description>Store Stripe IDs and mirrored status, never derive money locally — the moment you add a price_cents column, you&apos;re reconciling two ledgers that disagree.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>stripe</category><category>rails</category><category>saas billing</category><category>subscriptions</category><category>mvp</category></item><item><title>Solid Queue in Rails 8 production: ditching Redis on a one-box deploy</title><link>https://taywind.com/en/blog/solid-queue-in-rails-8-production-ditching-redis-on-a-one-box-deploy/</link><guid isPermaLink="true">https://taywind.com/en/blog/solid-queue-in-rails-8-production-ditching-redis-on-a-one-box-deploy/</guid><description>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.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><category>solid-queue</category><category>rails 8</category><category>background jobs</category><category>active job</category><category>sidekiq</category></item><item><title>Adding semantic search to a Rails app with pgvector in one weekend</title><link>https://taywind.com/en/blog/adding-semantic-search-to-a-rails-app-with-pgvector-in-one-weekend/</link><guid isPermaLink="true">https://taywind.com/en/blog/adding-semantic-search-to-a-rails-app-with-pgvector-in-one-weekend/</guid><description>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.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><category>rails</category><category>pgvector</category><category>semantic search</category><category>postgres</category><category>embeddings</category></item><item><title>LLM routing in Rails: OpenRouter with fallback chains and budget caps</title><link>https://taywind.com/en/blog/llm-routing-in-rails-openrouter-with-fallback-chains-and-budget-caps/</link><guid isPermaLink="true">https://taywind.com/en/blog/llm-routing-in-rails-openrouter-with-fallback-chains-and-budget-caps/</guid><description>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.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>rails</category><category>openrouter</category><category>llm</category><category>fallback</category><category>service objects</category></item><item><title>Zero-downtime Rails migrations: four moves that cover 90% of cases</title><link>https://taywind.com/en/blog/zero-downtime-rails-migrations-four-moves-that-cover-90-of-cases/</link><guid isPermaLink="true">https://taywind.com/en/blog/zero-downtime-rails-migrations-four-moves-that-cover-90-of-cases/</guid><description>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.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><category>rails</category><category>postgres</category><category>database migrations</category><category>zero-downtime</category><category>devops</category></item><item><title>Rails multi-tenancy patterns: row-scoping vs schema vs database per tenant</title><link>https://taywind.com/en/blog/rails-multi-tenancy-patterns-row-scoping-vs-schema-vs-database-per-tenant/</link><guid isPermaLink="true">https://taywind.com/en/blog/rails-multi-tenancy-patterns-row-scoping-vs-schema-vs-database-per-tenant/</guid><description>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.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><category>rails</category><category>multi-tenancy</category><category>postgres</category><category>architecture</category><category>saas</category></item><item><title>Kamal vs Fly.io vs Render: a solo Rails founder&apos;s rubric</title><link>https://taywind.com/en/blog/kamal-vs-fly-io-vs-render-a-solo-rails-founder-s-rubric/</link><guid isPermaLink="true">https://taywind.com/en/blog/kamal-vs-fly-io-vs-render-a-solo-rails-founder-s-rubric/</guid><description>Five-axis scorecard for picking between Kamal, Fly.io, and Render when you&apos;re the only engineer running a Rails app, a DB, and a worker.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>rails</category><category>deployment</category><category>kamal</category><category>fly.io</category><category>render</category></item><item><title>Devise vs Rodauth in 2026: picking auth for a new Rails app</title><link>https://taywind.com/en/blog/devise-vs-rodauth-in-2026-picking-auth-for-a-new-rails-app/</link><guid isPermaLink="true">https://taywind.com/en/blog/devise-vs-rodauth-in-2026-picking-auth-for-a-new-rails-app/</guid><description>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.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><category>rails</category><category>devise</category><category>rodauth</category><category>authentication</category><category>saas</category></item><item><title>Hotwire vs React for a B2B SaaS dashboard: a Rails engineer&apos;s rubric</title><link>https://taywind.com/en/blog/hotwire-vs-react-for-a-b2b-saas-dashboard-a-rails-engineer-s-rubric/</link><guid isPermaLink="true">https://taywind.com/en/blog/hotwire-vs-react-for-a-b2b-saas-dashboard-a-rails-engineer-s-rubric/</guid><description>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.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><category>hotwire</category><category>react</category><category>rails</category><category>b2b saas</category><category>architecture</category></item><item><title>Sidekiq vs Solid Queue in 2026: when to switch and when not to</title><link>https://taywind.com/en/blog/sidekiq-vs-solid-queue-in-2026-when-to-switch-and-when-not-to/</link><guid isPermaLink="true">https://taywind.com/en/blog/sidekiq-vs-solid-queue-in-2026-when-to-switch-and-when-not-to/</guid><description>A four-question rubric for choosing between Sidekiq and Solid Queue in Rails 8, with one falsifiable line on where the switch pays off.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><category>rails</category><category>sidekiq</category><category>solid queue</category><category>background jobs</category><category>redis</category></item><item><title>Fixed-price vs hourly software development: the MVP math nobody shows</title><link>https://taywind.com/en/blog/fixed-price-vs-hourly-software-development-the-mvp-math-nobody-shows/</link><guid isPermaLink="true">https://taywind.com/en/blog/fixed-price-vs-hourly-software-development-the-mvp-math-nobody-shows/</guid><description>Pricing model is a risk allocation choice, not a rate choice. Here&apos;s the variance rubric I run before quoting a SaaS MVP, with a worked example.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><category>pricing</category><category>saas mvp</category><category>contracting</category><category>scope</category><category>risk</category></item><item><title>A SaaS discovery call agenda that actually fits in 30 minutes</title><link>https://taywind.com/en/blog/a-saas-discovery-call-agenda-that-actually-fits-in-30-minutes/</link><guid isPermaLink="true">https://taywind.com/en/blog/a-saas-discovery-call-agenda-that-actually-fits-in-30-minutes/</guid><description>Seven blocks, three to five minutes each, that replace the consulting-firm script with the agenda I run on solo founder calls.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><category>discovery call</category><category>saas</category><category>consulting</category><category>solo engineer</category><category>sales</category></item><item><title>Atelier redesign and switching chat to Workers AI</title><link>https://taywind.com/en/blog/atelier-redesign-and-workers-ai/</link><guid isPermaLink="true">https://taywind.com/en/blog/atelier-redesign-and-workers-ai/</guid><description>Tossing the glass-blur AI-purple aesthetic for an editorial typographic system, and swapping the chat backend to Cloudflare Workers AI in an afternoon.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><category>design</category><category>ai</category><category>astro</category><category>cloudflare</category></item><item><title>Postgres RAG with pgvector: skip Pinecone, ship on one box</title><link>https://taywind.com/en/blog/postgres-rag-with-pgvector-skip-pinecone-ship-on-one-box/</link><guid isPermaLink="true">https://taywind.com/en/blog/postgres-rag-with-pgvector-skip-pinecone-ship-on-one-box/</guid><description>How a single-box Rails setup with pgvector and ruby_llm replaced a managed vector DB — 180 lines, 50k chunks, three pitfalls.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><category>pgvector</category><category>rag</category><category>postgres</category><category>ruby-llm</category><category>rails</category></item></channel></rss>