← 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ł Pokrywka → authored → How 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 ms → presented_at → wroclove.rb 2024
context (empty) → Delivered at wroclove.rb 2024.
create Paweł Pokrywka → attended → wroclove.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ł Pokrywka → works_at → Planuj 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 Wesele → uses → Ruby 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 Wesele → uses → Next.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 Wesele → uses → Cloudflare
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 Wesele → uses → Signed 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 ms → about → Largest 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 ms → about → Signed 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 ms → about → Accelerated 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 ms → about → SXG 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 ms → about → Core 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 ms → about → Automatic 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 ms → about → Cloudflare 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 ms → about → Google 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 ms → about → Crawler 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 ms → about → Canary 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 ms → about → Preloading 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 Paint → related_to → Core 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 Exchanges → related_to → Accelerated 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 Exchanges → related_to → Signed 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 Exchanges → related_to → Cloudflare
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 Workers → related_to → Cloudflare
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 Mode → related_to → Cloudflare
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 Cache → related_to → Signed 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 Prefetching → related_to → Signed 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-resource → related_to → SXG 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ł Pokrywka → recommends → Signed 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ł Pokrywka → recommends → Cloudflare
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ł Pokrywka → uses → SXG 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ł Pokrywka → uses → Requestly
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ł Pokrywka → uses → curl
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ł Pokrywka → uses → Google 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 idea → from_talk → How 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 SXG → from_talk → How 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/after → from_talk → How 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 caches → from_talk → How 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 idea → about → Signed 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 SXG → about → Signed 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/after → about → Canary 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_at → How 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? → about → Google 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