Review Ruby/Rails code like DHH would - direct, opinionated, allergic to over-engineering. Use when the user runs /dhh or asks for a DHH-style review of a diff, file, or recent changes.
Automate repetitive workflows and reduce manual effort
Example: Generate reports, summarize documents, draft communications
Save 3-5 hours per week on routine tasks
Learn new skills, understand complex topics, get expert guidance
Example: Explain concepts, provide examples, suggest learning resources
Accelerate learning and skill development by 2x
Enhance output quality through reviews, suggestions, and refinements
Example: Review drafts, suggest improvements, catch errors
Improve work quality by 30-40% with less effort
Time estimate: 15-45 minutes depending on use case complexity
Prerequisites
Submit your Claude Code skill and start earning
epx add marckohlbrugge/37signals-skills/dhhCompatible with
Supported agents
| name | dhh |
| description | Review Ruby/Rails code like DHH would - direct, opinionated, allergic to over-engineering. Use when the user runs /dhh or asks for a DHH-style review of a diff, file, or recent changes. |
| disable-model-invocation | true |
Review code the way DHH actually reviews PRs (voice and patterns calibrated against ~200 of his real review comments on basecamp/fizzy). Direct and opinionated, but conversational — a colleague who's seen it all, not a drill sergeant.
git diff if no scope was specified; fall back to git show HEAD if there's no diff).Output: Start with the biggest issue. Short paragraphs. End with "Ship it" if the code is good, or a prioritized list of fixes if not.
Match how DHH actually writes review comments:
markdown_associations as an explaining method." "Don't think this method is carrying its weight." "Feels like there's a bubble method here."order(:created_at)?" "Is this needed? Isn't the default queue :default?" "When does an event not have an action?"json.steps @card.steps, partial: "steps/step", as: :step" or a short fenced block of the boiled-down version.case beats metaprogramming and method_missing.Notifier::EventNotifier, not Notifier::Event). Positive over negative: "not_popped is pretty cumbersome... go with something like active." Consistent domain language — don't mix source/resource/container for one concept.resource :closure. No custom actions.Closure record gives you who, when, and joins/where.missing scoping.if credential = authenticate(...).! only when a non-bang counterpart exists.after_save_commit, pluck over map(&:name), delegate :user, to: :session (lazy loads too), touch: true, counter caches ("Should use AR counters"), params.expect, normalizes, StringInquirer predicates, delegated types (lean on their scopes/factories instead of redefining associations), events.create over events << Event.new.after_create_commit when no data integrity is at stake — keep transactions short (especially on SQLite).turbo_stream.update [ @card, :new_comment ], partial: "cards/comments/new", locals: { card: @card }.tag.meta name: "current-user-id", content: Current.user.id if Current.user. No inline JS blobs — boil down to a helper + meta tag.db:migrate from zero is the antipattern (use schema load).params.require(:x).permit(...) → params.expect(x: [...])thing.status == "completed" → StringInquirer/enum predicatevalidates :x, uniqueness: true → DB unique index.map(&:name) on a relation → .pluck(:name)Comment.find(params[:id]) → scope through user/tenant"#{user_input}".html_safe → escape first with hAI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versiondhhExecute the skills CLI command in your project's root directory to begin installation:
epx add marckohlbrugge/37signals-skills/dhhFetches dhh from marckohlbrugge/37signals-skills and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
.cursor/skills/dhh
Restart Cursor to activate dhh. Access via /dhhin your agent's command palette.
Learn more:View source on GitHubSkills CLI docsAbout CursorWhat are agent skills?
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ Use when
Use when skill capabilities match your task, clear ROI on time saved, and you can validate outputs. Best for repetitive tasks, learning, and quality improvement.
✗ Avoid when
Avoid when task requires deep expertise you can't validate, involves sensitive decisions, or when learning process is more valuable than speed of completion.
rails-best-practices-core
marckohlbrugge/37signals-skills · rails-best-practices-core · same repo
rails-migrations
marckohlbrugge/37signals-skills · rails-migrations · same repo
rails-jobs
marckohlbrugge/37signals-skills · rails-jobs · same repo
rails-webhooks
marckohlbrugge/37signals-skills · rails-webhooks · same repo
rails-security-multitenancy
marckohlbrugge/37signals-skills · rails-security-multitenancy · same repo
rails-testing
marckohlbrugge/37signals-skills · rails-testing · same repo
I recommend dhh for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
Registry listing for dhh matched our evaluation — installs cleanly and behaves as described in the markdown.
dhh fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
Solid pick for teams standardizing on skills: dhh is focused, and the summary matches what you get after install.
dhh fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
Keeps context tight: dhh is the kind of skill you can hand to a new teammate without a long onboarding doc.
dhh has been reliable in day-to-day use. Documentation quality is above average for community skills.
dhh reduced setup friction for our internal harness; good balance of opinion and flexibility.
Useful defaults in dhh — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
dhh is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
showing 1-10 of 57