← 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 TownsendauthoredNo-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 Standardspresented_atwroclove.rb 2026
context (empty) Talk presented at the 2026 edition of wroclove.rb.
update Ryan Townsendattendedwroclove.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 Townsendworks_atCloudflare
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 StandardsaboutPjax
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 Townsendworks_onCloudflare 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 TownsendrecommendsCloudflare 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 Townsendhas_skillRuby 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 StandardsaboutRuby 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 StandardsaboutHotwire
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 StandardsaboutTurbo
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 StandardsaboutStimulus
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 StandardsaboutView 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 StandardsaboutSpeculation 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 StandardsaboutCompression 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 StandardsaboutInvoker 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 StandardsaboutInterest 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 StandardsaboutDeclarative 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 StandardsaboutRJS
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 StandardsaboutSprockets
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 StandardsaboutProp 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 StandardsaboutImport 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 StandardsaboutTurbo 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 StandardsaboutWebpacker
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 StandardsaboutCoffeeScript
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 StandardsaboutSass
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 StandardsaboutCore 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 StandardsaboutComplexity 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 StandardsaboutResume 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 StandardsaboutWirth'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 Standardsabouthtmx
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 StandardsaboutHTTP/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 Scriptrelated_toSpeculation 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 APIrelated_toInvoker 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 Updatesrelated_toHotwire
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 Dictionariesrelated_toHTTP 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 DictionariesusesBrotli
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 Linksrelated_toPjax
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 Shaftrelated_toSprockets
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 Mapsrelated_toHTTP/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 WanstrathauthoredPjax
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 Wanstrathworks_atGitHub
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 Kadlecworks_atCloudflare
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 Liabilityfrom_talkNo-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 Firstfrom_talkNo-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 Organicallyfrom_talkNo-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 Navigationfrom_talkNo-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 Vitalsfrom_talkNo-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 FirstaboutCloudflare 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 LiabilityaboutRuby 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 OrganicallyaboutComplexity 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_atNo-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?aboutReact
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?aboutCloudflare 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_atNo-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?aboutTurbo
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?aboutDeclarative 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_atNo-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?abouthtmx
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 Townsendrecommendshtmx
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 Townsendworks_onDeclarative 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