8 skills · web · iOS · Android · Rails 8 · Turbo 8
The hard parts of Hotwire, handled.
A Claude Code skillset for building interactive, server-driven Rails apps with Turbo, Stimulus, and Hotwire Native — one codebase, shipped to web, iOS, and Android.
claude · turbo-streams-patterns
$ claude "live room messages — members only"
· skill: turbo-streams-patterns
· authorized channel + signed stream name
· broadcasts wired to dom_id targets
$ scripts/lint_turbo_streams.sh app/
✓ no unauthorized streams · wiring clean
0 findings · exit 0
The eight skills
Each is a SKILL.md + a code-grounded reference + templates + a runnable checker. Verified clean on real code and against a synthetic break.
- hotwire-native-bridge
- Strada-style bridge components across web + iOS + Android.
- generator (3 halves) · contract linter
- rails-8-upgrade
- Rails 7 → 8, and the intermittent LazyRouteSet route-test flake.
- pre-flight audit · flake detector + fix
- turbo-morphing
- Turbo 8 page refreshes /
broadcasts_refresheswithout losing browser state. - decision guide · morph-readiness checker
- turbo-frames-patterns
- Frames, outside-link/form drivers, lazy panels — no dead navigation or duplicate ids.
- patterns guide · dangling-target + dup-id linter
- hotwire-native-path-config
- Native screen presentation + nav wiring, with iOS↔Android drift detection.
- 1.x starter · schema/footgun validator
- rails-token-auth
- One auth across web + Action Cable + native — no gem.
- secure templates · 6-point security audit
- turbo-streams-patterns
- Live updates, custom actions, private broadcasts — without eavesdropping.
- authorized-channel templates · wiring linter
- stimulus-patterns
- Controllers that connect, don't leak after navigation, and stay registered.
- annotated templates · cleanup/registration linter
What the checkers catch
The failures that pass tests, render fine, and silently do the wrong thing.
- eavesdropping
- A channel that streams without authorizing — anyone can subscribe.
- dropped payload
- A bridge field silently lost between web and native.
- dangling frame
- A link targets a frame id nothing defines — navigation goes nowhere.
- duplicate ids
- A literal frame id in a collection partial.
- route-test flake
- The Rails 8 LazyRouteSet
draw_test_routesintermittent failure. - user enumeration
find_by+authenticateleaking which accounts exist.- leaky controllers
- A Stimulus
connect()with nodisconnect()cleanup. - global morph
- A layout-wide morph that resets stateful widgets.
- plaintext tokens
- Auth tokens stored unhashed, or a plain cookie.
Honest about limits: the checkers are heuristic text scans, not parsers — each says so in its output. A clean run is a gate, not a proof. Review custom logic.
Read the book first
The Rails and Hotwire Codex
These skills are a companion to — not a replacement for — the book. It teaches you to build Piazza, a neighbourhood-marketplace app, across web, iOS, and Android with Ruby on Rails and Hotwire: authentication from scratch, Turbo, Turbo Native, Stimulus, Action Cable, full-text search, and more. Everything here assumes you understand what the code does and why — the book is where that understanding comes from.
The book targets Rails 7.1; this toolkit carries the same app forward to Rails 8, Turbo 8, and Hotwire Native 1.x.
Install & use
As a Claude Code plugin
Add the marketplace, then install — the 8 skills register automatically.
/plugin marketplace add davidteren/hotwire-codex-skills /plugin install hotwire-codex-skills@hotwire-codex-skills-marketplace
Or symlink a single skill: ln -s "$PWD"/skills/<name> ~/.claude/skills/
As a standalone tool
The checkers run without Claude — point one at any Rails app. Exit non-zero on findings (CI-friendly).
skills/rails-token-auth/scripts/audit_token_auth.sh path/to/app skills/stimulus-patterns/scripts/lint_stimulus.sh path/to/app
Pure bash + ruby — nothing a Rails machine doesn't already have.
Acknowledgements
All credit for the underlying material goes to Ayush Newatia, author of The Rails and Hotwire Codex. The Piazza app, its architecture, and the cross-platform approach these skills encode are his work — this toolkit only distils and extends that into runnable, agent-usable form. Ayush kindly gave permission to publish it. If these skills are useful to you, the right thanks is to buy the book and read it.
This project is an independent, community effort. It is not an official product of the book or its author, and reuses none of the book's text or source code. The Piazza implementation repos are private out of respect for the author's copyright.