← Extractions

How I brought LCP down to under 350 ms — wroclove.rb 2024

Paweł Pokrywka explains how he drove Largest Contentful Paint on planujewesele.pl below 350 ms by adopting Signed Exchanges (SXG) via Cloudflare, including HTML and sub-resource prefetching from Google's SXG cache. He walks through the SXG history (from AMP), Rails/Next.js constraints (no server-side personalization, no cookies, no HSTS), debugging tooling, and a two-dimensional measurement approach based on canary sub-resources.

Model
claude-opus-4-7
Ingestion
9593c813
Input tokens
551,084
fresh
372,944
cached
167,384
cache write
10,756
Output tokens
17,660
Duration
284.2s
Roundtrips
12
Tool calls
26
Cost
$0.00
Nodes/edges extracted
24 / 43
Read set (nodes/edges)
128 / 2

Nodes (24)

update How I brought LCP down to under 350 ms talk
description Talk at wroclove.rb 2024. Paweł Pokrywka's wroclove.rb 2024 talk explaining how he brought Largest Contentful Paint on planujewesele.pl below 3...
short_description Talk at wroclove.rb 2024. Paweł Pokrywka's wroclove.rb 2024 talk on using Signed Exchanges to slash LCP.
update Paweł Pokrywka person
attrs {"nationality" => "Polish"} {"role" => "Founder, co-owner, CTO of Planuj Wesele", "nationality" => "Polish"}
description Conference speaker. At wroclove.rb 2019 gave a lightning talk combining a 12-year spam/email-leak experiment with a c... Conference speaker. Founder, co-owner and CTO of Planuj Wesele, a Polish wedding-vendors directory built on Rails wit...
create Planuj Wesele company
kind (empty) company
name (empty) Planuj Wesele
slug (empty) planuj-wesele
attrs (empty) {"country" => "Poland", "industry" => "wedding vendors directory"}
description (empty) Polish wedding-vendors directory that helps couples find photographers, music bands and other vendors for their weddi...
short_description (empty) Polish wedding-vendors directory (photographers, bands, venues).
create Largest Contentful Paint concept
kind (empty) concept
name (empty) Largest Contentful Paint
slug (empty) largest-contentful-paint
attrs (empty) {"aliases" => "LCP", "category" => "practice"}
description (empty) One of Google's Core Web Vitals. Measures the render time of the largest content element visible in the viewport and ...
short_description (empty) Core Web Vital measuring when a page's largest visible content element renders.
create Core Web Vitals concept
kind (empty) concept
name (empty) Core Web Vitals
slug (empty) core-web-vitals
attrs (empty) {"category" => "practice"}
description (empty) Set of user-centric performance metrics Google uses to quantify page experience, including Largest Contentful Paint. ...
short_description (empty) Google's user-centric performance signals (LCP, FID/INP, CLS) influencing SERP rank.
create Signed Exchanges concept
kind (empty) concept
name (empty) Signed Exchanges
slug (empty) signed-exchanges
attrs (empty) {"aliases" => "SXG", "category" => "architecture", "introduced" => "2018"}
description (empty) Web technology (short name 'sxg') that lets a cacheable HTTP exchange (request + response + headers) be cryptographic...
short_description (empty) Draft web standard letting a third party serve a cryptographically signed copy of a page.
create Accelerated Mobile Pages concept
kind (empty) concept
name (empty) Accelerated Mobile Pages
slug (empty) accelerated-mobile-pages
attrs (empty) {"aliases" => "AMP", "category" => "architecture", "introduced" => "2015"}
description (empty) Google project (short name AMP) launched in 2015 that solved the privacy/control problems of naive prefetching by kee...
short_description (empty) Google's 2015 simplified-HTML framework for prefetching mobile pages from Google servers.
create Cloudflare company
kind (empty) company
name (empty) Cloudflare
slug (empty) cloudflare
attrs (empty) {"industry" => "CDN / edge services"}
description (empty) CDN and edge-services company. In Pawel Pokrywka's talk, Cloudflare is used as the reverse proxy in front of Planuj W...
short_description (empty) CDN and edge-services company offering SXG via a one-click reverse-proxy feature.
create Automatic Signed Exchanges tool
kind (empty) tool
name (empty) Automatic Signed Exchanges
slug (empty) automatic-signed-exchanges
attrs (empty) {"aliases" => "ASX", "category" => "service"}
description (empty) Cloudflare's automated SXG pipeline (ASX). Sitting as a reverse proxy in front of the origin, it parses the HTML resp...
short_description (empty) Cloudflare feature that generates and signs SXG packages, including sub-resource hashes.
create Cloudflare Workers tool
kind (empty) tool
name (empty) Cloudflare Workers
slug (empty) cloudflare-workers
attrs (empty) {"category" => "platform"}
description (empty) Cloudflare's edge-compute platform used in Pokrywka's SXG setup for two fixes: (1) conditionally stripping the Rails-...
short_description (empty) Cloudflare's edge compute platform for running JavaScript on HTTP requests/responses.
create Next.js tool
kind (empty) tool
name (empty) Next.js
slug (empty) next-js
attrs (empty) {"category" => "framework"}
description (empty) React-based meta-framework. Used as the front end for Planuj Wesele's progressive migration away from a pure Rails st...
short_description (empty) React meta-framework for server-rendered and static web applications.
create Google Search Console tool
kind (empty) tool
name (empty) Google Search Console
slug (empty) google-search-console
attrs (empty) {"category" => "service"}
description (empty) Google's site-owner tool. Its URL inspection feature instructs Googlebot to fetch a page and exposes the resulting HT...
short_description (empty) Google tool for site owners to inspect URLs as Googlebot sees them.
create SXG Validator tool
kind (empty) tool
name (empty) SXG Validator
slug (empty) sxg-validator
attrs (empty) {"category" => "tool"}
description (empty) Browser extension that inspects a page and reports whether it implements Signed Exchanges correctly, offering hints. ...
short_description (empty) Browser extension that validates a page's Signed Exchange implementation.
create Requestly tool
kind (empty) tool
name (empty) Requestly
slug (empty) requestly
attrs (empty) {"category" => "tool"}
description (empty) Browser extension that modifies HTTP headers (among other things). Useful for debugging SXG because, unlike curl, it ...
short_description (empty) Browser extension for modifying HTTP requests and response headers.
create Bot Fight Mode concept
kind (empty) concept
name (empty) Bot Fight Mode
slug (empty) bot-fight-mode
attrs (empty) {"category" => "practice"}
description (empty) Cloudflare feature that detects and blocks bot-like HTTP clients. Because curl is classified as a bot, Pokrywka had t...
short_description (empty) Cloudflare feature blocking bot-like requests; must be disabled for curl-based debugging.
create Google SXG Cache concept
kind (empty) concept
name (empty) Google SXG Cache
slug (empty) google-sxg-cache
attrs (empty) {"category" => "architecture"}
description (empty) Opaque, underdocumented Google-operated cache (served under web-pkg-c.com) that stores Signed Exchange packages fetch...
short_description (empty) Google's opaque cache (web-pkg-c.com) that stores and serves Signed Exchange packages.
create SXG Sub-resource Prefetching concept
kind (empty) concept
name (empty) SXG Sub-resource Prefetching
slug (empty) sxg-sub-resource-prefetching
attrs (empty) {"category" => "pattern"}
description (empty) Extension of Signed Exchanges that prefetches critical sub-resources (CSS, JS, images, fonts) together with the main ...
short_description (empty) Prefetching CSS/JS/fonts/images alongside the HTML via hashed entries in the Link header.
create Crawler Budget concept
kind (empty) concept
name (empty) Crawler Budget
slug (empty) crawler-budget
attrs (empty) {"category" => "practice"}
description (empty) SEO concept: each crawler (e.g. Googlebot) imposes a limit on how many requests it will perform against a given site ...
short_description (empty) Per-crawler per-day request budget that bounds how many pages a site gets indexed.
create Canary Sub-resource concept
kind (empty) concept
name (empty) Canary Sub-resource
slug (empty) canary-sub-resource
attrs (empty) {"category" => "practice"}
description (empty) Measurement technique Pokrywka invented for SXG: include a specific sub-resource that is sometimes loaded and use Jav...
short_description (empty) Optional sub-resource used via JS to detect whether SXG prefetching succeeded.
create Ditch the AMP framework, keep the cached-signed-page idea takeaway
kind (empty) takeaway
name (empty) Ditch the AMP framework, keep the cached-signed-page idea
slug (empty) ditch-the-amp-framework-keep-the-cached-signed-page-idea
attrs (empty) {"type" => "insight"}
description (empty) The key design insight behind SXG: AMP had the right idea (cache a trusted page on Google servers, prefetch from ther...
short_description (empty) SXG preserves AMP's privacy and control benefits without its HTML limitations.
create Decouple request from response for SXG takeaway
kind (empty) takeaway
name (empty) Decouple request from response for SXG
slug (empty) decouple-request-from-response-for-sxg
attrs (empty) {"type" => "recommendation"}
description (empty) The biggest mental rewiring required when adopting SXG: stop treating HTTP responses as personalized, request-scoped ...
short_description (empty) Think of SXG responses as independently-lived, cache-friendly artifacts — not request-scoped.
create Measure SXG with a canary, not before/after takeaway
kind (empty) takeaway
name (empty) Measure SXG with a canary, not before/after
slug (empty) measure-sxg-with-a-canary-not-before-after
attrs (empty) {"type" => "recommendation"}
description (empty) Naive before/after measurement of SXG is swamped by seasonal bias, low SXG share of traffic, and the fact that SXG us...
short_description (empty) Compare SXG traffic with working vs broken sub-resource prefetching, not pre- vs post-deploy.
create Bump asset version when debugging multi-layer caches takeaway
kind (empty) takeaway
name (empty) Bump asset version when debugging multi-layer caches
slug (empty) bump-asset-version-when-debugging-multi-layer-caches
attrs (empty) {"type" => "recommendation"}
description (empty) When debugging SXG changes, invalidate every layer of cache (Cloudflare, Google SXG cache, browser cache) at once by ...
short_description (empty) Invalidate Cloudflare, Google SXG and browser caches at once by changing asset versions.
create Does SXG break on its own due to Google changes? question
kind (empty) question
name (empty) Does SXG break on its own due to Google changes?
slug (empty) does-sxg-break-on-its-own-due-to-google-changes
attrs (empty) {"answer_summary" => "Unknown so far — speaker only started measuring error rate to prepare this talk, so can't yet s...
description (empty) After the talk an audience member asks whether, since Google's SXG cache behavior is undocumented, the speaker has to...
short_description (empty) Does SXG need re-measurement even without deployments because Google silently changes things?

Edges (43)

update Paweł PokrywkaauthoredHow I brought LCP down to under 350 ms
context (empty) Speaker of the wroclove.rb 2024 talk on SXG-based LCP optimization.
update How I brought LCP down to under 350 mspresented_atwroclove.rb 2024
context (empty) Delivered at wroclove.rb 2024.
create Paweł Pokrywkaattendedwroclove.rb 2024
context (empty) Gave the LCP/SXG talk at wroclove.rb 2024.
relation (empty) attended
source_node_id (empty) 2d80c770-9d41-4499-9218-c9dc85f49567
target_node_id (empty) 748e0524-a102-41d4-97dc-575881583d91
create Paweł Pokrywkaworks_atPlanuj Wesele
attrs (empty) {"role" => "Founder, co-owner, CTO"}
context (empty) Founder, co-owner and CTO of the wedding-vendors directory.
relation (empty) works_at
source_node_id (empty) 2d80c770-9d41-4499-9218-c9dc85f49567
target_node_id (empty) 7a9aac45-1836-431c-9378-b56efc0b941c
create Planuj WeseleusesRuby on Rails
context (empty) Site was started as a Rails application 16 years before the talk.
relation (empty) uses
source_node_id (empty) 7a9aac45-1836-431c-9378-b56efc0b941c
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Planuj WeseleusesNext.js
context (empty) Migrating front end to Next.js.
relation (empty) uses
source_node_id (empty) 7a9aac45-1836-431c-9378-b56efc0b941c
target_node_id (empty) 3c364ae0-0e7e-4fbc-b2b6-3f4bd983fc17
create Planuj WeseleusesCloudflare
context (empty) Uses Cloudflare as reverse proxy that generates Signed Exchanges and runs Workers.
relation (empty) uses
source_node_id (empty) 7a9aac45-1836-431c-9378-b56efc0b941c
target_node_id (empty) a55e94b3-dde9-43f3-b42b-ba00b37f86a7
create Planuj WeseleusesSigned Exchanges
context (empty) Adopted SXG via Cloudflare to bring LCP below 350 ms.
relation (empty) uses
source_node_id (empty) 7a9aac45-1836-431c-9378-b56efc0b941c
target_node_id (empty) 1739eca0-170a-4eb1-9839-e82fcc9a5c6e
create How I brought LCP down to under 350 msaboutLargest Contentful Paint
context (empty) Entire talk is about bringing LCP below 350 ms.
relation (empty) about
source_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
target_node_id (empty) 8cac055b-bf91-43a3-ac08-c4d025d674e5
create How I brought LCP down to under 350 msaboutSigned Exchanges
context (empty) SXG is the core technology used to reduce LCP.
relation (empty) about
source_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
target_node_id (empty) 1739eca0-170a-4eb1-9839-e82fcc9a5c6e
create How I brought LCP down to under 350 msaboutAccelerated Mobile Pages
context (empty) Talk traces the history from AMP (2015) to SXG (2018).
relation (empty) about
source_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
target_node_id (empty) c1e462e1-a107-4b40-8c90-a50097b4be08
create How I brought LCP down to under 350 msaboutSXG Sub-resource Prefetching
context (empty) Covers sub-resource prefetching as the phase yielding the biggest LCP wins.
relation (empty) about
source_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
target_node_id (empty) 62e16d1d-693f-408e-b79c-155d7f2532eb
create How I brought LCP down to under 350 msaboutCore Web Vitals
context (empty) Frames LCP as one of the Core Web Vitals used by Google ranking.
relation (empty) about
source_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
target_node_id (empty) c0060ee5-2d16-464e-8458-8cf8c4d67078
create How I brought LCP down to under 350 msaboutAutomatic Signed Exchanges
context (empty) Cloudflare's ASX is the concrete implementation used.
relation (empty) about
source_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
target_node_id (empty) 2b9701db-da4f-4f1c-92b8-76809512ae2d
create How I brought LCP down to under 350 msaboutCloudflare Workers
context (empty) Used to strip Rails Link header and rewrite CDN URLs for SXG.
relation (empty) about
source_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
target_node_id (empty) 63c4e445-fe6a-4f2a-9fcf-4f54037b4d65
create How I brought LCP down to under 350 msaboutGoogle SXG Cache
context (empty) Core opaque component at the heart of SXG's behavior and debugging problems.
relation (empty) about
source_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
target_node_id (empty) 0172ea19-6b3d-41ed-b1d5-16402260b0bb
create How I brought LCP down to under 350 msaboutCrawler Budget
context (empty) Motivates 'first impression optimization' to save requests for crawlers.
relation (empty) about
source_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
target_node_id (empty) bb4221cf-2bb9-4688-b02c-8b4e5172de29
create How I brought LCP down to under 350 msaboutCanary Sub-resource
context (empty) Describes the canary approach for detecting successful prefetching.
relation (empty) about
source_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
target_node_id (empty) 7739ced8-ebeb-4083-bb2c-4dca8280a83d
create How I brought LCP down to under 350 msaboutPreloading and Prefetching
context (empty) Talk starts from naive <link rel=prefetch> before introducing SXG.
relation (empty) about
source_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
target_node_id (empty) 48235abe-6f2b-44bf-8ea8-ee16f31ab351
create Largest Contentful Paintrelated_toCore Web Vitals
context (empty) LCP is one of the Core Web Vitals.
relation (empty) related_to
source_node_id (empty) 8cac055b-bf91-43a3-ac08-c4d025d674e5
target_node_id (empty) c0060ee5-2d16-464e-8458-8cf8c4d67078
create Signed Exchangesrelated_toAccelerated Mobile Pages
context (empty) SXG (2018) is the spiritual successor to AMP (2015), solving AMP's limitations.
relation (empty) related_to
source_node_id (empty) 1739eca0-170a-4eb1-9839-e82fcc9a5c6e
target_node_id (empty) c1e462e1-a107-4b40-8c90-a50097b4be08
create Automatic Signed Exchangesrelated_toSigned Exchanges
context (empty) Cloudflare's ASX automates SXG package generation.
relation (empty) related_to
source_node_id (empty) 2b9701db-da4f-4f1c-92b8-76809512ae2d
target_node_id (empty) 1739eca0-170a-4eb1-9839-e82fcc9a5c6e
create Automatic Signed Exchangesrelated_toCloudflare
context (empty) ASX is a Cloudflare feature offered as part of a paid subscription.
relation (empty) related_to
source_node_id (empty) 2b9701db-da4f-4f1c-92b8-76809512ae2d
target_node_id (empty) a55e94b3-dde9-43f3-b42b-ba00b37f86a7
create Cloudflare Workersrelated_toCloudflare
context (empty) Workers are Cloudflare's edge-compute offering.
relation (empty) related_to
source_node_id (empty) 63c4e445-fe6a-4f2a-9fcf-4f54037b4d65
target_node_id (empty) a55e94b3-dde9-43f3-b42b-ba00b37f86a7
create Bot Fight Moderelated_toCloudflare
context (empty) Bot Fight Mode is a Cloudflare feature.
relation (empty) related_to
source_node_id (empty) 60738538-2970-4f13-ac5a-c921374daa7c
target_node_id (empty) a55e94b3-dde9-43f3-b42b-ba00b37f86a7
create Google SXG Cacherelated_toSigned Exchanges
context (empty) Google's SXG cache is the delivery vehicle for SXG packages from SERPs.
relation (empty) related_to
source_node_id (empty) 0172ea19-6b3d-41ed-b1d5-16402260b0bb
target_node_id (empty) 1739eca0-170a-4eb1-9839-e82fcc9a5c6e
create SXG Sub-resource Prefetchingrelated_toSigned Exchanges
context (empty) Extends SXG with prefetching of critical sub-resources.
relation (empty) related_to
source_node_id (empty) 62e16d1d-693f-408e-b79c-155d7f2532eb
target_node_id (empty) 1739eca0-170a-4eb1-9839-e82fcc9a5c6e
create Canary Sub-resourcerelated_toSXG Sub-resource Prefetching
context (empty) Canary is designed to exploit SXG's all-or-nothing sub-resource rule.
relation (empty) related_to
source_node_id (empty) 7739ced8-ebeb-4083-bb2c-4dca8280a83d
target_node_id (empty) 62e16d1d-693f-408e-b79c-155d7f2532eb
create Paweł PokrywkarecommendsSigned Exchanges
context (empty) Despite its quirks, he calls SXG a great technology for UX and performance.
relation (empty) recommends
source_node_id (empty) 2d80c770-9d41-4499-9218-c9dc85f49567
target_node_id (empty) 1739eca0-170a-4eb1-9839-e82fcc9a5c6e
create Paweł PokrywkarecommendsCloudflare
context (empty) Recommends Cloudflare as the easiest path to enable SXG.
relation (empty) recommends
source_node_id (empty) 2d80c770-9d41-4499-9218-c9dc85f49567
target_node_id (empty) a55e94b3-dde9-43f3-b42b-ba00b37f86a7
create Paweł PokrywkausesSXG Validator
context (empty) Uses the SXG Validator browser extension despite its occasional false negatives.
relation (empty) uses
source_node_id (empty) 2d80c770-9d41-4499-9218-c9dc85f49567
target_node_id (empty) 4bfcb7a4-8d1b-43ae-9192-25396b9d494a
create Paweł PokrywkausesRequestly
context (empty) Uses Requestly to modify headers during SXG debugging.
relation (empty) uses
source_node_id (empty) 2d80c770-9d41-4499-9218-c9dc85f49567
target_node_id (empty) 431d952d-0609-4ef3-8d5b-f6e5285173d3
create Paweł Pokrywkausescurl
context (empty) Uses curl to verify SXG responses (with Bot Fight Mode disabled).
relation (empty) uses
source_node_id (empty) 2d80c770-9d41-4499-9218-c9dc85f49567
target_node_id (empty) c24eebf8-1c00-4d2a-bdc0-28eddc3eb4d1
create Paweł PokrywkausesGoogle Search Console
context (empty) Uses URL inspection to see what Googlebot actually receives.
relation (empty) uses
source_node_id (empty) 2d80c770-9d41-4499-9218-c9dc85f49567
target_node_id (empty) 31007c43-180f-4cff-a3e5-c877272dc6ac
create Ditch the AMP framework, keep the cached-signed-page ideafrom_talkHow I brought LCP down to under 350 ms
context (empty) Core design insight distilled from the talk's SXG/AMP comparison.
relation (empty) from_talk
source_node_id (empty) 887e4006-13ed-4f02-855c-ada11068bee5
target_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
create Decouple request from response for SXGfrom_talkHow I brought LCP down to under 350 ms
context (empty) Mental-model recommendation for adopting SXG successfully.
relation (empty) from_talk
source_node_id (empty) 7eba91a2-8f43-4d17-a23c-80a8f8584378
target_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
create Measure SXG with a canary, not before/afterfrom_talkHow I brought LCP down to under 350 ms
context (empty) Measurement methodology recommended in the talk.
relation (empty) from_talk
source_node_id (empty) 736daed6-d024-405c-ab9f-3726e23b1f87
target_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
create Bump asset version when debugging multi-layer cachesfrom_talkHow I brought LCP down to under 350 ms
context (empty) Debugging tip for multi-layer (Cloudflare/Google/browser) caches.
relation (empty) from_talk
source_node_id (empty) cade64da-a4bc-4595-a6f7-29df16494f81
target_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
create Ditch the AMP framework, keep the cached-signed-page ideaaboutSigned Exchanges
context (empty) SXG preserves AMP's caching/privacy idea while removing its framework limits.
relation (empty) about
source_node_id (empty) 887e4006-13ed-4f02-855c-ada11068bee5
target_node_id (empty) 1739eca0-170a-4eb1-9839-e82fcc9a5c6e
create Decouple request from response for SXGaboutSigned Exchanges
context (empty) About making responses cache-friendly enough for SXG.
relation (empty) about
source_node_id (empty) 7eba91a2-8f43-4d17-a23c-80a8f8584378
target_node_id (empty) 1739eca0-170a-4eb1-9839-e82fcc9a5c6e
create Measure SXG with a canary, not before/afteraboutCanary Sub-resource
context (empty) Takeaway centers on using the canary-sub-resource technique.
relation (empty) about
source_node_id (empty) 736daed6-d024-405c-ab9f-3726e23b1f87
target_node_id (empty) 7739ced8-ebeb-4083-bb2c-4dca8280a83d
create Does SXG break on its own due to Google changes?asked_atHow I brought LCP down to under 350 ms
context (empty) Audience Q&A after the wroclove.rb 2024 talk.
relation (empty) asked_at
source_node_id (empty) ef628776-c7be-476c-905f-eb4049411109
target_node_id (empty) 272ab88b-4a4c-4213-8d11-933e0c7124cd
create Does SXG break on its own due to Google changes?aboutGoogle SXG Cache
context (empty) Concerns whether undocumented Google cache behavior silently breaks SXG.
relation (empty) about
source_node_id (empty) ef628776-c7be-476c-905f-eb4049411109
target_node_id (empty) 0172ea19-6b3d-41ed-b1d5-16402260b0bb

Read set

128 nodes

tool ChatGPT search_nodes tool langchainrb search_nodes concept Retrieval Augmented Generation search_nodes concept Vector Database search_nodes tool Elasticsearch search_nodes tool Klaviyo search_nodes takeaway Signed On-the-fly URLs search_nodes concept Data Tokenization search_nodes concept Logux Proxy search_nodes concept Open Banking Provider search_nodes concept Logux Time-Shift Ordering search_nodes company SpaceX search_nodes concept Reservation Pattern search_nodes project logux-rails search_nodes takeaway Enhanced Charisma With Regulators search_nodes concept Atomic Commit search_nodes concept Page Load Time Budget search_nodes tool webpagetest.org search_nodes concept Waterfall Analysis search_nodes talk How I brought LCP down to under 350 ms search_nodes+get_node_edges concept RAIL Performance Model search_nodes takeaway Set a page-load time budget search_nodes concept Preloading and Prefetching search_nodes takeaway UI Data Is Never Truly Fresh search_nodes tool WebP search_nodes resource Rocket Real-Time Benchmark search_nodes person Paweł Pokrywka search_nodes concept DNS geolocation routing search_nodes tool Amazon CloudFront search_nodes tool Amazon Route 53 search_nodes takeaway Sign serverlessforruby.org petition search_nodes company Transloadit search_nodes takeaway Record CloudFront request headers on sessions search_nodes concept Direct Upload to Cloud search_nodes concept GitHub Self-Hosted Runner search_nodes company OVH search_nodes tool jsbundling-rails search_nodes talk Better WebPerformance with Rails search_nodes concept Static Page Caching via nginx search_nodes talk No-build Utopia: Modern User Experiences with Rails & Web Standards search_nodes tool Turbo Frames search_nodes tool Webpacker search_nodes tool cssbundling-rails search_nodes resource The Rails and Hotwire Codex search_nodes tool ViewComponent search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes talk Mutation testing workshop wroclove.rb 2019 search_nodes talk Webmock unmocked search_nodes talk One machine please, make it Turing search_nodes concept Progressive Web Apps search_nodes company Amplifr search_nodes project BBC Sport App search_nodes tool Brotli search_nodes tool Turbo Native search_nodes takeaway Watch WebAssembly for real performance wins search_nodes tool Tailwind CSS search_nodes takeaway Switch on HTTP/2 search_nodes talk Next Token! search_nodes tool Node.js search_nodes tool Preact search_nodes tool React Native search_nodes tool GraphQL search_nodes tool esbuild search_nodes tool React search_nodes concept esbuild Pipeline search_nodes takeaway Adopt CSS-in-JS for modern component-based frontends search_nodes tool nginx search_nodes takeaway CDN is not always the answer search_nodes talk Events events events search_nodes concept AI Agent search_nodes tool RealtimeBoard search_nodes project Nerds and Threads search_nodes takeaway Name Things To Find Their Properties search_nodes tool Ruby on Rails search_nodes concept Cynefin Framework search_nodes event Rails World search_nodes project monolith framework search_nodes tool Ember.js search_nodes resource Woman on Rails search_nodes tool Rack search_nodes tool merb search_nodes takeaway Ruby as a Data Management Language search_nodes tool Discourse search_nodes concept Live Reload search_nodes tool Browserslist search_nodes tool Fulcro Inspect search_nodes tool Ruby Browser Detection Gem search_nodes concept Web-to-Native Bridge search_nodes takeaway Share Browser-Support Config Across Front-End And Back-End search_nodes tool Babel search_nodes concept WebAssembly search_nodes tool server-engine search_nodes company Google search_nodes tool Codecov search_nodes concept Function as a Service search_nodes resource serverlessforruby.org Petition search_nodes tool HTTP/2 search_nodes concept HTTP/2 Server Push search_nodes concept Refresh Tokens in HttpOnly Cookies search_nodes takeaway Keep refresh tokens in HttpOnly Secure SameSite cookies search_nodes tool htmx search_nodes question Protecting against ffmpeg vulnerabilities search_nodes tool curl search_nodes tool jq search_nodes tool dry-cli search_nodes talk Build Your Own Internal CLI Tools Lightning Talk search_nodes tool fish shell search_nodes tool Thor search_nodes concept tus protocol search_nodes tool FFmpeg search_nodes tool curses search_nodes tool macOS say command search_nodes question Do you protect against shared cookies? search_nodes talk Securing Rails applications search_nodes talk Devise pitfalls and way to tighten security search_nodes concept Strong Parameters search_nodes talk Prevent account sharing search_nodes concept HTTP Method Idempotence search_nodes takeaway Rate-limit login forms with a skip path search_nodes takeaway Buy Faster Hardware search_nodes tool AWS Lambda search_nodes company Apply4 search_nodes

2 edges