← Extractions

No-build Utopia: Modern User Experiences with Rails & Web Standards

Ryan Townsend's wroclove.rb 2026 talk argues Rails was right to embrace HTML-over-the-wire and that five emerging web-platform APIs — View Transitions, Speculation Rules, Compression Dictionaries, Invoker/Interest Invokers, and Declarative Partial Updates — let developers remove client-side JavaScript while getting app-like UX. He traces Rails' frontend history (RJS → Sprockets → Turbo Links → Webpacker 'dark years' → Import Maps / Hotwire / Prop Shaft), urges treating client JavaScript as a liability, and answers questions on migrating from React, Hotwire interop, and HTMX.

Model
claude-opus-4-7
Ingestion
616aaaa6
Input tokens
766,234
fresh
156,841
cached
547,602
cache write
61,791
Output tokens
20,045
Duration
328.6s
Roundtrips
12
Tool calls
29
Cost
$0.00
Nodes/edges extracted
32 / 61
Read set (nodes/edges)
182 / 4

Nodes (32)

update No-build Utopia: Modern User Experiences with Rails & Web Standards talk
attrs {"type" => "talk"} → {"date" => "2026-04-17", "type" => "talk"}
description Talk on no-build frontend with Rails. → Ryan Townsend's wroclove.rb 2026 talk arguing that 'Rails was right all along' about HTML-over-the-wire and that the ...
short_description Talk on no-build frontend with Rails. → Ryan Townsend's wroclove.rb 2026 talk on replacing client JavaScript with Rails + emerging web-platform APIs.
update Ryan Townsend person
attrs (empty) → {"role" => "Principal Product Manager", "employer" => "Cloudflare"}
description Ruby developer advocating modern UX with Rails and web standards. At wroclove.rb 2026 he gave a talk the day before E... → Ruby/web developer who built on Rails for two decades. Joined Cloudflare in March 2026 as Principal Product Manager r...
short_description Ruby developer; speaker on modern web performance and HTTP techniques. → Principal PM at Cloudflare on Web Analytics (RUM); speaker on web performance and no-build Rails.
create Cloudflare Web Analytics tool
kind (empty) → tool
name (empty) → Cloudflare Web Analytics
slug (empty) → cloudflare-web-analytics
attrs (empty) → {"category" => "service"}
description (empty) → Cloudflare's Real User Monitoring (RUM) / web analytics product. Available for free as a standalone product — does no...
short_description (empty) → Cloudflare's free Real User Monitoring product tracking core web vitals on real visitors.
create View Transitions API concept
kind (empty) → concept
name (empty) → View Transitions API
slug (empty) → view-transitions-api
attrs (empty) → {"category" => "pattern"}
description (empty) → Browser API providing animated transitions in two levels. Level 1 (same-document, SPA-style): one JavaScript call wra...
short_description (empty) → Declarative browser API for animated DOM/page transitions with minimal code.
create Speculation Rules API concept
kind (empty) → concept
name (empty) → Speculation Rules API
slug (empty) → speculation-rules-api
attrs (empty) → {"category" => "pattern"}
description (empty) → Declarative browser API specified as a JSON blob that tells the browser to prefetch HTML documents or fully prerender...
short_description (empty) → Declarative JSON API telling browsers to prefetch or prerender links.
create Prerender Until Script concept
kind (empty) → concept
name (empty) → Prerender Until Script
slug (empty) → prerender-until-script
attrs (empty) → {"category" => "pattern"}
description (empty) → In-progress Google extension to the Speculation Rules API. Starts a prerender but stops as soon as any script tag is ...
short_description (empty) → Google's middle-ground speculation mode that stops prerendering at the first script tag.
create Pjax tool
kind (empty) → tool
name (empty) → Pjax
slug (empty) → pjax
attrs (empty) → {"category" => "library"}
description (empty) → JavaScript library introduced by Chris Wanstrath (GitHub) in 2009. Intercepts link clicks, fetches the target page, a...
short_description (empty) → GitHub library by Chris Wanstrath that swapped page HTML on link click for SPA-like feel.
create Compression Dictionaries concept
kind (empty) → concept
name (empty) → Compression Dictionaries
slug (empty) → compression-dictionaries
attrs (empty) → {"category" => "pattern"}
description (empty) → New IETF RFC (approved around September 2025) that lets a client use a resource it has already downloaded as a Brotli...
short_description (empty) → HTTP-level compression scheme using a previously downloaded resource as a diff dictionary.
create Invoker Commands API concept
kind (empty) → concept
name (empty) → Invoker Commands API
slug (empty) → invoker-commands-api
attrs (empty) → {"category" => "pattern"}
description (empty) → Standardized by the Open UI group. Adds command and commandfor attributes to buttons so native behaviors (like openin...
short_description (empty) → HTML button command/commandfor attributes that trigger element actions without JS glue.
create Interest Invokers API concept
kind (empty) → concept
name (empty) → Interest Invokers API
slug (empty) → interest-invokers-api
attrs (empty) → {"category" => "pattern"}
description (empty) → Newer companion to Invoker Commands. Declarative HTML attributes that open popovers on desktop hover and mobile long-...
short_description (empty) → HTML attributes enabling native hover/long-press popovers without JavaScript.
create Declarative Partial Updates concept
kind (empty) → concept
name (empty) → Declarative Partial Updates
slug (empty) → declarative-partial-updates
attrs (empty) → {"category" => "pattern"}
description (empty) → Experimental browser API — essentially Hotwire streams baked into the web platform. Uses HTML template tags with star...
short_description (empty) → Experimental HTML template-tag API for streaming/replacing named DOM fragments.
create RJS concept
kind (empty) → concept
name (empty) → RJS
slug (empty) → rjs
attrs (empty) → {"category" => "pattern"}
description (empty) → Rails 1.11 (2006) feature enabling the server to return JavaScript executed by the browser in response to HTTP reques...
short_description (empty) → Rails 1.11 (2006) feature letting the server return JavaScript to manipulate the DOM.
create Sprockets tool
kind (empty) → tool
name (empty) → Sprockets
slug (empty) → sprockets
attrs (empty) → {"category" => "library"}
description (empty) → Ruby asset-pipeline library that became official in Rails 3.1 (2011-ish). Concatenates files for compression, minifie...
short_description (empty) → Rails asset pipeline gem for concatenating, minifying and fingerprinting assets.
create Prop Shaft tool
kind (empty) → tool
name (empty) → Prop Shaft
slug (empty) → prop-shaft
attrs (empty) → {"category" => "library"}
description (empty) → Minimal Rails asset-pipeline gem that replaced Sprockets once HTTP/2 and import maps removed the need for aggressive ...
short_description (empty) → Minimal Rails asset-pipeline replacement for Sprockets in the HTTP/2 / import-maps era.
create Turbo Links tool
kind (empty) → tool
name (empty) → Turbo Links
slug (empty) → turbo-links
attrs (empty) → {"category" => "library"}
description (empty) → Rails-official library (introduced in Rails 3.2, default in Rails 4) that intercepted link clicks, downloaded the new...
short_description (empty) → Rails predecessor to Turbo Drive that swapped page HTML on link clicks.
create Import Maps tool
kind (empty) → tool
name (empty) → Import Maps
slug (empty) → import-maps
attrs (empty) → {"category" => "library"}
description (empty) → Browser-native mechanism that maps module specifiers to URLs so ES modules can be imported without a bundler. Integra...
short_description (empty) → Browser-native mechanism for ES-module URL resolution; core of Rails 7 no-build frontend.
create CoffeeScript tool
kind (empty) → tool
name (empty) → CoffeeScript
slug (empty) → coffeescript
attrs (empty) → {"category" => "language"}
description (empty) → Compile-to-JavaScript language that was part of the Rails asset pipeline during the Sprockets era (2009+). Motivated ...
short_description (empty) → Deprecated compile-to-JavaScript language once bundled with Rails.
create Sass tool
kind (empty) → tool
name (empty) → Sass
slug (empty) → sass
attrs (empty) → {"category" => "language"}
description (empty) → CSS preprocessor that shipped with Rails during the Sprockets era. Provided nesting, variables and mixins before brow...
short_description (empty) → CSS preprocessor once bundled with Rails, largely superseded by native CSS features.
create Tim Kadlec person
kind (empty) → person
name (empty) → Tim Kadlec
slug (empty) → tim-kadlec
description (empty) → Web performance researcher and colleague of Ryan Townsend at Cloudflare. Measured a year-over-year JavaScript payload...
short_description (empty) → Web performance researcher and Ryan Townsend's colleague at Cloudflare.
create Loren Stewart person
kind (empty) → person
name (empty) → Loren Stewart
slug (empty) → loren-stewart
description (empty) → Author of a 2025 blog post arguing that the 'binary' framing of server-rendered HTML (for toys and personal blogs) vs...
short_description (empty) → Blogger who argued frontend complexity should be a gradient, not binary SSR vs SPA.
create Chris Wanstrath person
kind (empty) → person
name (empty) → Chris Wanstrath
slug (empty) → chris-wanstrath
description (empty) → GitHub co-founder. Introduced the Pjax JavaScript library in 2009, which intercepted link clicks and swapped page HTM...
short_description (empty) → GitHub co-founder who created the Pjax library.
create Wirth's Law concept
kind (empty) → concept
name (empty) → Wirth's Law
slug (empty) → wirth-s-law
attrs (empty) → {"category" => "principle"}
description (empty) → Adage going back to the 1990s stating that software gets slower faster than hardware gets faster — software expands t...
short_description (empty) → Software expands to consume available hardware performance faster than hardware improves.
create Resume Driven Development concept
kind (empty) → concept
name (empty) → Resume Driven Development
slug (empty) → resume-driven-development
attrs (empty) → {"category" => "pattern"}
description (empty) → Anti-pattern Ryan admits to having participated in during the 2010s 'dark years'. Teams adopted microservices, NoSQL,...
short_description (empty) → Anti-pattern of adopting fashionable tech stacks to build a career rather than solve a problem.
create Complexity Gradient concept
kind (empty) → concept
name (empty) → Complexity Gradient
slug (empty) → complexity-gradient
attrs (empty) → {"category" => "methodology"}
description (empty) → Loren Stewart's framing: rather than picking between the 'toy' low-complexity end of pure server-rendered HTML and th...
short_description (empty) → Frontend-architecture view that complexity should grow organically rather than start at the SPA end.
create Client-Side JavaScript as Liability takeaway
kind (empty) → takeaway
name (empty) → Client-Side JavaScript as Liability
slug (empty) → client-side-javascript-as-liability
attrs (empty) → {"type" => "recommendation"}
description (empty) → Ryan's closing message: see client-side JavaScript as a liability rather than an asset. Use as little as possible to ...
short_description (empty) → Treat client JS as a liability and use as little as possible to achieve what users need.
create Measure Client-Side Performance First takeaway
kind (empty) → takeaway
name (empty) → Measure Client-Side Performance First
slug (empty) → measure-client-side-performance-first
attrs (empty) → {"type" => "recommendation"}
description (empty) → From Q&A on migrating a 5-year-old Rails+React app. First step is measuring client-side performance — backend-focused...
short_description (empty) → Before migrating off an SPA, instrument real-user core web vitals to prove impact.
create Grow Frontend Complexity Organically takeaway
kind (empty) → takeaway
name (empty) → Grow Frontend Complexity Organically
slug (empty) → grow-frontend-complexity-organically
attrs (empty) → {"type" => "recommendation"}
description (empty) → Don't jump into a full SPA framework at project start. Begin with pure server-rendered HTML and a sprinkle of JavaScr...
short_description (empty) → Start at the top of the complexity stack and only add when required.
create Most SPAs See Only One Soft Navigation takeaway
kind (empty) → takeaway
name (empty) → Most SPAs See Only One Soft Navigation
slug (empty) → most-spas-see-only-one-soft-navigation
attrs (empty) → {"type" => "insight"}
description (empty) → Statistic Ryan cites: on average, a single-page app on the web gets only one soft navigation per visit (the click aft...
short_description (empty) → On average users make one soft navigation after landing; SPA weight rarely pays off.
create Rails leads JS frameworks on Core Web Vitals takeaway
kind (empty) → takeaway
name (empty) → Rails leads JS frameworks on Core Web Vitals
slug (empty) → rails-leads-js-frameworks-on-core-web-vitals
attrs (empty) → {"type" => "insight"}
description (empty) → Chart Ryan shows: across origins that pass all three Core Web Vitals thresholds (loading, visual stability, interacti...
short_description (empty) → Rails origins pass all three Core Web Vitals thresholds at higher rates than JS SPA frameworks.
create How to migrate a 5-year-old Rails+React app toward no-build? question
kind (empty) → question
name (empty) → How to migrate a 5-year-old Rails+React app toward no-build?
slug (empty) → how-to-migrate-a-5-year-old-rails-react-app-toward-no-build
attrs (empty) → {"answer_summary" => "Instrument RUM/Core Web Vitals first, correlate to business metrics, then iteratively remove th...
description (empty) → Audience asks how to get from a 5-year-old Rails application with React to the 'dreamy' no-build state Ryan described...
short_description (empty) → Q&A: migration path from an established SPA to the no-build world.
create Do you end up fighting Turbo when adopting these new APIs? question
kind (empty) → question
name (empty) → Do you end up fighting Turbo when adopting these new APIs?
slug (empty) → do-you-end-up-fighting-turbo-when-adopting-these-new-apis
attrs (empty) → {"answer_summary" => "Turbo rarely fights these APIs; measure first. Declarative Partial Updates could standardize Tu...
description (empty) → Audience asks whether using Hotwire, prefetching, and Turbo broadcasts on models forces you to fight Turbo when apply...
short_description (empty) → Q&A: interop between Hotwire/Turbo (including broadcasts) and the new web-platform APIs.
create What about HTMX? question
kind (empty) → question
name (empty) → What about HTMX?
slug (empty) → what-about-htmx
attrs (empty) → {"answer_summary" => "Ryan is a fan — HTMX is a lightweight, HTML-first utility library akin to jQuery, works well wi...
description (empty) → Audience asks about HTMX (initially misheard as 'XHTML'). Ryan is a big fan. Describes it as a lightweight utility li...
short_description (empty) → Q&A: Ryan's take on HTMX as a Hotwire alternative.

Edges (61)

update Ryan Townsend → authored → No-build Utopia: Modern User Experiences with Rails & Web Standards
context (empty) → Delivered this talk at wroclove.rb 2026.
update No-build Utopia: Modern User Experiences with Rails & Web Standards → presented_at → wroclove.rb 2026
context (empty) → Talk presented at the 2026 edition of wroclove.rb.
update Ryan Townsend → attended → wroclove.rb 2026
context Attended wroclove.rb 2026 and asked a question during Emiliano's Q&A. → Speaker and attendee at wroclove.rb 2026.
create Ryan Townsend → works_at → Cloudflare
attrs (empty) → {"role" => "Principal Product Manager", "since" => "2026-03"}
context (empty) → Joined Cloudflare in March 2026 as Principal Product Manager.
relation (empty) → works_at
source_node_id (empty) → e3b7fd5e-d68c-4961-a643-f0a2e4f9225a
target_node_id (empty) → a55e94b3-dde9-43f3-b42b-ba00b37f86a7
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Pjax
context (empty) → Chris Wanstrath's 2009 Pjax library cited as the direct inspiration for Turbo Links.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 70862fc3-bc9d-41b4-911e-62508f820d39
create Ryan Townsend → works_on → Cloudflare Web Analytics
attrs (empty) → {"role" => "Principal Product Manager"}
context (empty) → Principal PM responsible for Cloudflare's Real User Monitoring web analytics product.
relation (empty) → works_on
source_node_id (empty) → e3b7fd5e-d68c-4961-a643-f0a2e4f9225a
target_node_id (empty) → b869bef3-84d0-4904-babe-be87aec495e9
create Ryan Townsend → recommends → Cloudflare Web Analytics
context (empty) → Recommends it (free, standalone) as the first step when measuring client-side performance during an SPA migration.
relation (empty) → recommends
source_node_id (empty) → e3b7fd5e-d68c-4961-a643-f0a2e4f9225a
target_node_id (empty) → b869bef3-84d0-4904-babe-be87aec495e9
create Ryan Townsend → has_skill → Ruby on Rails
attrs (empty) → {"level" => "expert"}
context (empty) → Built on Rails for two decades.
relation (empty) → has_skill
source_node_id (empty) → e3b7fd5e-d68c-4961-a643-f0a2e4f9225a
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Ruby on Rails
context (empty) → Rails' frontend history and no-build direction are central to the talk.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Hotwire
context (empty) → Hotwire/Turbo/Stimulus presented as Rails' HTML-over-the-wire answer to SPAs.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → a0a8a415-bd9e-46ed-8ee3-8448312af347
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Turbo
context (empty) → Turbo discussed as replacement for Turbo Links and the future integration point with the new APIs.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 0071d9d0-23d6-4880-af20-5c3369e78423
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Stimulus
context (empty) → Ryan positions Stimulus as naturally matching Loren Stewart's level-four complexity in his gradient.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 87cb1332-bd03-4cc9-a0b1-c8c83aae8051
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → View Transitions API
context (empty) → First of five web-platform APIs presented in the talk.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 87c8cc09-4ff5-4932-9e43-3d61202fb400
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Speculation Rules API
context (empty) → Second of five APIs — prefetch/prerender for instant navigation.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 987eb5d3-dbe1-4188-8bd4-ed12ee88cbc6
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Compression Dictionaries
context (empty) → Third of five APIs — shrinks repeated text resources dramatically.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → dbf61945-d786-434f-a918-8cd11fa03c63
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Invoker Commands API
context (empty) → Fourth of five APIs — HTML-native button/dialog interactivity.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → c0e3f091-f889-4888-bc7b-44017a443c9f
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Interest Invokers API
context (empty) → Fourth of five APIs — declarative hover/long-press popovers.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 0c7d6dbc-9cf9-4466-908a-4809764dd03f
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Declarative Partial Updates
context (empty) → Fifth and most forward-looking of the five APIs — Hotwire-like fragment streaming as a browser primitive.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 74d4673d-d4a4-4866-970b-6881a42e0a04
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → RJS
context (empty) → Traced as the 2006 Rails 1.11 precursor to HTML-over-the-wire.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 4e9b9ff9-df3a-4744-b46f-3cafb86a5fe0
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Sprockets
context (empty) → Covered as the 2009/3.1-era Rails asset pipeline eventually replaced by Prop Shaft.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 723da847-88ca-4777-badc-dbca9ca2804a
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Prop Shaft
context (empty) → Named as the minimal Sprockets replacement in the Rails 7+ no-build stack.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 3db6c9c6-fe33-431f-bdc8-c7cec856f382
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Import Maps
context (empty) → Rails 7 import map integration is central to the no-build frontend story.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 86312e09-19ff-4489-971f-8777754710e2
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Turbo Links
context (empty) → History leg: Turbo Links shipped in Rails 3.2, became default in Rails 4, replaced by Turbo.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 40c73266-c3fc-42a2-87ad-3bb9c7f8a190
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Webpacker
context Described as the 'dark years' bridge that let Rails host React/Vue/Angular SPAs. → Criticized as the 'dark years' enabler of replicating the backend on the client.
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → CoffeeScript
context (empty) → Sprockets-era feature now deprecated as ES6+ absorbed its features.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 3b10b88f-3c2b-46d2-9ee2-6895bd4744a9
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Sass
context (empty) → Bundled with Rails in the Sprockets era; largely replaced by native CSS.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 14542f60-564b-4dd6-9b1c-e1334a070019
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Core Web Vitals
context (empty) → Rails' lead on Core Web Vitals origins motivates the 'Rails was right' thesis.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → c0060ee5-2d16-464e-8458-8cf8c4d67078
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Complexity Gradient
context (empty) → Loren Stewart's gradient model is cited as the right way to think about frontend complexity.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 083332ed-0782-44ba-ab65-f92fa2ce092a
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Resume Driven Development
context (empty) → Named as a root cause of the 2010s SPA/microservice/GraphQL wave Rails had to accommodate.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → c04f66af-4a10-449c-b84a-775844dd6f43
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → Wirth's Law
context (empty) → Used to explain why growing JavaScript payloads overwhelm hardware improvements.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 9998f647-4d08-4ab2-9124-cd2b413caafd
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → htmx
context (empty) → Discussed in Q&A as a Hotwire alternative Ryan likes.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 704680e3-3592-445c-b2b7-c6e2435d08a6
create No-build Utopia: Modern User Experiences with Rails & Web Standards → about → HTTP/2
context (empty) → HTTP/2 support motivated moving from concatenated Sprockets bundles to import maps.
relation (empty) → about
source_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
target_node_id (empty) → 09bad78e-f8a8-4348-a1ef-1dce44d689a5
create Prerender Until Script → related_to → Speculation Rules API
context (empty) → Middle-ground eagerness/action being added to Speculation Rules.
relation (empty) → related_to
source_node_id (empty) → d90935c2-4f7a-45fc-b0ab-9ab19590d45c
target_node_id (empty) → 987eb5d3-dbe1-4188-8bd4-ed12ee88cbc6
create Interest Invokers API → related_to → Invoker Commands API
context (empty) → Companion APIs from Open UI — commands on buttons, interest for hover/long-press.
relation (empty) → related_to
source_node_id (empty) → 0c7d6dbc-9cf9-4466-908a-4809764dd03f
target_node_id (empty) → c0e3f091-f889-4888-bc7b-44017a443c9f
create Declarative Partial Updates → related_to → Hotwire
context (empty) → Standardizes Hotwire's HTML-fragment-streaming model as a browser primitive.
relation (empty) → related_to
source_node_id (empty) → 74d4673d-d4a4-4866-970b-6881a42e0a04
target_node_id (empty) → a0a8a415-bd9e-46ed-8ee3-8448312af347
create Compression Dictionaries → related_to → HTTP Shared Dictionary Compression
context (empty) → Same underlying technique Ryan also raised in Emiliano's Q&A for JSON APIs.
relation (empty) → related_to
source_node_id (empty) → dbf61945-d786-434f-a918-8cd11fa03c63
target_node_id (empty) → 82606a69-79f9-4047-a82d-4bb3bec1778d
create Compression Dictionaries → uses → Brotli
context (empty) → Brotli (DCB encoding) is one of the compression algorithms that integrates with dictionaries.
relation (empty) → uses
source_node_id (empty) → dbf61945-d786-434f-a918-8cd11fa03c63
target_node_id (empty) → a02f5458-efb6-4935-9754-ad96a3c66aa4
create Turbo Links → related_to → Pjax
context (empty) → Turbo Links was Rails' official adoption of the Pjax pattern.
relation (empty) → related_to
source_node_id (empty) → 40c73266-c3fc-42a2-87ad-3bb9c7f8a190
target_node_id (empty) → 70862fc3-bc9d-41b4-911e-62508f820d39
create Prop Shaft → related_to → Sprockets
context (empty) → Prop Shaft replaced Sprockets in the Rails 7+ minimal asset pipeline.
relation (empty) → related_to
source_node_id (empty) → 3db6c9c6-fe33-431f-bdc8-c7cec856f382
target_node_id (empty) → 723da847-88ca-4777-badc-dbca9ca2804a
create Import Maps → related_to → HTTP/2
context (empty) → Import maps exploit HTTP/2's low per-file overhead to replace bundling/concatenation.
relation (empty) → related_to
source_node_id (empty) → 86312e09-19ff-4489-971f-8777754710e2
target_node_id (empty) → 09bad78e-f8a8-4348-a1ef-1dce44d689a5
create Chris Wanstrath → authored → Pjax
context (empty) → Created the Pjax library at GitHub in 2009.
relation (empty) → authored
source_node_id (empty) → 604ae09c-f3b8-4e5e-bfcb-7c0727bb46b9
target_node_id (empty) → 70862fc3-bc9d-41b4-911e-62508f820d39
create Chris Wanstrath → works_at → GitHub
context (empty) → Developed Pjax while at GitHub.
relation (empty) → works_at
source_node_id (empty) → 604ae09c-f3b8-4e5e-bfcb-7c0727bb46b9
target_node_id (empty) → 7b9aabd6-7e21-48b6-b87d-8c99d99c3b34
create Tim Kadlec → works_at → Cloudflare
context (empty) → Colleague of Ryan Townsend at Cloudflare who measured LLM-era JavaScript payload growth.
relation (empty) → works_at
source_node_id (empty) → 0a212458-c72e-47fb-82e6-460d84db0395
target_node_id (empty) → a55e94b3-dde9-43f3-b42b-ba00b37f86a7
create Client-Side JavaScript as Liability → from_talk → No-build Utopia: Modern User Experiences with Rails & Web Standards
context (empty) → Core closing message of the talk.
relation (empty) → from_talk
source_node_id (empty) → 614cc24c-cd76-4b51-808f-fa2ee4aa94cb
target_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
create Measure Client-Side Performance First → from_talk → No-build Utopia: Modern User Experiences with Rails & Web Standards
context (empty) → Ryan's first piece of advice in the migration Q&A.
relation (empty) → from_talk
source_node_id (empty) → a0b42532-b7ca-427f-8c59-fc06f753f14b
target_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
create Grow Frontend Complexity Organically → from_talk → No-build Utopia: Modern User Experiences with Rails & Web Standards
context (empty) → Summary of the Loren-Stewart-inspired gradient prescription.
relation (empty) → from_talk
source_node_id (empty) → 5175ee0d-c87c-4590-89e5-8a67b39e09f6
target_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
create Most SPAs See Only One Soft Navigation → from_talk → No-build Utopia: Modern User Experiences with Rails & Web Standards
context (empty) → Data point Ryan uses to undermine the SPA-for-snappy-nav argument.
relation (empty) → from_talk
source_node_id (empty) → 589abe15-b3ac-45b5-99e6-9e1e977f4670
target_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
create Rails leads JS frameworks on Core Web Vitals → from_talk → No-build Utopia: Modern User Experiences with Rails & Web Standards
context (empty) → Chart shown during the talk backing the 'Rails was right' thesis.
relation (empty) → from_talk
source_node_id (empty) → 9e048484-1783-4c8f-ba93-a9bce19d64b5
target_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
create Measure Client-Side Performance First → about → Cloudflare Web Analytics
context (empty) → The takeaway names Cloudflare Web Analytics as an example RUM product.
relation (empty) → about
source_node_id (empty) → a0b42532-b7ca-427f-8c59-fc06f753f14b
target_node_id (empty) → b869bef3-84d0-4904-babe-be87aec495e9
create Client-Side JavaScript as Liability → about → Ruby on Rails
context (empty) → Ties the prescription to Rails + the web platform being enough for 99.99% of apps.
relation (empty) → about
source_node_id (empty) → 614cc24c-cd76-4b51-808f-fa2ee4aa94cb
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Grow Frontend Complexity Organically → about → Complexity Gradient
context (empty) → The takeaway operationalizes Loren Stewart's complexity gradient.
relation (empty) → about
source_node_id (empty) → 5175ee0d-c87c-4590-89e5-8a67b39e09f6
target_node_id (empty) → 083332ed-0782-44ba-ab65-f92fa2ce092a
create How to migrate a 5-year-old Rails+React app toward no-build? → asked_at → No-build Utopia: Modern User Experiences with Rails & Web Standards
context (empty) → Asked during the Q&A after Ryan's talk.
relation (empty) → asked_at
source_node_id (empty) → cebe1ebe-9bf6-4c27-86c7-eaaad2025f11
target_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
create How to migrate a 5-year-old Rails+React app toward no-build? → about → React
context (empty) → Specifically about migrating off React.
relation (empty) → about
source_node_id (empty) → cebe1ebe-9bf6-4c27-86c7-eaaad2025f11
target_node_id (empty) → 5026a4fc-0c6e-49d7-bb7d-29be23b72b24
create How to migrate a 5-year-old Rails+React app toward no-build? → about → Cloudflare Web Analytics
context (empty) → Ryan recommends measurement, citing Cloudflare Web Analytics as one option.
relation (empty) → about
source_node_id (empty) → cebe1ebe-9bf6-4c27-86c7-eaaad2025f11
target_node_id (empty) → b869bef3-84d0-4904-babe-be87aec495e9
create Do you end up fighting Turbo when adopting these new APIs? → asked_at → No-build Utopia: Modern User Experiences with Rails & Web Standards
context (empty) → Asked during the Q&A.
relation (empty) → asked_at
source_node_id (empty) → bf49dab5-b6f4-4488-8195-143a90259491
target_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
create Do you end up fighting Turbo when adopting these new APIs? → about → Turbo
context (empty) → Question centers on Turbo + Turbo broadcasts interop.
relation (empty) → about
source_node_id (empty) → bf49dab5-b6f4-4488-8195-143a90259491
target_node_id (empty) → 0071d9d0-23d6-4880-af20-5c3369e78423
create Do you end up fighting Turbo when adopting these new APIs? → about → Declarative Partial Updates
context (empty) → Ryan's answer points to this API as a future standardization of Turbo's model.
relation (empty) → about
source_node_id (empty) → bf49dab5-b6f4-4488-8195-143a90259491
target_node_id (empty) → 74d4673d-d4a4-4866-970b-6881a42e0a04
create What about HTMX? → asked_at → No-build Utopia: Modern User Experiences with Rails & Web Standards
context (empty) → Asked during the Q&A.
relation (empty) → asked_at
source_node_id (empty) → 18fa90a5-4817-4c09-be75-304887ca09a8
target_node_id (empty) → f9b71fb1-e828-4deb-a49d-fdc21bc00cc5
create What about HTMX? → about → htmx
context (empty) → Direct question about HTMX as a Hotwire alternative.
relation (empty) → about
source_node_id (empty) → 18fa90a5-4817-4c09-be75-304887ca09a8
target_node_id (empty) → 704680e3-3592-445c-b2b7-c6e2435d08a6
create Ryan Townsend → recommends → htmx
context (empty) → In Q&A called HTMX 'a great little library' that works well with Rails.
relation (empty) → recommends
source_node_id (empty) → e3b7fd5e-d68c-4961-a643-f0a2e4f9225a
target_node_id (empty) → 704680e3-3592-445c-b2b7-c6e2435d08a6
create Ryan Townsend → works_on → Declarative Partial Updates
attrs (empty) → {"role" => "advocate"}
context (empty) → Plans to push browser vendors to adopt this as his first browser API.
relation (empty) → works_on
source_node_id (empty) → e3b7fd5e-d68c-4961-a643-f0a2e4f9225a
target_node_id (empty) → 74d4673d-d4a4-4866-970b-6881a42e0a04

Read set

182 nodes

tool Cloudflare R2 search_nodes tool Render search_nodes takeaway Sign serverlessforruby.org petition search_nodes talk No-build Utopia: Modern User Experiences with Rails & Web Standards search_nodes+get_node_edges tool cssbundling-rails search_nodes tool Coolify search_nodes project Rails Spotlight search_nodes tool Packwerk search_nodes tool Cloudflare Workers search_nodes talk Rails Spotlight Chrome Extension Lightning Talk search_nodes project monolith framework search_nodes tool Axon Framework search_nodes tool Ruby on Rails search_nodes concept Cynefin Framework search_nodes tool Rack search_nodes tool Hanami search_nodes event Rails World search_nodes tool Ember.js search_nodes tool Rails 8.1 search_nodes tool Active Admin search_nodes tool Hotwire search_nodes tool Stimulus search_nodes question What licenses do Turbo Native libraries use? search_nodes tool Turbo search_nodes takeaway Turbo Frames, Turbo Streams and Stimulus can be used independently search_nodes tool Turbo Streams search_nodes tool Turbo Native search_nodes concept HTTP Turbo Streams vs WebSocket Turbo Streams search_nodes resource The Rails and Hotwire Codex search_nodes question Have you heard of Stimulus? search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes talk Performance Panel wroclove.rb 2024 search_nodes talk Fix Production Bugs 20x Faster search_nodes talk Mutation testing workshop wroclove.rb 2019 search_nodes person Ryan Townsend search_nodes+get_node_edges question What about CPU, memory, IO, network, and large DOM profilers? search_nodes tool webpagetest.org search_nodes concept Waterfall Analysis search_nodes concept Page Load Time Budget search_nodes resource High Performance Browser Networking search_nodes talk Better WebPerformance with Rails search_nodes question Which tools do you use to monitor, triage, and fix performance problems? search_nodes concept Tree Shaking search_nodes concept Core Web Vitals search_nodes concept Performance SLA search_nodes concept Largest Contentful Paint search_nodes concept RAIL Performance Model search_nodes takeaway Always Measure, Never Assume search_nodes question When should performance optimization end? search_nodes tool htmx search_nodes tool Turbo Frames search_nodes tool HTTP gem search_nodes tool OHA search_nodes tool Turbo Laravel search_nodes concept Web-to-Native Bridge search_nodes company Transloadit search_nodes tool Dash search_nodes tool SXG Validator search_nodes takeaway Time Travel Superpower search_nodes concept AI Agent search_nodes concept HTTP Shared Dictionary Compression search_nodes question Can shared dictionaries help JSON APIs? search_nodes tool Brotli search_nodes tool gzip search_nodes takeaway Prefer Brotli over gzip when available search_nodes tool HTTP/2 search_nodes tool WebP search_nodes concept HTTP/2 Server Push search_nodes takeaway Switch on HTTP/2 search_nodes concept Magic bytes MIME detection search_nodes company Cloudflare search_nodes tool Cloudflare Workflows search_nodes tool Amazon CloudFront search_nodes company Digital Ocean search_nodes tool Tailscale search_nodes company OVH search_nodes concept Preloading and Prefetching search_nodes concept SXG Sub-resource Prefetching search_nodes takeaway Measure SXG with a canary, not before/after search_nodes concept Accelerated Mobile Pages search_nodes concept Branch Prediction search_nodes concept HTTP Caching with ETag and Last-Modified search_nodes tool Preact search_nodes tool interactor search_nodes concept Command Form search_nodes takeaway Don't Use Interactors search_nodes concept LLM Tool Calling search_nodes tool Claude Code search_nodes concept MCP Server search_nodes project push toi search_nodes tool fish shell search_nodes concept Pre-Compile Engine Assets at Build Time search_nodes tool Webpacker search_nodes tool jsbundling-rails search_nodes tool Bootsnap search_nodes tool Deface search_nodes question Packaging a Rails engine that uses Webpacker search_nodes tool Lookbook search_nodes tool Angular search_nodes concept Progressive Web Apps search_nodes tool Next.js search_nodes tool React Native search_nodes tool Elm search_nodes tool React search_nodes concept Live Reload search_nodes question Will we all be exclusively JavaScript developers in two years? search_nodes question What will be the JavaScript developer's dream in a year? search_nodes tool Babel search_nodes question Which JavaScript fads have stood the test of time? search_nodes talk JavaScript and Frontend Panel search_nodes question Will JavaScript die as a development platform? search_nodes tool TypeScript search_nodes talk Adventures in durable execution search_nodes tool Flow search_nodes question Would you recommend TypeScript or Flow? search_nodes talk Scaling an Open Source E-Commerce Framework search_nodes concept Structural Physics of Software search_nodes concept Distance From The Main Sequence search_nodes takeaway Avoid complexity before fighting it search_nodes takeaway Mutant as complexity metric and refactoring guide search_nodes concept Conway's Law search_nodes concept Algorithmic Complexity search_nodes concept Hyrum's Law search_nodes takeaway Every Model Is Wrong But Some Are Useful search_nodes talk Ever shorter feedback loop search_nodes question How to detect coupling in a large existing project? search_nodes tool Apollo GraphQL Platform search_nodes tool Apollo GraphQL search_nodes tool GraphQL search_nodes concept Nested GraphQL query bottleneck search_nodes tool Relay search_nodes concept Logux Proxy search_nodes resource shadcn/ui search_nodes company GitHub search_nodes tool GitHub Releases search_nodes tool Jekyll search_nodes tool Release Drafter search_nodes resource awesome-ddd search_nodes tool GitHub Actions search_nodes concept GitHub Self-Hosted Runner search_nodes tool PR Labeler search_nodes tool reviewdog search_nodes tool pganalyze search_nodes takeaway Record CloudFront request headers on sessions search_nodes tool Honeycomb search_nodes concept Logs vs Traces vs Metrics search_nodes concept Static Page Caching via nginx search_nodes question How does Phlex integrate with Turbo? search_nodes tool FFmpeg search_nodes tool jq search_nodes talk Zite and Unicode Sparklines Lightning Talk search_nodes tool Zencoder search_nodes tool Litestream search_nodes person DHH search_nodes company thoughtbot search_nodes concept Majestic Monolith search_nodes talk Mentoring the Rails World Website Lightning Talk search_nodes resource Rails Architect Master Class search_nodes tool Hatchbox search_nodes resource High Leverage Rails search_nodes talk How wroclove.rb impacts developers and companies search_nodes talk Building Rails SPAs in Frontend Ruby with Glimmer DSL for Web search_nodes takeaway Buy Faster Hardware search_nodes concept Memory Latency search_nodes concept Crossing the Chasm search_nodes concept Premature optimization search_nodes resource Falsehoods Programmers Believe About Time search_nodes tool Thruster search_nodes tool Google Analytics search_nodes tool esbuild search_nodes tool core-js search_nodes tool Browserslist search_nodes takeaway Share Browser-Support Config Across Front-End And Back-End search_nodes concept esbuild Pipeline search_nodes concept WebAssembly search_nodes concept Bundle Size Audit search_nodes

4 edges