← Extractions

Better WebPerformance with Rails — Stefan Wintermeyer at wroclove.rb 2018

Stefan Wintermeyer's wroclove.rb 2018 talk on achieving sub-one-second page loads with Rails 5.2. Covers the network/render budget (TCP slow-start, TLS, HTML/CSS/JS pipeline), fragment and Russian-doll caching, HTTP ETag/Last-Modified caching, preheating static gzip pages served directly by nginx, HTTP/2, Brotli, preloading/prefetching, Active Storage, and the importance of a performance time budget.

Model
claude-opus-4-7
Ingestion
bfd8081b
Input tokens
108,477
fresh
34,672
cached
63,133
cache write
10,672
Output tokens
13,510
Duration
184.9s
Roundtrips
5
Tool calls
14
Cost
$0.00
Nodes/edges extracted
45 / 71
Read set (nodes/edges)
45 / 2

Nodes (45)

create Cache Preheating concept
kind (empty) → concept
name (empty) → Cache Preheating
slug (empty) → cache-preheating
attrs (empty) → {"category" => "practice"}
description (empty) → Because writing the first cache entry on a user request is expensive, a regional site can use cron during off-hours t...
short_description (empty) → Using cron to brute-force rebuild caches ahead of user requests.
create Heroku tool
kind (empty) → tool
name (empty) → Heroku
slug (empty) → heroku
attrs (empty) → {"category" => "platform"}
description (empty) → De-facto standard PaaS for Rails; easy to start but comparatively slow and expensive as the app grows. Speaker recomm...
short_description (empty) → Ruby-friendly PaaS for deploying web applications.
create Phoenix tool
kind (empty) → tool
name (empty) → Phoenix
slug (empty) → phoenix
attrs (empty) → {"category" => "framework"}
description (empty) → Elixir web framework cited as dramatically faster than Rails (~10ms without caching for equivalent work). Speaker sug...
short_description (empty) → Elixir web framework known for low-latency request handling.
create Elixir tool
kind (empty) → tool
name (empty) → Elixir
slug (empty) → elixir
attrs (empty) → {"category" => "language"}
description (empty) → Language underlying the Phoenix framework. Mentioned as super fast and easy to test compared to Ruby.
short_description (empty) → Functional, concurrent language on the BEAM VM.
update Better WebPerformance with Rails talk
description Talk at wroclove.rb 2018. → Stefan Wintermeyer's talk at wroclove.rb 2018 on why the first page load must fit within a ~1-second budget and how t...
short_description Talk at wroclove.rb 2018. → Talk on Rails 5.2 web performance, caching, and sub-second page loads.
update Stefan Wintermeyer person
attrs (empty) → {"role" => "consultant/author/speaker"}
description Conference speaker. → Conference speaker, Rails consultant (adesh consulting), and author of books on Ruby on Rails. Delivered 'Better WebP...
short_description Conference speaker. → Ruby/Rails consultant, author, and conference speaker focused on web performance.
create Page Load Time Budget concept
kind (empty) → concept
name (empty) → Page Load Time Budget
slug (empty) → page-load-time-budget
attrs (empty) → {"category" => "practice"}
description (empty) → The idea that a web page's first render should ideally complete in under one second, because users bounce rapidly aft...
short_description (empty) → Target of keeping first-page render under one second, including mobile 3G.
create TCP Slow Start concept
kind (empty) → concept
name (empty) → TCP Slow Start
slug (empty) → tcp-slow-start
attrs (empty) → {"category" => "pattern"}
description (empty) → TCP begins each connection with a small congestion window (~14KB first packet), then doubles each round-trip until er...
short_description (empty) → TCP congestion-control mechanism where bandwidth ramps up from ~14KB.
create Waterfall Analysis concept
kind (empty) → concept
name (empty) → Waterfall Analysis
slug (empty) → waterfall-analysis
attrs (empty) → {"category" => "practice"}
description (empty) → A waterfall chart shows each resource request (HTML, CSS, JS, images) with timing bands for DNS, connect, TLS, TTFB, ...
short_description (empty) → Browser request timeline used to diagnose web-performance bottlenecks.
create Fragment Caching concept
kind (empty) → concept
name (empty) → Fragment Caching
slug (empty) → fragment-caching
attrs (empty) → {"category" => "pattern"}
description (empty) → Rails view-level cache that stores rendered fragments keyed on a record. In the talk, wrapping each product row in a ...
short_description (empty) → Caching rendered view fragments keyed by model to skip re-rendering.
create Russian Doll Caching concept
kind (empty) → concept
name (empty) → Russian Doll Caching
slug (empty) → russian-doll-caching
attrs (empty) → {"category" => "pattern"}
description (empty) → Caching strategy where both the collection and its inner items are cached; when an inner cache is still valid, the ou...
short_description (empty) → Nested fragment caches where outer caches reuse valid inner caches.
create HTTP Caching with ETag and Last-Modified concept
kind (empty) → concept
name (empty) → HTTP Caching with ETag and Last-Modified
slug (empty) → http-caching-with-etag-and-last-modified
attrs (empty) → {"category" => "pattern"}
description (empty) → Browser sends stored ETag / If-Modified-Since; if still valid, server responds 304, saving both bandwidth and server-...
short_description (empty) → Conditional HTTP requests that return 304 Not Modified to skip re-rendering.
create Static Page Caching via nginx concept
kind (empty) → concept
name (empty) → Static Page Caching via nginx
slug (empty) → static-page-caching-via-nginx
attrs (empty) → {"category" => "pattern"}
description (empty) → By writing pre-rendered HTML (and pre-compressed .gz files) into Rails' public/cache directory, nginx can serve reque...
short_description (empty) → Serving pre-rendered, pre-gzipped HTML directly from nginx without touching Rails.
create Preloading and Prefetching concept
kind (empty) → concept
name (empty) → Preloading and Prefetching
slug (empty) → preloading-and-prefetching
attrs (empty) → {"category" => "practice"}
description (empty) → Header hints like dns-prefetch, preload, prefetch, and prerender let the page tell the browser to resolve DNS or fetc...
short_description (empty) → HTML link hints telling browsers to fetch DNS/resources in advance.
create HTTP/2 Server Push concept
kind (empty) → concept
name (empty) → HTTP/2 Server Push
slug (empty) → http-2-server-push
attrs (empty) → {"category" => "pattern"}
description (empty) → HTTP/2 feature allowing the server to push files to the client without a request. Powerful but tricky — the talk warn...
short_description (empty) → Server proactively pushing resources before the client requests them.
create Performance Time Budget concept
kind (empty) → concept
name (empty) → Performance Time Budget
slug (empty) → performance-time-budget
attrs (empty) → {"category" => "practice"}
description (empty) → An explicit, team-agreed ceiling (e.g. 2 seconds) for page load. Called out as the single most important tool: it giv...
short_description (empty) → Organizational commitment to a page-load ceiling used to defend against feature bloat.
create nginx tool
kind (empty) → tool
name (empty) → nginx
slug (empty) → nginx
attrs (empty) → {"category" => "service"}
description (empty) → Web server used in the talk to serve pre-rendered, pre-gzipped Rails cache pages directly from public/cache without c...
short_description (empty) → High-performance HTTP server and reverse proxy.
create Apache HTTP Server tool
kind (empty) → tool
name (empty) → Apache HTTP Server
slug (empty) → apache-http-server
attrs (empty) → {"category" => "service"}
description (empty) → Alternative to nginx for fronting Rails. Speaker says it doesn't matter which you pick; he personally prefers nginx.
short_description (empty) → Widely-deployed open-source HTTP server.
create HTTP/2 tool
kind (empty) → tool
name (empty) → HTTP/2
slug (empty) → http-2
attrs (empty) → {"category" => "platform"}
description (empty) → Recommended as an easy ~20% performance win over HTTP/1.1 with a one-line nginx config change. Works best with a sing...
short_description (empty) → Binary, multiplexed successor to HTTP/1.1.
create Brotli tool
kind (empty) → tool
name (empty) → Brotli
slug (empty) → brotli
attrs (empty) → {"category" => "library"}
description (empty) → Compression algorithm supported by all major browsers (Safari, Chrome, Firefox, Edge). Provides ~10–20% performance b...
short_description (empty) → HTTP compression algorithm with better ratios than gzip.
create gzip tool
kind (empty) → tool
name (empty) → gzip
slug (empty) → gzip
attrs (empty) → {"category" => "library"}
description (empty) → Standard HTTP compression. nginx can gzip on the fly, but pre-gzipping cached files saves CPU and time at request time.
short_description (empty) → Ubiquitous HTTP compression algorithm.
create webpagetest.org tool
kind (empty) → tool
name (empty) → webpagetest.org
slug (empty) → webpagetest-org
attrs (empty) → {"category" => "service"}
description (empty) → Public web-performance testing service used in the talk to show waterfall charts of the conference homepage and compa...
short_description (empty) → Online service for measuring web performance and producing waterfalls.
create Active Storage tool
kind (empty) → tool
name (empty) → Active Storage
slug (empty) → active-storage
attrs (empty) → {"category" => "framework"}
description (empty) → Rails 5.2 feature for managing image/file uploads. The talk recommends using it to generate multiple image output for...
short_description (empty) → Rails framework for attaching files/images to models.
create WebP tool
kind (empty) → tool
name (empty) → WebP
slug (empty) → webp
attrs (empty) → {"category" => "library"}
description (empty) → Modern image format that can be served to supporting browsers (e.g. Chrome) via Active Storage to reduce image payloa...
short_description (empty) → Efficient image format by Google with smaller file sizes.
create Ruby tool
kind (empty) → tool
name (empty) → Ruby
slug (empty) → ruby
attrs (empty) → {"category" => "language"}
description (empty) → The language Rails is built on. The talk emphasizes Ruby is inherently slow and upgrading to Ruby 2.5 can yield rough...
short_description (empty) → Dynamic, object-oriented programming language.
create Akamai tool
kind (empty) → tool
name (empty) → Akamai
slug (empty) → akamai
attrs (empty) → {"category" => "service"}
description (empty) → Example CDN/edge service that handles image compression and delivers optimal variants per client. Considered a conven...
short_description (empty) → Commercial CDN offering caching, compression, and image optimization.
create Faker tool
kind (empty) → tool
name (empty) → Faker
slug (empty) → faker
attrs (empty) → {"category" => "library"}
description (empty) → Used in the talk's seeds.rb to populate the sample webshop (products, categories, users, reviews) with realistic samp...
short_description (empty) → Ruby gem generating realistic fake data for seeds and tests.
create adesh consulting company
kind (empty) → company
name (empty) → adesh consulting
slug (empty) → adesh-consulting
attrs (empty) → {"industry" => "software consulting"}
description (empty) → Stefan Wintermeyer's consulting company. Its homepage is used in the talk as a reference example of a very fast-rende...
short_description (empty) → Stefan Wintermeyer's Ruby on Rails consulting business.
create Google company
kind (empty) → company
name (empty) → Google
slug (empty) → google
attrs (empty) → {"industry" => "internet"}
description (empty) → Referenced for a classic experiment slowing search response time by 100ms for a user subgroup; over weeks, bounce/beh...
short_description (empty) → Search and cloud company whose latency experiments are cited.
create Rails 5.2 tool
kind (empty) → tool
name (empty) → Rails 5.2
slug (empty) → rails-5-2
attrs (empty) → {"category" => "framework"}
description (empty) → Rails release used throughout the talk's sample webshop. Ships Active Storage and defaults that enable Russian-doll c...
short_description (empty) → Version of Ruby on Rails with Active Storage and Russian-doll caching defaults.
create High Performance Browser Networking resource
kind (empty) → resource
name (empty) → High Performance Browser Networking
slug (empty) → high-performance-browser-networking
attrs (empty) → {"type" => "book"}
description (empty) → Recommended as the 'web performance Bible' — a framework-agnostic reference covering the network stack, graphic forma...
short_description (empty) → Reference book on web/network performance by Ilya Grigorik.
create Stefan Wintermeyer's Rails 5.2 Book resource
kind (empty) → resource
name (empty) → Stefan Wintermeyer's Rails 5.2 Book
slug (empty) → stefan-wintermeyer-s-rails-5-2-book
attrs (empty) → {"type" => "book"}
description (empty) → Speaker's new book on Rails 5.2, promoted at the end of the talk with a discount code for the first 100 buyers.
short_description (empty) → Stefan Wintermeyer's book on Ruby on Rails 5.2.
create Set a page-load time budget takeaway
kind (empty) → takeaway
name (empty) → Set a page-load time budget
slug (empty) → set-a-page-load-time-budget
attrs (empty) → {"type" => "recommendation"}
description (empty) → The single most important web-performance tool is agreeing on a concrete time budget (e.g. 2 seconds) and using it as...
short_description (empty) → Define an explicit page-load ceiling organization-wide.
create Prefer DB-derived columns over recomputed values takeaway
kind (empty) → takeaway
name (empty) → Prefer DB-derived columns over recomputed values
slug (empty) → prefer-db-derived-columns-over-recomputed-values
attrs (empty) → {"type" => "recommendation"}
description (empty) → Instead of recomputing aggregates like a product's star rating on every render, store them as columns updated via aft...
short_description (empty) → Store rarely-changing derived values (e.g. number_of_stars) in the DB via callbacks.
create Keep cache keys simple takeaway
kind (empty) → takeaway
name (empty) → Keep cache keys simple
slug (empty) → keep-cache-keys-simple
attrs (empty) → {"type" => "warning"}
description (empty) → Warning from experience: elaborately-constructed cache keys can take longer to compute than rendering the view withou...
short_description (empty) → Complex cache keys can cost more to compute than the render they save.
create Use touch: true for fragment cache invalidation takeaway
kind (empty) → takeaway
name (empty) → Use touch: true for fragment cache invalidation
slug (empty) → use-touch-true-for-fragment-cache-invalidation
attrs (empty) → {"type" => "recommendation"}
description (empty) → When caching a parent fragment that depends on child records (e.g. reviews of a product), the child's belongs_to must...
short_description (empty) → Add touch: true on child associations so parents' cache keys invalidate.
create Switch on HTTP/2 takeaway
kind (empty) → takeaway
name (empty) → Switch on HTTP/2
slug (empty) → switch-on-http-2
attrs (empty) → {"type" => "recommendation"}
description (empty) → Turning on HTTP/2 is a one-line nginx config change that yields roughly 20% performance improvement; prefer a single ...
short_description (empty) → Enable HTTP/2 in nginx for a ~20% boost with minimal effort.
create Prefer Brotli over gzip when available takeaway
kind (empty) → takeaway
name (empty) → Prefer Brotli over gzip when available
slug (empty) → prefer-brotli-over-gzip-when-available
attrs (empty) → {"type" => "recommendation"}
description (empty) → All major browsers support Brotli; enabling it alongside gzip offers better compression ratios and lower server CPU, ...
short_description (empty) → Brotli saves 10–20% bytes and CPU vs gzip, with automatic gzip fallback.
create Serve preheated static pages via nginx takeaway
kind (empty) → takeaway
name (empty) → Serve preheated static pages via nginx
slug (empty) → serve-preheated-static-pages-via-nginx
attrs (empty) → {"type" => "recommendation"}
description (empty) → For maximum speed, write fully-rendered (and pre-compressed) HTML to the public/cache directory during off-peak cron ...
short_description (empty) → Pre-render and pre-gzip pages to public/cache so nginx serves them without touching Rails.
create Upgrade Ruby version for free speed takeaway
kind (empty) → takeaway
name (empty) → Upgrade Ruby version for free speed
slug (empty) → upgrade-ruby-version-for-free-speed
attrs (empty) → {"type" => "recommendation"}
description (empty) → Keeping Ruby on the latest stable release is a trivial way to reclaim performance; the speaker cites roughly 10% gain...
short_description (empty) → New Ruby releases (e.g. 2.5) can bring ~10% speedups with no code change.
create CDN is not always the answer takeaway
kind (empty) → takeaway
name (empty) → CDN is not always the answer
slug (empty) → cdn-is-not-always-the-answer
attrs (empty) → {"type" => "insight"}
description (empty) → CDNs matter for globally-distributed traffic (e.g. firmware rollouts), but for regional apps with ~1M users they ofte...
short_description (empty) → CDNs help global distribution but can hurt when HTTP/2 would be faster with one origin.
create Is rendering from cached pages with server-side includes possible in Rails? question
kind (empty) → question
name (empty) → Is rendering from cached pages with server-side includes possible in Rails?
slug (empty) → is-rendering-from-cached-pages-with-server-side-includes-possible-in-rails
attrs (empty) → {"answer_summary" => "Essentially another form of fragment caching; also consider Ruby version upgrades and code-leve...
description (empty) → Audience question about whether Rails supports server-side includes in a cached static page so a block can be re-rend...
short_description (empty) → Asks about ESI-style partial re-rendering from a cached static page.
create Does caching still help for complex apps with many models? question
kind (empty) → question
name (empty) → Does caching still help for complex apps with many models?
slug (empty) → does-caching-still-help-for-complex-apps-with-many-models
attrs (empty) → {"answer_summary" => "Yes — it gets harder with more models and wrong keys surface in production, but given Ruby's sp...
description (empty) → Audience question (prefaced with the 'cache invalidation and naming' joke). Speaker acknowledges it becomes complicat...
short_description (empty) → Asks whether caching scales beyond simple apps with few models.
create Aren't query optimizations a better first step than caching? question
kind (empty) → question
name (empty) → Aren't query optimizations a better first step than caching?
slug (empty) → aren-t-query-optimizations-a-better-first-step-than-caching
attrs (empty) → {"answer_summary" => "Optimize queries first in principle, but in this Rails example the view rendering (not AR) domi...
description (empty) → Audience remark that optimizing queries and eager-loading can remove the need for caching and avoid premature optimiz...
short_description (empty) → Asks whether N+1 fixes/eager loading should come before caching.
create Should touch on belongs_to be avoided in complex apps? question
kind (empty) → question
name (empty) → Should touch on belongs_to be avoided in complex apps?
slug (empty) → should-touch-on-belongs_to-be-avoided-in-complex-apps
attrs (empty) → {"answer_summary" => "Keep touch for typical has_many sizes — it's the best way to sync fragment caches. Remove it on...
description (empty) → Audience member argues callbacks and touch in ActiveRecord should be removed in complex apps because touching parents...
short_description (empty) → Asks whether touching parents via callbacks causes performance issues at scale.

Edges (71)

create Better WebPerformance with Rails → about → Performance Time Budget
context (empty) → Closes on time budget as the most important tool.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 0135bc8b-2f02-48cb-b758-d8a8cdb37557
create Better WebPerformance with Rails → about → nginx
context (empty) → Recommended front-end server for caching and HTTP/2.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 29651d23-1c51-4579-9ac2-30a89b8a3c7f
create Better WebPerformance with Rails → about → Apache HTTP Server
context (empty) → Mentioned as equivalent alternative to nginx.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 3c59de07-a60f-42e0-8eca-87a3c94fb3cf
create Better WebPerformance with Rails → about → HTTP/2
context (empty) → Recommends enabling HTTP/2 for ~20% gain.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 09bad78e-f8a8-4348-a1ef-1dce44d689a5
create Better WebPerformance with Rails → about → Brotli
context (empty) → Recommends Brotli over gzip.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → a02f5458-efb6-4935-9754-ad96a3c66aa4
create Better WebPerformance with Rails → about → gzip
context (empty) → Baseline compression; recommends pre-gzipping cached files.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → f6c3f711-3d84-4a27-97b8-8d67122c107d
create Better WebPerformance with Rails → about → webpagetest.org
context (empty) → Tool used to produce demonstration waterfalls.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 7fee5f04-a7ee-4416-adf4-23348a934b12
create Better WebPerformance with Rails → about → Active Storage
context (empty) → Recommends using for multi-format image delivery.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 2834fe94-5598-4e2b-ae0f-322d38f50180
create Better WebPerformance with Rails → about → WebP
context (empty) → Suggested as Chrome-targeted image format via Active Storage.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 59fe4869-6856-452b-973a-54280672f2d2
create Better WebPerformance with Rails → about → Heroku
context (empty) → Discusses Heroku vs bare-metal trade-offs.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → d3785e15-2805-4486-a633-6e785e4f8ae3
create Prefer Brotli over gzip when available → from_talk → Better WebPerformance with Rails
context (empty) → Brotli section at end of talk.
relation (empty) → from_talk
source_node_id (empty) → 2d5c33bf-c160-4c36-91b1-e32ede103182
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Serve preheated static pages via nginx → from_talk → Better WebPerformance with Rails
context (empty) → Public/cache directory + expire_cache hook strategy.
relation (empty) → from_talk
source_node_id (empty) → bbeac90f-d63e-4606-93df-b3ac4415180c
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Upgrade Ruby version for free speed → from_talk → Better WebPerformance with Rails
context (empty) → Raised in Q&A about additional server-side improvements.
relation (empty) → from_talk
source_node_id (empty) → 9c5b4ee4-f87f-4c95-8817-76589b0491d8
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create CDN is not always the answer → from_talk → Better WebPerformance with Rails
context (empty) → Discussed in CDN vs HTTP/2 section.
relation (empty) → from_talk
source_node_id (empty) → e92473d7-2a3c-4392-bbd1-4eaf6be660e3
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Set a page-load time budget → about → Performance Time Budget
context (empty) → Takeaway encapsulates the time-budget concept.
relation (empty) → about
source_node_id (empty) → 7dea7d8c-9087-489c-b88b-13129ffd1076
target_node_id (empty) → 0135bc8b-2f02-48cb-b758-d8a8cdb37557
create Prefer DB-derived columns over recomputed values → about → Fragment Caching
context (empty) → Complements fragment caching by avoiding recomputation.
relation (empty) → about
source_node_id (empty) → 2903fcea-b8e3-4711-a5fc-b64c75952c0e
target_node_id (empty) → e5570dc6-83ab-4f05-bf5d-1a5b8e93d9e6
update Stefan Wintermeyer → authored → Better WebPerformance with Rails
context (empty) → Delivered the talk at wroclove.rb 2018.
update Better WebPerformance with Rails → presented_at → wroclove.rb 2018
context (empty) → Conference where the talk was given.
create Stefan Wintermeyer → attended → wroclove.rb 2018
context (empty) → Attended as a speaker.
relation (empty) → attended
source_node_id (empty) → 1a3c4d6f-185c-46fe-b843-15dba68dc025
target_node_id (empty) → 9243ef2c-21bb-4f23-b450-9ecd87882dfe
create Stefan Wintermeyer → works_at → adesh consulting
attrs (empty) → {"role" => "consultant"}
context (empty) → Uses his adesh consulting homepage as a fast-page example.
relation (empty) → works_at
source_node_id (empty) → 1a3c4d6f-185c-46fe-b843-15dba68dc025
target_node_id (empty) → 2a2e2b8c-7ae0-482f-8290-8303d5f6a454
create Stefan Wintermeyer → authored → Stefan Wintermeyer's Rails 5.2 Book
context (empty) → Promoted his own Rails 5.2 book at the end of the talk.
relation (empty) → authored
source_node_id (empty) → 1a3c4d6f-185c-46fe-b843-15dba68dc025
target_node_id (empty) → 9308c5d1-0cb2-4354-bb5c-e174dadfe15e
create Better WebPerformance with Rails → about → Ruby on Rails
context (empty) → Talk is about improving web performance of Rails apps.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Better WebPerformance with Rails → about → Rails 5.2
context (empty) → Uses Rails 5.2 sample webshop throughout.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → af2a39f2-b541-4e8a-a4da-ea9ede14edbb
create Better WebPerformance with Rails → about → Page Load Time Budget
context (empty) → Frames the entire talk around a sub-1s render goal.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 3defa061-0342-47cc-a53f-1fc7904e0d2b
create Better WebPerformance with Rails → about → TCP Slow Start
context (empty) → Explains TCP slow-start as a latency floor.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 51a2ea2f-87fe-400a-8ce9-cc25334bb719
create Better WebPerformance with Rails → about → Waterfall Analysis
context (empty) → Demonstrates waterfall diagnosis via webpagetest.org.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 210c3389-1347-441b-8655-7f62d5e91450
create Better WebPerformance with Rails → about → Fragment Caching
context (empty) → Primary caching technique demonstrated.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → e5570dc6-83ab-4f05-bf5d-1a5b8e93d9e6
create Better WebPerformance with Rails → about → Russian Doll Caching
context (empty) → Extends fragment caching to nested caches.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → bb9e003c-f613-4427-9a5d-13093f705d50
create Better WebPerformance with Rails → about → HTTP Caching with ETag and Last-Modified
context (empty) → Demonstrates fresh_when for 304 responses.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 265c76a9-3f4c-4741-a7e5-0e58f131c9bb
create Better WebPerformance with Rails → about → Cache Preheating
context (empty) → Uses cron to pre-populate caches overnight.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 99428f5f-05de-416f-9625-11b9f38c919c
create Better WebPerformance with Rails → about → Static Page Caching via nginx
context (empty) → Describes writing cached pages to public/cache for nginx to serve directly.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 33cd1002-0945-428e-8ee7-464137a06ed2
create Better WebPerformance with Rails → about → Preloading and Prefetching
context (empty) → Covers dns-prefetch, preload, prefetch, prerender hints.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 48235abe-6f2b-44bf-8ea8-ee16f31ab351
create Better WebPerformance with Rails → about → HTTP/2 Server Push
context (empty) → Notes server push is powerful but tricky.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → e0dd4355-3b4c-4720-85dc-9d9ee4e1e7aa
create Better WebPerformance with Rails → about → Phoenix
context (empty) → Referenced as a much faster alternative for greenfield projects.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 14a5108f-b80c-44ea-b8a1-fb8fbf5812e4
create Better WebPerformance with Rails → about → Elixir
context (empty) → Language underlying Phoenix, noted as fast and easy to test.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → ea3e988a-8cb9-4418-a809-6f894b77c081
create Better WebPerformance with Rails → about → Ruby
context (empty) → Notes Ruby's speed ceiling and upgrade gains.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → c7f25b33-06c9-460e-aca7-fe993123ebee
create Better WebPerformance with Rails → about → Akamai
context (empty) → CDN example discussed in Q&A.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → c62968bb-915c-446f-8d4c-3519776232d8
create Better WebPerformance with Rails → about → Faker
context (empty) → Used to seed the sample webshop.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 52317669-ba75-49db-915b-af5132786399
create Better WebPerformance with Rails → about → Google
context (empty) → Cites Google latency experiment showing 100ms slowdown changes user behavior.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → e4742ca5-3cbb-4688-baae-f26d90b4226b
create Better WebPerformance with Rails → about → High Performance Browser Networking
context (empty) → Recommends as the deeper follow-up reference.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 09496535-92a3-413b-87e1-d71d6505ee86
create Better WebPerformance with Rails → about → Stefan Wintermeyer's Rails 5.2 Book
context (empty) → Promoted at the end of the talk.
relation (empty) → about
source_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
target_node_id (empty) → 9308c5d1-0cb2-4354-bb5c-e174dadfe15e
create Stefan Wintermeyer → recommends → High Performance Browser Networking
context (empty) → Called it the 'web performance Bible'.
relation (empty) → recommends
source_node_id (empty) → 1a3c4d6f-185c-46fe-b843-15dba68dc025
target_node_id (empty) → 09496535-92a3-413b-87e1-d71d6505ee86
create Stefan Wintermeyer → recommends → HTTP/2
context (empty) → Recommends enabling HTTP/2 for a ~20% boost.
relation (empty) → recommends
source_node_id (empty) → 1a3c4d6f-185c-46fe-b843-15dba68dc025
target_node_id (empty) → 09bad78e-f8a8-4348-a1ef-1dce44d689a5
create Stefan Wintermeyer → recommends → Brotli
context (empty) → Recommends Brotli over gzip where supported.
relation (empty) → recommends
source_node_id (empty) → 1a3c4d6f-185c-46fe-b843-15dba68dc025
target_node_id (empty) → a02f5458-efb6-4935-9754-ad96a3c66aa4
create Stefan Wintermeyer → recommends → nginx
context (empty) → Prefers nginx for serving pre-cached, pre-gzipped pages.
relation (empty) → recommends
source_node_id (empty) → 1a3c4d6f-185c-46fe-b843-15dba68dc025
target_node_id (empty) → 29651d23-1c51-4579-9ac2-30a89b8a3c7f
create Stefan Wintermeyer → recommends → Active Storage
context (empty) → Recommends for serving modern image formats.
relation (empty) → recommends
source_node_id (empty) → 1a3c4d6f-185c-46fe-b843-15dba68dc025
target_node_id (empty) → 2834fe94-5598-4e2b-ae0f-322d38f50180
create Stefan Wintermeyer → recommends → Phoenix
context (empty) → Suggests Phoenix for greenfield projects needing top speed.
relation (empty) → recommends
source_node_id (empty) → 1a3c4d6f-185c-46fe-b843-15dba68dc025
target_node_id (empty) → 14a5108f-b80c-44ea-b8a1-fb8fbf5812e4
create Stefan Wintermeyer → recommends → Performance Time Budget
context (empty) → Calls budget-setting the single most important tool.
relation (empty) → recommends
source_node_id (empty) → 1a3c4d6f-185c-46fe-b843-15dba68dc025
target_node_id (empty) → 0135bc8b-2f02-48cb-b758-d8a8cdb37557
create Set a page-load time budget → from_talk → Better WebPerformance with Rails
context (empty) → Closing recommendation of the talk.
relation (empty) → from_talk
source_node_id (empty) → 7dea7d8c-9087-489c-b88b-13129ffd1076
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Prefer DB-derived columns over recomputed values → from_talk → Better WebPerformance with Rails
context (empty) → Demonstrated by storing number_of_stars as a column via callbacks.
relation (empty) → from_talk
source_node_id (empty) → 2903fcea-b8e3-4711-a5fc-b64c75952c0e
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Keep cache keys simple → from_talk → Better WebPerformance with Rails
context (empty) → Warning given during fragment caching section.
relation (empty) → from_talk
source_node_id (empty) → eed68747-6e2e-43c7-adab-bd79b05dfb69
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Use touch: true for fragment cache invalidation → from_talk → Better WebPerformance with Rails
context (empty) → Shown on the reviews belongs_to product relationship.
relation (empty) → from_talk
source_node_id (empty) → 8023c41a-463f-40a2-938f-1054dee5986b
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Switch on HTTP/2 → from_talk → Better WebPerformance with Rails
context (empty) → Recommended with a one-line nginx config change.
relation (empty) → from_talk
source_node_id (empty) → 523c1f19-bf07-4915-beaf-6dd73c5e4152
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Use touch: true for fragment cache invalidation → about → Fragment Caching
context (empty) → Directly about fragment cache key invalidation.
relation (empty) → about
source_node_id (empty) → 8023c41a-463f-40a2-938f-1054dee5986b
target_node_id (empty) → e5570dc6-83ab-4f05-bf5d-1a5b8e93d9e6
create Switch on HTTP/2 → about → HTTP/2
context (empty) → Recommendation about enabling HTTP/2.
relation (empty) → about
source_node_id (empty) → 523c1f19-bf07-4915-beaf-6dd73c5e4152
target_node_id (empty) → 09bad78e-f8a8-4348-a1ef-1dce44d689a5
create Prefer Brotli over gzip when available → about → Brotli
context (empty) → Recommendation about Brotli compression.
relation (empty) → about
source_node_id (empty) → 2d5c33bf-c160-4c36-91b1-e32ede103182
target_node_id (empty) → a02f5458-efb6-4935-9754-ad96a3c66aa4
create Serve preheated static pages via nginx → about → Static Page Caching via nginx
context (empty) → Concrete takeaway for nginx static cache pattern.
relation (empty) → about
source_node_id (empty) → bbeac90f-d63e-4606-93df-b3ac4415180c
target_node_id (empty) → 33cd1002-0945-428e-8ee7-464137a06ed2
create Upgrade Ruby version for free speed → about → Ruby
context (empty) → About Ruby version upgrades.
relation (empty) → about
source_node_id (empty) → 9c5b4ee4-f87f-4c95-8817-76589b0491d8
target_node_id (empty) → c7f25b33-06c9-460e-aca7-fe993123ebee
create CDN is not always the answer → about → HTTP/2
context (empty) → HTTP/2's single-connection preference informs the CDN trade-off.
relation (empty) → about
source_node_id (empty) → e92473d7-2a3c-4392-bbd1-4eaf6be660e3
target_node_id (empty) → 09bad78e-f8a8-4348-a1ef-1dce44d689a5
create Is rendering from cached pages with server-side includes possible in Rails? → asked_at → Better WebPerformance with Rails
context (empty) → Audience Q&A question.
relation (empty) → asked_at
source_node_id (empty) → 8bf691a8-c6c1-44e5-be01-66014385f2ce
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Does caching still help for complex apps with many models? → asked_at → Better WebPerformance with Rails
context (empty) → Audience Q&A question.
relation (empty) → asked_at
source_node_id (empty) → e90ebcc0-973d-407e-88da-f13e3338a21f
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Aren't query optimizations a better first step than caching? → asked_at → Better WebPerformance with Rails
context (empty) → Audience Q&A remark.
relation (empty) → asked_at
source_node_id (empty) → acf2a1ca-aa9d-4b14-bf0c-5473fd0599ce
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Should touch on belongs_to be avoided in complex apps? → asked_at → Better WebPerformance with Rails
context (empty) → Audience Q&A challenge about ActiveRecord callbacks.
relation (empty) → asked_at
source_node_id (empty) → 774b5519-af96-4ae3-9306-f31778d58255
target_node_id (empty) → 8a072c53-4edf-401f-8a73-78d7e3b1e763
create Is rendering from cached pages with server-side includes possible in Rails? → about → Fragment Caching
context (empty) → Answer framed around fragment-caching idea.
relation (empty) → about
source_node_id (empty) → 8bf691a8-c6c1-44e5-be01-66014385f2ce
target_node_id (empty) → e5570dc6-83ab-4f05-bf5d-1a5b8e93d9e6
create Does caching still help for complex apps with many models? → about → Fragment Caching
context (empty) → Discusses scaling of caching strategies.
relation (empty) → about
source_node_id (empty) → e90ebcc0-973d-407e-88da-f13e3338a21f
target_node_id (empty) → e5570dc6-83ab-4f05-bf5d-1a5b8e93d9e6
create Aren't query optimizations a better first step than caching? → about → Fragment Caching
context (empty) → Contrasts query optimization with view-layer caching.
relation (empty) → about
source_node_id (empty) → acf2a1ca-aa9d-4b14-bf0c-5473fd0599ce
target_node_id (empty) → e5570dc6-83ab-4f05-bf5d-1a5b8e93d9e6
create Should touch on belongs_to be avoided in complex apps? → about → Use touch: true for fragment cache invalidation
context (empty) → Directly challenges the touch recommendation.
relation (empty) → about
source_node_id (empty) → 774b5519-af96-4ae3-9306-f31778d58255
target_node_id (empty) → 8023c41a-463f-40a2-938f-1054dee5986b
create Phoenix → uses → Elixir
context (empty) → Phoenix is built on Elixir.
relation (empty) → uses
source_node_id (empty) → 14a5108f-b80c-44ea-b8a1-fb8fbf5812e4
target_node_id (empty) → ea3e988a-8cb9-4418-a809-6f894b77c081
create Ruby on Rails → uses → Ruby
context (empty) → Rails is written in Ruby.
relation (empty) → uses
source_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
target_node_id (empty) → c7f25b33-06c9-460e-aca7-fe993123ebee
create Rails 5.2 → uses → Active Storage
context (empty) → Rails 5.2 ships Active Storage.
relation (empty) → uses
source_node_id (empty) → af2a39f2-b541-4e8a-a4da-ea9ede14edbb
target_node_id (empty) → 2834fe94-5598-4e2b-ae0f-322d38f50180
create Rails 5.2 → related_to → Ruby on Rails
context (empty) → Rails 5.2 is a version of Ruby on Rails.
relation (empty) → related_to
source_node_id (empty) → af2a39f2-b541-4e8a-a4da-ea9ede14edbb
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee

Read set

45 nodes

talk Better WebPerformance with Rails search_nodes+get_node_edges talk Optimizing performance in Rails apps with GraphQL layer search_nodes talk No-build Utopia: Modern User Experiences with Rails & Web Standards search_nodes talk When REST is Not Enough: Implementing Alternative Protocols in Ruby on Rails search_nodes talk Securing Rails applications search_nodes talk How I brought LCP down to under 350 ms search_nodes talk Building Rails SPAs in Frontend Ruby with Glimmer DSL for Web search_nodes talk 18 months of using hotwire and viewcomponent in production search_nodes talk Counterintuitive Rails pt. 2 search_nodes talk Multi-region data governance in Rails application search_nodes concept Rails Reload-Safe ES Configuration search_nodes talk Rubyana Gems and the Ractorous Rubetta Stones! search_nodes talk Component Driven UI with ViewComponent search_nodes talk MVCC for Ruby developers search_nodes event wroclove.rb 2018 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2025 search_nodes talk Building LLM powered applications in Ruby search_nodes talk Counterintuitive Rails pt. 1 search_nodes talk Towards the post framework future search_nodes talk Orchestrating video transcoding in ruby search_nodes talk Building on Bluesky's AT Protocol with Ruby search_nodes talk Building uls for microservices search_nodes talk Forms Are Dead: Building Agentic Workflows in Ruby search_nodes talk Spice up your life with eql search_nodes tool dry-struct search_nodes talk Event Sourcing and Actor model in Ruby search_nodes person Stefan Wintermeyer search_nodes tool RealtimeBoard search_nodes person Adam Okoń search_nodes talk Events events events search_nodes person Julik Tarkhanov search_nodes talk Kamal is not harder than your PaaS search_nodes talk Building a Production-Ready AI App: MCP & OAuth on Rails search_nodes tool Ruby on Rails search_nodes talk JRuby: Professional-Grade Ruby search_nodes talk Business logic in Ruby search_nodes tool rails_event_store search_nodes talk Handling file uploads for modern developer search_nodes talk Working with RailsEventStore in Cashflow Management System search_nodes talk Applying CQRS & Event Sourcing on Rails applications search_nodes

2 edges