New releases

Hotwire Club tooling is now open-source

Explore the agentic skills pack and the MCP server for building assistant workflows.

Blog

Turbo Frames - Error Boundaries
Julian Rubisch
Julian Rubisch

Build a reusable Stimulus controller that catches Turbo Frame failures and shows elegant error states with retry - inspired by React's Error Boundaries.

Turbo Streams - Custom Stream Actions - pushState
Julian Rubisch
Julian Rubisch

Synchronize browser history with Turbo Stream responses using a custom push_state action, a Stimulus controller, and the popstate event.

Turbo Frames - Chained Selects
Julian Rubisch
Julian Rubisch

Build dependent dropdown menus that update dynamically using Turbo Frames and a small Stimulus controller.

Turbo Frames - Form Submission Loading States
Julian Rubisch
Julian Rubisch

Add loading feedback to form submissions inside Turbo Frames using busy attributes and data-turbo-submits-with.

Turbo Frames - Using External Forms
Julian Rubisch
Julian Rubisch

Refer to external forms from within a Turbo Frame

Turbo Frames - Loading Spinner
Julian Rubisch
Julian Rubisch

Display a loading spinner while a Turbo Frame is `busy` fetching content asynchronously

Stimulus - Web Share API
Julian Rubisch
Julian Rubisch

Use the native browser web sharing capabilities from Stimulus

Turbo Frames - Typeahead Validation
Julian Rubisch
Julian Rubisch

Use "preflight" requests to validate a form before submitting it

Turbo Streams - List Animations Using the View Transitions API
Julian Rubisch
Julian Rubisch

Create list animations using Turbo Streams and the View Transitions API

Turbo Frames - Swiper with Autoplay and View Transitions
Julian Rubisch
Julian Rubisch

Create an autoplaying swiper using view transitions and Turbo Frames

Faceted Search with Stimulus and Turbo Frames
Julian Rubisch
Julian Rubisch

Harness the power of Stimulus and Turbo Frames to drive a simple but powerful faceted search solution

Turbo Drive - Swiper-like View Transitions
Julian Rubisch
Julian Rubisch

Use the View Transitions API to drive powerful native-like animations

Stimulus - Video Progress Tracker with LocalStorage
Julian Rubisch
Julian Rubisch

Store ephemeral user state like video playback progress in localStorage

Turbo Frames - Markdown Preview
Julian Rubisch
Julian Rubisch

Typeahead previews of markdown by simple Turbo Frame rerendering

Stimulus - Image Upload Previews with `URL.createObjectURL`
Julian Rubisch
Julian Rubisch

Create client-side previews of files using URL.createObjectURL

Turbo Frames - Render Flash Messages Upon Form Submission
Julian Rubisch
Julian Rubisch

Intercept form submission responses to render flash messages that are outside the originating Turbo Frame

Turbo Drive - Use ULIDs for Optimistic UI
Julian Rubisch
Julian Rubisch

Render deterministic optimistic UI elements using client-side ULIDs

Stimulus - Removing Markers from a Wavesurfer Element
Julian Rubisch
Julian Rubisch

Use Stimulus value callbacks to interact with a wavesurfer element and remove markers.

Stimulus - Adding Markers to a Wavesurfer Element
Julian Rubisch
Julian Rubisch

Use Stimulus value callbacks to interact with a wavesurfer element and add markers.

Frontend Fundamentals - Improve Core Web Vitals with Lazy Loading
Julian Rubisch
Julian Rubisch

Smartly use image lazy loading to improve core web vitals such as LCP and CLS

Stimulus - Picture in Picture API
Julian Rubisch
Julian Rubisch

Use an IntersectionObserver to trigger a Picture in Picture overlay

Turbo Frames - Modals with Validation
Julian Rubisch
Julian Rubisch

Handle modal dialogs with Turbo Frames and minimal additional JavaScript

Stimulus - Orchestrate Complex UI Changes with Target Callbacks
Julian Rubisch
Julian Rubisch

Use Stimulus target callbacks to dynamically update parts of your UI

