Agent skills and a reference guide that teach AI coding assistants to write Rails the 37signals way — extracted from Fizzy, Campfire, and 100+ of DHH's code reviews.
Unofficial. This is a community project based on 37signals' public code and discussions — not affiliated with or endorsed by 37signals.
Drop the skills into Claude Code or Cursor and your agent starts applying the same patterns 37signals uses: rich domain models over service objects, state as records, CRUD-everything routing, fixtures over factories, vanilla Rails over gems.
| Skill | What it covers | Invocation |
|---|---|---|
rails-best-practices-core |
Architecture, naming, modeling patterns, REST routing, authorization — the baseline for all Rails work | Automatic |
rails-hotwire-realtime |
Turbo Streams/Frames, morphing, Stimulus, ActionCable, presence, optimistic UI, web push | On demand |
rails-jobs |
Active Job design, _later/_now conventions, Solid Queue, recurring tasks, retry policy |
On demand |
rails-migrations |
Safe schema changes, staged rollouts, script backfills, multi-DB/multi-adapter setups | On demand |
rails-security-multitenancy |
Path-based tenancy, Identity→Session→User auth, scoped lookups, SSRF, CSRF, rate limiting | On demand |
rails-testing |
Minitest + fixtures, coverage budget, Turbo/broadcast assertions, multi-tenant test wiring | On demand |
rails-webhooks |
Outbox delivery, failure classification, delinquency circuit breakers, payload signing | On demand |
dhh |
Review code like DHH would — direct, opinionated, allergic to over-engineering | /dhh |
"On demand" skills are marked disable-model-invocation: true so they don't bloat every request — invoke them explicitly (e.g. as a slash command) or let the core skill point to them.
Copy the skills you want into your personal or project skills directory:
git clone https://github.com/marckohlbrugge/37signals-skills.git
# Personal (all projects)
cp -R 37signals-skills/skills/* ~/.claude/skills/
# Or per-project
cp -R 37signals-skills/skills/* your-app/.claude/skills/Then ask for a review with /dhh, or just write Rails code — the core skill activates automatically.
# Per-project
cp -R 37signals-skills/skills/* your-app/.cursor/skills/Copy the skills into your global Codex skills directory:
git clone https://github.com/marckohlbrugge/37signals-skills.git
mkdir -p ~/.agents/skills
cp -R 37signals-skills/skills/* ~/.agents/skills/Codex can invoke skills explicitly with $skill-name (for example, $dhh) or automatically when a task matches the skill description. Restart Codex if the new skills do not appear.
Each skill is a plain SKILL.md with YAML frontmatter (Agent Skills format). Most SKILL.md-compatible tools can load them as-is, or paste the contents into your system prompt / rules file.
Clone the repo somewhere permanent and symlink instead of copying:
ln -s "$(pwd)/37signals-skills/skills/"* ~/.claude/skills/For Codex:
mkdir -p ~/.agents/skills
ln -s "$(pwd)/37signals-skills/skills/"* ~/.agents/skills/Then git pull to get updates.
The skills are distilled from a longer-form reference covering ~35 topics, kept in guide/. It was extracted from analyzing 265 pull requests in 37signals' Fizzy codebase — not just the final code, but the reviews, trade-offs, and iterations that led to it.
Core Rails: Routing · Controllers · Models · Views
Frontend: Hotwire · Stimulus · CSS · Accessibility · Mobile
Backend: Authentication · Multi-Tenancy · Database · Background Jobs · Caching · Performance
Real-time & Communication: ActionCable · Notifications · Email
Features: Webhooks · Workflows · Watching · Filtering · AI/LLM Integration
Rails Components: Active Storage · Action Text
Infrastructure & Testing: Security Checklist · Testing · Configuration · Observability
Philosophy & People: Development Philosophy · What They Avoid · DHH · Jason Zimdars · Jorge Manrubia
- Rich domain models over service objects
- CRUD controllers over custom actions
- Concerns for horizontal code sharing
- Records as state over boolean columns
- Database-backed everything (no Redis)
- Build it yourself before reaching for gems
- Ship to learn - prototype quality is valid
- Vanilla Rails is plenty - maximize what Rails gives you
LLM-Generated Content: This guide and these skills were largely produced by an LLM (Claude) analyzing source code, PR descriptions, and code snippets. There may be hallucinations or inaccuracies. Take everything with a grain of salt and verify against actual implementations.
Code License: Code examples extracted from Fizzy are licensed under the O'Saasy License. Please review that license before using code snippets in your projects.
- 37signals for open-sourcing their codebases and giving the community a window into how they build software
- Rob Zolkos for his work identifying and cataloging the most educational PRs
- Claude Code for creating this guide through iterative deep-dive research sessions
- Fizzy Source Code - The official Fizzy repository with full git history
- Campfire Source Code - 37signals' open-source chat application, another reference implementation
- Fizzy's Pull Requests: Who Built What and How - Curated PR sequences organized by topic
- Fizzy JS Patterns - Drifting Ruby episode analyzing JavaScript patterns in Fizzy
- Read The Friendly Source Code - Beautiful Ruby code review covering architecture and security observations
- Writebook by ONCE - Code walkthrough of another 37signals open-source project
- On Writing Software Well - DHH's screencast series on software development practices
This is an unofficial project created by analyzing publicly available code and discussions. It is not affiliated with or endorsed by 37signals.
Code examples extracted from Fizzy are licensed under the O'Saasy License. All analysis, commentary, skills, and original content in this repo is licensed under MIT.