How hotwired/turbo works
Turbo is a browser-side HTML-over-the-wire navigation library. Its main workflow intercepts eligible links and forms, fetches responses, then updates page/history state without a full reload; Frames scope that workflow to regions, while Streams apply server-supplied actions. The README also identifies Turbo Native as an adapter capability. The map follows documented responsibilities and sampled calls; some subsystem links are omitted where source excerpts do not establish exact wiring.
Main entry points: session.js Session · visit.js Visit · frame_controller.js Frame controller · fetch_request.js Fetch requests
Components 26
Turbo Drive
- Session
src/core/session.js - Link observers
src/observers/link_click_observer.js - Form observers
src/observers/form_submit_observer.js - Link prefetch
src/observers/link_prefetch_observer.js - Navigator
src/core/drive/navigator.js - Visit
src/core/drive/visit.js - Page view
src/core/drive/page_view.js - Page renderer
src/core/drive/page_renderer.js - Page snapshots
src/core/drive/page_snapshot.js - History
src/core/drive/history.js
Turbo Frames
- Frame element
src/elements/frame_element.js - Frame controller
src/core/frames/frame_controller.js - Frame view
src/core/frames/frame_view.js - Frame renderer
src/core/frames/frame_renderer.js
Turbo Streams
- Stream source
src/elements/stream_source_element.js - Stream element
src/elements/stream_element.js - Stream message
src/core/streams/stream_message.js - Stream renderer
src/core/streams/stream_message_renderer.js
Runtime Services
- Turbo entry
src/index.js - Fetch requests
src/http/fetch_request.js - Fetch response
src/http/fetch_response.js - Snapshot cache
src/core/drive/snapshot_cache.js - Browser adapter
src/core/native/browser_adapter.js
Other components
- Browser user
- HTML server
- Native app adapter
Connections 37
- Turbo entry → Session: starts
- Browser user → Link observers: clicks link
- Browser user → Form observers: submits form
- Session → Link observers: starts observer
- Session → Form observers: starts observer
- Session → Link prefetch: starts observer
- Link observers → Session: proposes visit
- Form observers → Session: submits navigation
- Session → Navigator: proposes visit
- Navigator → Visit: starts visit
- Visit → Fetch requests: issues request
- Fetch requests → HTML server: sends HTTP
- HTML server → Fetch response: returns HTML
- Fetch response → Visit: provides response
- Visit → Page view: renders snapshot
- Page view → Page renderer: renders page
- Page renderer → Page snapshots: uses snapshot
- Visit → History: updates history
- Page view → Snapshot cache: reads and writes
- Session → Browser adapter: coordinates visit
- Browser adapter → Native app adapter: registers adapter
- Link prefetch → Fetch requests: prefetches request
- Browser user → Frame element: interacts
- Turbo entry → Frame element: registers element
- Frame element → Frame controller: delegates behavior
- Frame controller → Fetch requests: fetches frame
- Fetch requests → Frame controller: returns response
- Frame controller → Frame view: renders frame
- Frame view → Frame renderer: uses renderer
- Frame controller → Session: proposes visit
- HTML server → Stream source: supplies stream
- Stream source → Session: connects source
- HTML server → Stream message: sends stream HTML
- Turbo entry → Stream element: registers element
- Stream element → Stream message: parses message
- Session → Stream renderer: renders message
- Stream renderer → Stream message: applies actions