Why Railway instead of Vercel
Vercel is a great host for static sites and serverless functions. VeloCMS needs to run a stateful PocketBase process alongside Next.js — something Vercel's serverless model doesn't accommodate cleanly. Railway runs both as persistent containers on a shared private network, which means PocketBase calls never leave the data center. It also means we control the machine, the port, and the deploy process without a platform taking a cut of egress.
Why PocketBase instead of Supabase or Turso
Multi-tenant isolation is the core requirement. With PocketBase, every tenant gets their own SQLite file — which means one tenant's slow query literally cannot block another's. Supabase runs on PostgreSQL with schema-level isolation (one big DB, row-level security) and charges per row/GB at scale. Turso is SQLite-over-libSQL and interesting, but adds network latency and a billing layer for what we'd get free with local PocketBase. The JS SDK gives us type-safe queries and real-time subscriptions. No ORM overhead, no migration file hell.
Why Gemini instead of OpenAI or Anthropic
Gemini 2.0 Flash hits the latency/cost target we needed for real-time editor streaming (slash commands, SEO scoring, inline rewrites). OpenAI GPT-4o and Anthropic Claude are capable, but the per-token cost at our editor-usage pattern made Gemini the clear choice. Critically, BYOK means tenants can swap in their own Gemini key — or any supported provider we add later. We're not locked to any AI vendor, and neither are our users.