Stimulus - Progressive Image Loading with Blurhash
Julian Rubisch
Julian Rubisch

Improve Largest Contentful Paint using image blurhashes and Stimulus

Scrolling Lyrics using Turbo Frames
Julian Rubisch
Julian Rubisch

Create a "scrolling lyrics" animation using Turbo Frames and View Transitions

Optimistic UI with Turbo 8 Morphs
Julian Rubisch
Julian Rubisch

Provide Optimistic UI updates using inline Turbo Stream Actions, and reconcile using Turbo 8 Morphs

Hotwire Combobox with Real Time Data
Julian Rubisch
Julian Rubisch

Update combobox options using Websockets and Stimulus outlets

Turbo Frames - Inline Edit
Julian Rubisch
Julian Rubisch

Manage Inline Editing with Turbo Frames and Cookies

Turbo Drive - Conditional InstantClick
Julian Rubisch
Julian Rubisch

Conditionally opt out of Turbo Drive InstantClick using the Strategy pattern

Turbo Streams - Custom Stream Actions - LocalStorage
Julian Rubisch
Julian Rubisch

Store ephemeral state changes locally using localStorage and custom Turbo Stream Actions.

Stimulus - Action Parameters
Julian Rubisch
Julian Rubisch

Use declaratively specified action parameters in the DOM to move elements between parents.

Stimulus - Outlets API
Julian Rubisch
Julian Rubisch

Signal data changes across controller boundaries using the Stimulus Outlets API.

Stimulus - Auto-Sorting
Julian Rubisch
Julian Rubisch

Use a MutationObserver to sort websocket messages that arrived out of order.

Stimulus - Inter-Tab Communication
Julian Rubisch
Julian Rubisch

Manage inter-browser communication using Stimulus and the Broadcast Channel API 📡.

Turbo Frames - Typeahead Search
Julian Rubisch
Julian Rubisch

Update filter results using eager loading Turbo Frames.

Stimulus - KeyboardEvent 101
Julian Rubisch
Julian Rubisch

Use Stimulus' built in KeyboardEvent functionality to handle basic hotkeys.

Turbo Streams - Custom Stream Actions - Video Playlist Management
Julian Rubisch
Julian Rubisch

Managing a video playlist using custom Turbo Stream Actions.

Turbo Frames - Lifecycle of a Lazy Loaded Frame
Julian Rubisch
Julian Rubisch

Manage view state with Turbo Frames and Stimulus.

Turbo Frames - Scroll Position Restoration
Julian Rubisch
Julian Rubisch

Preserve and restore scroll position from sessionStorage.

Stimulus - Value Changed Callbacks
Julian Rubisch
Julian Rubisch

Reactively update a chart.js graph using Stimulus values.

Turbo Streams - Custom Stream Actions
Julian Rubisch
Julian Rubisch

Use custom Turbo Stream actions to orchestrate complex UI animations.

Turbo Streams - Inline Stream Tags
Julian Rubisch
Julian Rubisch

Provide optimistic UI updates using inline Turbo Stream tags.

Turbo Drive - Re-Use the Turbo Progress Bar
Julian Rubisch
Julian Rubisch

Update the progress bar according to some background process' progress.

Turbo Frames - Pagination
Julian Rubisch
Julian Rubisch

Use the Turbo Frame lifecycle to manage fetch requests and the browser history.

Turbo Frames - Tabbed Navigation
Julian Rubisch
Julian Rubisch

Drive tabbed navigation using Turbo Frames.

Turbo Drive - Form Activity Indicators
Julian Rubisch
Julian Rubisch

Provide user feedback for slow running form submits.

Turbo Drive - Cache Lifecycle
Julian Rubisch
Julian Rubisch

Tweak Turbo Drive's cache lifecycle to improve user experience when navigating.

Turbo Drive - Custom Rendering
Julian Rubisch
Julian Rubisch

Completely customize Turbo Drive's rendering process.

Turbo Drive - Render Interception
Julian Rubisch
Julian Rubisch

Spice up Turbo Drive transitions using rendering interception.

Cookies
essential