Teams, not tenants
Users belong to many teams with owner, admin and member roles. Every record belongs to a team, and every query starts from the team rather than from the model.
Rails 8 · PostgreSQL · Hotwire
Authentication, team multi-tenancy, per-seat Stripe billing, background jobs and a platform admin area — assembled once, so the next project starts at the interesting part.
Users belong to many teams with owner, admin and member roles. Every record belongs to a team, and every query starts from the team rather than from the model.
Per-seat Stripe subscriptions driven by signed, idempotent webhooks. A successful browser redirect is never mistaken for a successful payment.
Server-rendered views, Turbo for navigation, a handful of Stimulus controllers, and SASS. esbuild is there when a real npm package earns its place.