Install any skill in seconds. Free to start, no credit card required.
Get Started Free →This skill should be used when writing Ruby and Rails code in DHH's distinctive 37signals style. It applies when writing Ruby code, Rails applications, creating models, controllers, or any Ruby file. Triggers on Ruby/Rails code generation, refactoring requests, code review, or when the user mentions DHH, 37signals, Basecamp, HEY, or Campfire style. Embodies REST purity, fat models, thin controllers, Current attributes, Hotwire patterns, and the "clarity over cleverness" philosophy.
.claude/skills/davekilleen-dhh-rails-style/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 14% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 83% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 68% | 0% |
<objective> Apply 37signals/DHH Rails conventions to Ruby and Rails code. This skill provides comprehensive domain expertise extracted from analyzing production 37signals codebases (Fizzy/Campfire) and DHH's code review patterns. </objective>
<essential_principles>
"The best code is the code you don't write. The second best is the code that's obviously correct."
Vanilla Rails is plenty:
What they deliberately avoid:
Development Philosophy:
</essential_principles>
<intake> What are you working on?
Specify a number or describe your task. </intake>
<routing>
| Response | Reference to Read | |----------|-------------------| | 1, controller | controllers.md | | 2, model | models.md | | 3, view, frontend, turbo, stimulus, css | frontend.md | | 4, architecture, routing, auth, job, cache | architecture.md | | 5, test, testing, minitest, fixture | testing.md | | 6, gem, dependency, library | gems.md | | 7, review | Read all references, then review code | | 8, general task | Read relevant references based on context |
After reading relevant references, apply patterns to the user's code. </routing>
<quick_reference>
Verbs: card.close, card.gild, board.publish (not set_style methods)
Predicates: card.closed?, card.golden? (derived from presence of related record)
Concerns: Adjectives describing capability (Closeable, Publishable, Watchable)
Controllers: Nouns matching resources (Cards::ClosuresController)
Scopes:
chronologically, reverse_chronologically, alphabetically, latestpreloaded (standard eager loading name)indexed_by, sorted_by (parameterized)active, unassigned (business terms, not SQL-ish)Instead of custom actions, create new resources:
POST /cards/:id/close → POST /cards/:id/closure
DELETE /cards/:id/close → DELETE /cards/:id/closure
POST /cards/:id/archive → POST /cards/:id/archivalruby# Symbol arrays with spaces inside brackets before_action :set_message, only: %i[ show edit update destroy ] # Private method indentation private def set_message @message = Message.find(params[:id]) end # Expression-less case for conditionals case when params[:before].present? messages.page_before(params[:before]) else messages.last_page end # Bang methods for fail-fast @message = Message.create!(params) # Ternaries for simple conditionals @room.direct? ? @room.users : @message.mentionees
State as Records:
rubyCard.joins(:closure) # closed cards Card.where.missing(:closure) # open cards
Current Attributes:
rubybelongs_to :creator, default: -> { Current.user }
Authorization on Models:
rubyclass User < ApplicationRecord def can_administer?(message) message.creator == self || admin? end end
</quick_reference>
<reference_index>
All detailed patterns in references/:
| File | Topics | |------|--------| | controllers.md | REST mapping, concerns, Turbo responses, API patterns, HTTP caching | | models.md | Concerns, state records, callbacks, scopes, POROs, authorization, broadcasting | | frontend.md | Turbo Streams, Stimulus controllers, CSS layers, OKLCH colors, partials | | architecture.md | Routing, authentication, jobs, Current attributes, caching, database patterns | | testing.md | Minitest, fixtures, unit/integration/system tests, testing patterns | | gems.md | What they use vs avoid, decision framework, Gemfile examples | </reference_index>
<success_criteria> Code follows DHH style when:
</success_criteria>
<credits> Based on The Unofficial 37signals/DHH Rails Style Guide by Marc Köhlbrugge, generated through deep analysis of 265 pull requests from the Fizzy codebase.
Important Disclaimers:
</credits>
Other measured skills in the registry, with their headline benchmark lift.