From rails-agent-skills
Creates Stimulus controllers, configures Turbo Frames and Streams, and converts Rails views to Hotwire patterns for interactive real-time UIs with progressive enhancement.
npx claudepluginhub igmarin/rails-agent-skills --plugin rails-agent-skillsThis skill uses the workspace's default tool permissions.
Build modern Rails frontends with Hotwire using progressive enhancement.
Provides Ruby on Rails Hotwire best practices for Turbo Drive, Frames, Streams, Turbo 8 morphing, and Stimulus controllers. Use for writing, reviewing, refactoring interactive apps with navigation, real-time updates, error handling.
Implements Hotwire Turbo (Drive, Frames, Streams, Morph) and Stimulus controllers in Rails views for SPA-like interactivity, real-time updates, and progressive enhancement.
Implements Hotwire features with Turbo Drive, Turbo Frames, and Turbo Streams in Rails 8, covering morphing, broadcasts, lazy loading, and real-time updates.
Share bugs, ideas, or general feedback.
Build modern Rails frontends with Hotwire using progressive enhancement.
Files: SKILL.md · EXAMPLES.md · references/workflow.md
ALWAYS start with HTML-only, enhance with Hotwire progressively
NEVER use Turbo Frames for full page navigation
ALWAYS test without JavaScript first
turbo_frame_tag. Validate: load the page and confirm the <turbo-frame> element appears in the DOM with the correct id.text/vnd.turbo-stream.html or a full frame response; for ActionCable, verify the subscription appears in the Action Cable log before proceeding.application.getControllerForElementAndIdentifier(el, 'name') returns the controller instance in the browser console.rails test:system with a headless driver set to no_js) and confirm forms submit, links navigate, and data persists correctly without JS.See references/workflow.md for the full annotated workflow.
<%= turbo_frame_tag "post_#{@post.id}" do %>
<h1><%= @post.title %></h1>
<%= link_to "Edit", edit_post_path(@post) %>
<% end %>
<%= turbo_stream.append "posts", partial: "post", locals: { post: @post } %>
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["name"]
greet() { alert(`Hello ${this.nameTarget.value}!`) }
}
Register the controller in app/javascript/controllers/index.js:
import GreetController from "./greet_controller"
application.register("greet", GreetController)
See EXAMPLES.md for complete examples including:
broadcasts_to. See EXAMPLES.md.