[App Name] · Rails 8 + Hotwire
A Rails 8 app. Hotwire for interactivity (Turbo + Stimulus). Tailwind v4 for styling. SQLite for prod (yes, really, Rails 8 made it viable).
Source of truth
The deployed Kamal release is canonical. Code on GitHub. Database is SQLite with Litestream replicating to S3 for backup.
Tech stack
Ruby 3.4 + Rails 8.0 + Hotwire (Turbo + Stimulus) + Tailwind v4. SQLite for DB, queue (Solid Queue), and cache (Solid Cache). Active Storage for uploads (S3 or local). Devise for auth (still the boring choice). Kamal 2 for deployment.
Deploy
- Local:
bin/dev(runs Procfile.dev: server, Tailwind watch, jobs) - Production:
kamal deploy(build image, push, restart). Provision viakamal setup. - Database: SQLite file on persistent volume. Litestream sidecar for S3 replication.
File map
app/controllers/Rails controllersapp/models/ActiveRecord modelsapp/views/ERB templates (Turbo Frames + Turbo Streams)app/javascript/controllers/Stimulus controllersapp/javascript/application.jsStimulus + Turbo entrypointapp/jobs/background jobs (Solid Queue)db/schema.rb(auto-generated, don't hand-edit)config/deploy.ymlKamal configDockerfileRails-optimized
.env keys
RAILS_MASTER_KEY(also inconfig/master.key, NOT committed)S3_BUCKET,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY(Active Storage + Litestream)RESEND_API_KEY(or Postmark, SMTP, whatever)RAILS_ENVproduction
Hard rules
- ActiveRecord callbacks are forbidden for anything beyond trivial validation. Use service objects.
- Background jobs via Solid Queue. Never block a request on a slow third-party call.
- Hotwire first. Reach for a JS framework only when Turbo + Stimulus can't express it.
- Migrations go forward AND backward (
changemethod or explicitup/down). Tested withrails db:rollback. - Authorization (who can do what) via
punditoraction_policy. Never inline in controllers. bin/setupworks on a fresh clone. If a new dev can't go fromgit clonetobin/devin 5 minutes, it's broken.
Recent significant changes
- 2026-05-10: Scaffolded. Locked: Rails 8 omakase (Solid suite, no Redis), Hotwire over React (less code), Kamal over Heroku (cost), SQLite over Postgres for v0 (Rails 8 made this real).
Next session: start here
rails new myapp --database=sqlite3 --css=tailwind --javascript=esbuildif from scratch.- Set up Devise:
rails generate devise:install && rails generate devise User && rails db:migrate. - Generate first resource scaffold. Click through, including the Turbo Stream paths.
- Configure Kamal: edit
config/deploy.ymlwith your server IP. kamal setupto provision,kamal deployto ship.