How this site works
The Not-spicy menu, step by step
Concept project · real engineering
Every page here is built to load fast on phone data. Pick a page and a phone, then watch the load ride the route, stop by stop. The restaurant is fictional. The engineering is real, and the timings come from our own lab tests.
Watch a page load
A lab replay of the Not-spicy menu, played back at a speed you can follow. Each bar is one file the phone asks for. The rings on the line are the moments something is drawn; the squares are the moments a script or animation is allowed to start.
Lab replay, emulated network and processor. Measured in CI on 20 Oct 2026 (Manila time), build 2cbdfcb. One real run: the middle of 7, by largest paint. Empty cache, like a first visit. Page clock set to Tuesday 6:30 PM, Manila. How we measured
Turn on JavaScript to replay the load step by step. The table shows the full measured load.
The replay controls couldn’t start. The table shows the measured load.
2.36 s
Done in 2.36 s on Mid-range Android, slow 4G.
- 1 · First byte · 0.00 s
- 2 · Scripts on · 1.22 s
- 3 · Open-now badge · 1.44 s
- 4 · Document ready · 1.44 s
- 5 · Reveals armed · 1.57 s
- 6 · First paint · 1.61 s
- 7 · Largest paint · 1.61 s
- 8 · Filters ready · 2.01 s
- 9 · Loaded · 2.33 s
- 10 · Fonts ready · 2.36 s
| File | Type | Size | Timeline |
|---|---|---|---|
| this page (HTML) | HTML | 8.7 KB | Requested 0.00 s, first byte 0.00 s, done 0.62 s |
| big shoulders display latin font | Font | 34.9 KB | Requested 0.63 s, first byte 0.63 s, done 1.66 s |
| commissioner latin font | Font | 36.1 KB | Requested 0.63 s, first byte 0.63 s, done 1.68 s |
| first script (blocking) Holds first paint | Script | 0.9 KB | Requested 0.63 s, first byte 0.63 s, done 1.22 s, runs 1.22 s to 1.22 s |
| Base script | Script | 5.2 KB | Requested 0.63 s, first byte 0.63 s, done 1.32 s, runs 1.40 s to 1.44 s |
| the stylesheet Holds first paint | Styles | 9.8 KB | Requested 0.63 s, first byte 0.63 s, done 1.40 s |
| menu script | Script | 1.6 KB | Requested 1.44 s, first byte 1.44 s, done 2.00 s, runs 2.01 s to 2.01 s |
| commissioner latin ext font | Font | 30.6 KB | Requested 1.54 s, first byte 1.60 s, done 2.33 s |
| Processor busy | Busy 67 ms at 1.40 s. Busy 95 ms at 1.50 s |
Three phones, one page
| Measure | Desktop, broadband | Mid-range Android, slow 4G | Same phone, slow 3G |
|---|---|---|---|
| First paint | 0.21 s0.21 s to 0.22 s | 1.61 s1.60 s to 1.61 s | 5.10 s5.09 s to 5.15 s |
| Largest paint | 0.21 s0.21 s to 0.22 s | 1.61 s1.60 s to 1.61 s | 5.10 s5.09 s to 5.15 s |
| Document ready | 0.15 s0.15 s to 0.15 s | 1.44 s1.44 s to 1.44 s | 5.12 s5.04 s to 5.13 s |
| Loaded | 0.18 s0.18 s to 0.18 s | 2.33 s2.32 s to 2.34 s | 7.74 s7.73 s to 7.77 s |
| Transferred (KB) | 132.9132.9 to 132.9 | 127.7127.7 to 127.7 | 127.7127.7 to 127.7 |
| Layout shift (CLS) | 0.0000.000 to 0.000 | 0.0000.000 to 0.024 | 0.0240.024 to 0.024 |
Largest paint was p on Desktop, broadband; Largest paint was p on Mid-range Android, slow 4G; Largest paint was p on Same phone, slow 3G.
Every page at a glance
| Page | Desktop, broadband | Mid-range Android, slow 4G | Same phone, slow 3G | |||
|---|---|---|---|---|---|---|
| Largest paint | Transferred (KB) | Largest paint | Transferred (KB) | Largest paint | Transferred (KB) | |
| Home | 0.22 s | 217.2 | 1.64 s | 217.2 | 5.22 s | 244.0 |
| Menu | 0.21 s | 135.8 | 1.60 s | 127.7 | 5.12 s | 127.7 |
| Reserve | 0.19 s | 93.8 | 1.51 s | 93.8 | 4.98 s | 93.8 |
| Visit | 0.20 s | 90.0 | 1.55 s | 90.0 | 4.96 s | 90.0 |
| Gallery | 0.26 s | 368.2 | 1.99 s | 528.2 | 7.14 s | 528.2 |
| Our story | 0.26 s | 118.1 | 2.58 s | 118.1 | 7.86 s | 118.1 |
| Vegetarian | 0.22 s | 133.3 | 1.61 s | 127.8 | 5.09 s | 127.8 |
| Vegan | 0.21 s | 130.7 | 1.59 s | 127.8 | 5.13 s | 127.8 |
| No pork | 0.22 s | 133.2 | 1.61 s | 127.7 | 5.15 s | 127.7 |
| Not spicy | 0.21 s | 132.9 | 1.61 s | 127.7 | 5.10 s | 127.7 |
| Credits | 0.20 s | 91.1 | 1.55 s | 91.1 | 4.99 s | 91.1 |
| Privacy | 0.19 s | 89.8 | 1.54 s | 89.8 | 4.92 s | 89.8 |
| Not found (404) | 0.20 s | 89.0 | 1.54 s | 89.0 | 4.95 s | 89.0 |
How we measured
These are lab measurements. Our test machine loaded each page 7 times in Chromium 156, with the network and processor slowed down to imitate each phone. The pages were served by the same small web server setup as the live site, running on the test machine.
The replay shows one real run: the middle one of 7, by largest paint. The tables give the middle value and, in small type, the middle half of the runs.
Real phones and networks vary more. The radio has to wake up, the signal changes, and the first connection takes extra round trips that emulation only approximates. Use these numbers to compare pages and phones, not as a promise for yours.
The page clock was set to Tuesday 6:30 PM in Manila for every run, so the grill is on and the now dot sits on the grill arc.
Measured on 20 Oct 2026 (Manila time), build 2cbdfcb.
Where we don’t have a number, it says “Not measured yet”. We never fill a gap with a guess.
This page measures nothing about you. Your visit isn’t timed, recorded or sent anywhere.
Sizes use 1,024 bytes to the KB, as browser developer tools do. Speeds use 1,000,000 bits to the Mbit.
Emulation settings
- Desktop, broadband
- Delay added per request: 40 ms
- Download: 10.5 Mbit/s
- Upload: 10.5 Mbit/s
- Processor: not slowed
- Screen: 1280 × 800 at 1×
- Mid-range Android, slow 4G
- Delay added per request: 563 ms
- Download: 1.5 Mbit/s
- Upload: 0.7 Mbit/s
- Processor: 4× slower than the test machine
- Screen: 412 × 823 at 1.75×
- Same phone, slow 3G
- Delay added per request: 2000 ms
- Download: 0.4 Mbit/s
- Upload: 0.4 Mbit/s
- Processor: 4× slower than the test machine
- Screen: 412 × 823 at 1.75×
The delay is added once per request, so it is set higher than a real round trip to stand in for the connection steps emulation skips.
Browser steps are shown as Chromium-based browsers do them; others are similar.
What happens, and why
Showing the diagram for Filtered menu (Vegetarian, Vegan, No pork and Not spicy share it). Pick another page
Nine steps, from before your visit to the minute tick. Open a step to see what happens inside. Point at, focus or tap anything inside to see what sets it off and what it hands on. Every step here is tied to the site’s own code, and an automated check fails if the code changes without the diagram.
Before your visit
Build Prep 4 steps
Done once, before anyone visits: pages, photos and code are prepared as plain files.
Pages rendered once
Every page is turned into finished HTML at build time; the server never assembles pages.
Before your visit
Starts
- Find the file (Server): Published before any visit. Carries: Finished HTML files
Code bundled
Scripts and styles are bundled into files whose names change when their content changes.
Before your visit
Starts
- Cache rules (Server): Content-named files. Carries: A changed file gets a new name, so old copies can be kept a year
Photos prepared
Each photo is saved as AVIF, WebP and JPEG at several widths, plus a tiny blurred preview.
Before your visit
Starts
- Right file chosen (Images): Photo sets ready. Carries: AVIF, WebP and JPEG at several widths
- Blurred preview (Images): Preview written in. Carries: 16 px blurred WebP inside the HTML
Filtered menus
Four filtered menus are pre-built, so filters work even with scripts off.
Before your visit
Starts
- Menu filters (Scripts): Filter already applied. Carries: The page says which diet it shows
While loading
Request The order 3 steps
Your browser finds the server, opens a secure connection and asks for the page.
Find the address
The browser looks up which server answers for gata.ibaocchristian.com.
While loadingBrowser’s own work
Starts
- Secure connection (Request): Address found. Carries: Where the server is
Secure connection
An encrypted connection opens (HTTPS over HTTP/2; HTTP/3 offered for later requests).
While loadingBrowser’s own work
Started by
- Find the address (Request): Address found. Carries: Where the server is
Starts
- Ask for a file (Request): Connection open. Carries: Encrypted HTTP/2
In the replayed run: First byte at 0.00 s (Desktop, broadband) · 0.00 s (Mid-range Android, slow 4G) · 0.00 s (Same phone, slow 3G)
Ask for a file
A GET request names the file and the compression the browser understands.
While loadingBrowser’s own work
Started by
- Secure connection (Request): Connection open. Carries: Encrypted HTTP/2
- Cache rules (Server): Next visit. Carries: Page re-checked (tiny reply if unchanged); bundled code reused without asking
- Fetch early (HTML): Files requested. Carries: Same connection, side by side
- Wait until near (Images): Photo requested. Carries: One file: best format, right width
Starts
- Read-only check (Server): GET request. Carries: Path and accepted compression (zstd, gzip)
Server The kitchen 6 steps
A small web server sends the ready-made file. No database, no code runs per visit.
Read-only check
Only reading is allowed; any attempt to send data is refused.
While loading
Started by
- Ask for a file (Request): GET request. Carries: Path and accepted compression (zstd, gzip)
Starts
- Find the file (Server): Allowed. Carries: The path
Find the file
The ready-made file is looked up; a folder means its index.html; hidden files are never served.
While loading
Started by
- Pages rendered once (Build): Published before any visit. Carries: Finished HTML files
- Read-only check (Server): Allowed. Carries: The path
Starts
- Safety headers (Server): File found. Carries: The file and its type
Safety headers
Headers enforce HTTPS and allow scripts, fonts and images from this site only.
While loading
Started by
- Find the file (Server): File found. Carries: The file and its type
Starts
- Cache rules (Server): Safety headers set. Carries: HTTPS-only, content policy, no framing by others
Cache rules
Pages are re-checked on every visit; bundled code is kept a year; photos and fonts a day.
While loading
Started by
- Code bundled (Build): Content-named files. Carries: A changed file gets a new name, so old copies can be kept a year
- Safety headers (Server): Safety headers set. Carries: HTTPS-only, content policy, no framing by others
Starts
- Compress (Server): Cache rule set. Carries: How long the browser may keep it
- Ask for a file (Request): Next visit. Carries: Page re-checked (tiny reply if unchanged); bundled code reused without asking
Compress
Text files are compressed (zstd or gzip) before they travel.
While loading
Started by
- Cache rules (Server): Cache rule set. Carries: How long the browser may keep it
Starts
- Read the HTML (HTML): Response. Carries: Compressed HTML, status 200 (404 for unknown pages)
- Short log (Server): Logged. Carries: Time, address, method, path, status
Short log
The request is logged for a short period, as the privacy notice says.
While loading
Started by
- Compress (Server): Logged. Carries: Time, address, method, path, status
HTML The plate 5 steps
The browser reads the page top to bottom and builds its structure.
Read the HTML
The parser reads the page as it streams in and builds the document.
While loadingBrowser’s own work
Started by
- Compress (Server): Response. Carries: Compressed HTML, status 200 (404 for unknown pages)
Starts
- Fetch early (HTML): Files spotted early. Carries: Stylesheet, font files, first script, page scripts
- First tiny script (HTML): Reading pauses. Carries: Waits for theme-init.js to arrive and run
- Content complete (HTML): Content in place. Carries: Text, menu, hours and links
- Right file chosen (Images): Photo slots found. Carries: Formats, widths and slot sizes
- Document ready (HTML): End of document. Carries: Page scripts may now run
In the replayed run: First byte at 0.00 s (Desktop, broadband) · 0.00 s (Mid-range Android, slow 4G) · 0.00 s (Same phone, slow 3G); html received at 0.05 s (Desktop, broadband) · 0.62 s (Mid-range Android, slow 4G) · 2.21 s (Same phone, slow 3G); dom interactive at 0.11 s (Desktop, broadband) · 1.23 s (Mid-range Android, slow 4G) · 4.30 s (Same phone, slow 3G)
Fetch early
The browser spots the stylesheet, fonts and scripts early and requests them together.
While loadingBrowser’s own work
Started by
- Read the HTML (HTML): Files spotted early. Carries: Stylesheet, font files, first script, page scripts
Starts
- Ask for a file (Request): Files requested. Carries: Same connection, side by side
- Stylesheet (Styles and paint): Stylesheet arrives. Carries: One CSS file, compressed
- The font (Styles and paint): Fonts arrive. Carries: Two WOFF2 files
- Page scripts start (Scripts): Scripts arrive. Carries: Bundled JavaScript, compressed
First tiny script
A small script runs before the first paint; reading pauses until it arrives.
While loading
Started by
- Read the HTML (HTML): Reading pauses. Carries: Waits for theme-init.js to arrive and run
- Dismiss notice (Your actions): Next page, this tab. Carries: Notice hidden before the first paint
Starts
- Script-ready look (Styles and paint): Classes on the page. Carries: "js"; "sd" (Save-Data); notice hidden if dismissed; scrollbar size; entrance flag
In the replayed run: Scripts on at 0.11 s (Desktop, broadband) · 1.22 s (Mid-range Android, slow 4G) · 4.29 s (Same phone, slow 3G)
Content complete
Text, menu, hours and links are all in the HTML, readable without any script.
While loading
Started by
- Read the HTML (HTML): Content in place. Carries: Text, menu, hours and links
Starts
- Extra letters (Styles and paint): Character needs it. Carries: For example ₱ (U+20B1)
Document ready
Parsing ends, the page scripts run, then DOMContentLoaded fires.
While loadingBrowser’s own work
Started by
- Read the HTML (HTML): End of document. Carries: Page scripts may now run
- Page scripts start (Scripts): Scripts finished. Carries: Then DOMContentLoaded fires
In the replayed run: Document ready at 0.15 s (Desktop, broadband) · 1.44 s (Mid-range Android, slow 4G) · 5.13 s (Same phone, slow 3G)
Styles and paint Plating 6 steps
One stylesheet and a font decide how it looks; then the browser draws it.
Stylesheet
One stylesheet for the whole site; nothing is drawn until it has arrived.
While loading
Started by
- Fetch early (HTML): Stylesheet arrives. Carries: One CSS file, compressed
Starts
- First paint (Styles and paint): Stylesheet ready. Carries: Nothing is drawn before this
- Page scripts start (Scripts): Scripts wait for styles. Carries: Page scripts run only after the stylesheet
The font
The font loads early; text shows at once in a size-matched stand-in, then swaps.
While loading
Started by
- Fetch early (HTML): Fonts arrive. Carries: Two WOFF2 files
Starts
- Largest paint (Styles and paint): Font swaps in. Carries: Text redrawn in the real font; stand-in was size-matched
In the replayed run: Fonts ready at 0.27 s (Desktop, broadband) · 2.36 s (Mid-range Android, slow 4G) · 7.78 s (Same phone, slow 3G)
Extra letters
A second font file loads only if the page uses a character from it, such as ₱.
While loading
Started by
- Content complete (HTML): Character needs it. Carries: For example ₱ (U+20B1)
Script-ready look
A class set before the first paint switches on controls that need scripts, with no flash.
While loading
Started by
- First tiny script (HTML): Classes on the page. Carries: "js"; "sd" (Save-Data); notice hidden if dismissed; scrollbar size; entrance flag
Starts
- First paint (Styles and paint): Right controls at first paint. Carries: No flash of the no-script layout
First paint
The browser first draws text and colour on the screen.
While loadingBrowser’s own work
Started by
- Stylesheet (Styles and paint): Stylesheet ready. Carries: Nothing is drawn before this
- Script-ready look (Styles and paint): Right controls at first paint. Carries: No flash of the no-script layout
- Blurred preview (Images): Preview paints too. Carries: Inside the page, no extra request
Starts
- Largest paint (Styles and paint): More is drawn. Carries: Largest block in view so far
In the replayed run: fp at 0.21 s (Desktop, broadband) · 1.61 s (Mid-range Android, slow 4G) · 5.10 s (Same phone, slow 3G); First paint at 0.21 s (Desktop, broadband) · 1.61 s (Mid-range Android, slow 4G) · 5.10 s (Same phone, slow 3G)
Largest paint
The biggest text block or photo in view is drawn; which one is measured per page.
While loadingBrowser’s own work
Started by
- First paint (Styles and paint): More is drawn. Carries: Largest block in view so far
- The font (Styles and paint): Font swaps in. Carries: Text redrawn in the real font; stand-in was size-matched
- Fade in (Images): Photo arrives. Carries: Fades in over its preview (300 ms, set in code)
In the replayed run: Largest paint at 0.21 s (Desktop, broadband) · 1.61 s (Mid-range Android, slow 4G) · 5.10 s (Same phone, slow 3G)
Scripts Service 7 steps
Small scripts add live time, controls and motion. Everything is readable without them.
Page scripts start
Bundled scripts download in parallel and run in order once the HTML is read.
While loadingBrowser’s own work
Started by
- Fetch early (HTML): Scripts arrive. Carries: Bundled JavaScript, compressed
- Stylesheet (Styles and paint): Scripts wait for styles. Carries: Page scripts run only after the stylesheet
Starts
- Document ready (HTML): Scripts finished. Carries: Then DOMContentLoaded fires
- Notice button (Scripts): Step 1
- Pages menu (Scripts): Step 2
- Open-now badge (Scripts): Step 3
- Fade in (Images): Step 5. Carries: Photos not yet loaded are marked
- Page-only code (Scripts): Step 7. Carries: Checks which page this is
- Reveal setup (Scripts): Step 8, next frame
In the replayed run: script eval at 0.11 s (Desktop, broadband) · 1.22 s (Mid-range Android, slow 4G) · 4.29 s (Same phone, slow 3G)
Notice button
The concept notice gets its dismiss button.
While loading
Pages menu
On narrow screens, the Pages button opens a sheet that keeps keyboard focus inside.
While loading
Narrow screens
Open-now badge
Manila time decides "Open now" or "Closed" and marks today in the hours table.
While loading
Started by
- Page scripts start (Scripts): Step 3
- Minute tick (Clock and page life): Every minute. Carries: Manila weekday and minute (on the minute)
Starts
- Minute tick (Clock and page life): Joins the minute tick. Carries: Badge refresh
In the replayed run: Open-now badge at 0.15 s (Desktop, broadband) · 1.44 s (Mid-range Android, slow 4G) · 5.13 s (Same phone, slow 3G)
Page-only code
Extra code downloads only on pages that need it: menu, gallery and reservation.
While loading
Started by
- Page scripts start (Scripts): Step 7. Carries: Checks which page this is
Starts
- Menu filters (Scripts): Menu page found. Carries: Menu code (separate file)
Reveal setup
One frame later, only content below the fold is set to appear as you scroll.
While loading
Only with motion allowed
Started by
- Page scripts start (Scripts): Step 8, next frame
Starts
- Scroll reveals (Your actions): Waiting groups watched. Carries: Below the fold only; line at 90% of the screen
- Safety net (Clock and page life): Safety timer. Carries: Show everything (2 s, set in code)
- Keyboard first (Your actions): Focus listener
In the replayed run: Reveals armed at 0.19 s (Desktop, broadband) · 1.57 s (Mid-range Android, slow 4G) · 5.14 s (Same phone, slow 3G)
Images Garnish 4 steps
Photos arrive in the best format and size for your screen, only when needed.
Blurred preview
A tiny blurred version is inside the page itself and shows with the first paint.
While loading
Started by
- Photos prepared (Build): Preview written in. Carries: 16 px blurred WebP inside the HTML
Starts
- First paint (Styles and paint): Preview paints too. Carries: Inside the page, no extra request
Right file chosen
The browser picks AVIF, WebP or JPEG at the width your screen needs.
While loadingBrowser’s own work
Started by
- Photos prepared (Build): Photo sets ready. Carries: AVIF, WebP and JPEG at several widths
- Read the HTML (HTML): Photo slots found. Carries: Formats, widths and slot sizes
Starts
- Wait until near (Images): Off-screen photo. Carries: Waits
Wait until near
Photos further down wait until you scroll close to them.
As you scrollBrowser’s own work
Started by
- Scroll reveals (Your actions): Scrolling near photos. Carries: The browser starts their download
- Right file chosen (Images): Off-screen photo. Carries: Waits
Starts
- Ask for a file (Request): Photo requested. Carries: One file: best format, right width
Fade in
A photo that arrives late fades in over its preview.
After loading
Only with motion allowed
Started by
- Page scripts start (Scripts): Step 5. Carries: Photos not yet loaded are marked
Starts
- Largest paint (Styles and paint): Photo arrives. Carries: Fades in over its preview (300 ms, set in code)
When you act
Your actions You 6 steps
Taps, clicks, keys and scrolling. Nothing you do here sends data anywhere.
Scroll reveals
Content rises or draws in once as it nears the screen, then stays still.
As you scroll
Only with motion allowed
Started by
- Where am I (Your actions): Jump skips reveals. Carries: Sections passed by a jump show at once
- Reveal setup (Scripts): Waiting groups watched. Carries: Below the fold only; line at 90% of the screen
Starts
- Wait until near (Images): Scrolling near photos. Carries: The browser starts their download
Keyboard first
Tabbing into content that has not appeared yet shows it at once.
When you act
Started by
- Reveal setup (Scripts): Focus listener
Dismiss notice
Closing the concept notice hides it for this tab only.
When you act
Started by
- Notice button (Scripts): Button wired
Starts
- First tiny script (HTML): Next page, this tab. Carries: Notice hidden before the first paint
Open Pages
The sheet opens; Esc closes it and focus returns to the button.
When you act
Narrow screens
Started by
- Pages menu (Scripts): Button wired
Diet chips
Filters combine in place; the address updates; nothing is requested.
When you act
Started by
- Menu filters (Scripts): Chips wired. Carries: Active filters
Where am I
Scrolling marks the current category in the sticky bar, once per frame.
As you scroll
Started by
- Menu filters (Scripts): Scroll listener. Carries: Category positions
Starts
- Scroll reveals (Your actions): Jump skips reveals. Carries: Sections passed by a jump show at once
Every minute
Clock and page life Kitchen timer 3 steps
A once-a-minute tick keeps the time-based text right; leaving and returning are handled.
Minute tick
One timer on each minute boundary refreshes every piece of time-based text.
Every minute
Started by
- Open-now badge (Scripts): Joins the minute tick. Carries: Badge refresh
- Leave and return (Clock and page life): pagehide / pageshow. Carries: Stop on leave; refresh and restart on Back
Starts
- Open-now badge (Scripts): Every minute. Carries: Manila weekday and minute (on the minute)
Leave and return
Leaving stops the timer; coming back with Back refreshes the time at once.
Leaving and coming back
Starts
- Minute tick (Clock and page life): pagehide / pageshow. Carries: Stop on leave; refresh and restart on Back
Safety net
If scroll tracking never reports, all content shows anyway.
After loading
Only with motion allowed
Started by
- Reveal setup (Scripts): Safety timer. Carries: Show everything (2 s, set in code)
About this project
Gata at Baga is a fictional restaurant, built as a concept project to show what a Philippine food business’s website can do on a phone. The menu, prices, address and phone number are samples, and the photos are illustrative. What this page shows is the site’s own engineering, measured by our lab tests.
Designed and built by Christian Ibaoc · ibaocchristian.com.