Concept site: Gata at Baga is a fictional restaurant. Please don’t try to visit!

How this site works

The Vegetarian 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 Vegetarian 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

Phone and network

Turn on JavaScript to replay the load step by step. The table shows the full measured load.

2.36 s

Done in 2.36 s on Mid-range Android, slow 4G.

  1. 1 · First byte · 0.00 s
  2. 2 · Scripts on · 1.22 s
  3. 3 · Open-now badge · 1.44 s
  4. 4 · Document ready · 1.44 s
  5. 5 · Reveals armed · 1.58 s
  6. 6 · First paint · 1.61 s
  7. 7 · Largest paint · 1.61 s
  8. 8 · Filters ready · 2.02 s
  9. 9 · Loaded · 2.33 s
  10. 10 · Fonts ready · 2.36 s
Files the Vegetarian menu asked for, Mid-range Android, slow 4G
FileTypeSizeTimeline
this page (HTML)HTML8.7 KBRequested 0.00 s, first byte 0.00 s, done 0.62 s
big shoulders display latin fontFont34.9 KBRequested 0.63 s, first byte 0.63 s, done 1.66 s
commissioner latin fontFont36.1 KBRequested 0.63 s, first byte 0.63 s, done 1.68 s
first script (blocking) Holds first paintScript0.9 KBRequested 0.63 s, first byte 0.63 s, done 1.22 s, runs 1.22 s to 1.22 s
the stylesheet Holds first paintStyles9.8 KBRequested 0.63 s, first byte 0.63 s, done 1.40 s
Base scriptScript5.2 KBRequested 0.63 s, first byte 0.63 s, done 1.33 s, runs 1.40 s to 1.44 s
menu scriptScript1.6 KBRequested 1.44 s, first byte 1.44 s, done 2.01 s, runs 2.01 s to 2.02 s
commissioner latin ext fontFont30.6 KBRequested 1.54 s, first byte 1.60 s, done 2.33 s
Processor busyBusy 71 ms at 1.40 s. Busy 97 ms at 1.50 s
Speed

Three phones, one page

Vegetarian menu: middle run of 7, with the middle half in small type
MeasureDesktop, broadbandMid-range Android, slow 4GSame phone, slow 3G
First paint0.22 s0.21 s to 0.22 s1.61 s1.60 s to 1.61 s5.09 s5.09 s to 5.13 s
Largest paint0.22 s0.21 s to 0.22 s1.61 s1.60 s to 1.61 s5.09 s5.09 s to 5.13 s
Document ready0.15 s0.15 s to 0.15 s1.44 s1.44 s to 1.44 s5.12 s5.01 s to 5.12 s
Loaded0.18 s0.18 s to 0.18 s2.33 s2.32 s to 2.33 s7.74 s7.74 s to 7.74 s
Transferred (KB)133.3133.3 to 133.3127.8127.8 to 127.8127.8127.8 to 127.8
Layout shift (CLS)0.0000.000 to 0.0000.0000.000 to 0.0000.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
Largest paint and data transferred for all 13 pages, by phone
PageDesktop, broadbandMid-range Android, slow 4GSame phone, slow 3G
Largest paintTransferred (KB)Largest paintTransferred (KB)Largest paintTransferred (KB)
Home0.22 s217.21.64 s217.25.22 s244.0
Menu0.21 s135.81.60 s127.75.12 s127.7
Reserve0.19 s93.81.51 s93.84.98 s93.8
Visit0.20 s90.01.55 s90.04.96 s90.0
Gallery0.26 s368.21.99 s528.27.14 s528.2
Our story0.26 s118.12.58 s118.17.86 s118.1
Vegetarian0.22 s133.31.61 s127.85.09 s127.8
Vegan0.21 s130.71.59 s127.85.13 s127.8
No pork0.22 s133.21.61 s127.75.15 s127.7
Not spicy0.21 s132.91.61 s127.75.10 s127.7
Credits0.20 s91.11.55 s91.14.99 s91.1
Privacy0.19 s89.81.54 s89.84.92 s89.8
Not found (404)0.20 s89.01.54 s89.04.95 s89.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.

  1. Before your visit

    Build Prep 4 steps

    Done once, before anyone visits: pages, photos and code are prepared as plain files.

    1. 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
    2. 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
    3. 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
    4. 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
  2. While loading

    Request The order 3 steps

    Your browser finds the server, opens a secure connection and asks for the page.

    1. Find the address

      The browser looks up which server answers for gata.ibaocchristian.com.

      While loadingBrowser’s own work

      Starts

    2. Secure connection

      An encrypted connection opens (HTTPS over HTTP/2; HTTP/3 offered for later requests).

      While loadingBrowser’s own work

      Started by

      Starts

      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)

    3. 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)
  3. Server The kitchen 6 steps

    A small web server sends the ready-made file. No database, no code runs per visit.

    1. 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

    2. 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

      Starts

    3. 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
    4. 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
    5. 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
    6. 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
  4. HTML The plate 5 steps

    The browser reads the page top to bottom and builds its structure.

    1. 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.12 s (Desktop, broadband) · 1.25 s (Mid-range Android, slow 4G) · 4.30 s (Same phone, slow 3G)

    2. 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
    3. 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)

    4. 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)
    5. 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.12 s (Same phone, slow 3G)

  5. Styles and paint Plating 6 steps

    One stylesheet and a font decide how it looks; then the browser draws it.

    1. 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
    2. 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.76 s (Same phone, slow 3G)

    3. Extra letters

      A second font file loads only if the page uses a character from it, such as ₱.

      While loading

      Started by

    4. 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
    5. 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.22 s (Desktop, broadband) · 1.61 s (Mid-range Android, slow 4G) · 5.09 s (Same phone, slow 3G); First paint at 0.22 s (Desktop, broadband) · 1.61 s (Mid-range Android, slow 4G) · 5.09 s (Same phone, slow 3G)

    6. 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.22 s (Desktop, broadband) · 1.61 s (Mid-range Android, slow 4G) · 5.09 s (Same phone, slow 3G)

  6. Scripts Service 7 steps

    Small scripts add live time, controls and motion. Everything is readable without them.

    1. 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

      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)

    2. Notice button

      The concept notice gets its dismiss button.

      While loading

      Started by

      Starts

    3. Pages menu

      On narrow screens, the Pages button opens a sheet that keeps keyboard focus inside.

      While loading

      Narrow screens

      Started by

      Starts

    4. Open-now badge

      Manila time decides "Open now" or "Closed" and marks today in the hours table.

      While loading

      Started by

      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.12 s (Same phone, slow 3G)

    5. Page-only code

      Extra code downloads only on pages that need it: menu, gallery and reservation.

      While loading

      Started by

      Starts

      • Menu filters (Scripts): Menu page found. Carries: Menu code (separate file)
    6. 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

      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.58 s (Mid-range Android, slow 4G) · 5.14 s (Same phone, slow 3G)

    7. Menu filters

      The chosen diet (from the page or the address) is applied and the count updated.

      While loading

      Started by

      • Filtered menus (Build): Filter already applied. Carries: The page says which diet it shows
      • Page-only code (Scripts): Menu page found. Carries: Menu code (separate file)

      Starts

      • Diet chips (Your actions): Chips wired. Carries: Active filters
      • Where am I (Your actions): Scroll listener. Carries: Category positions

      In the replayed run: Filters ready at 0.20 s (Desktop, broadband) · 2.02 s (Mid-range Android, slow 4G) · 7.17 s (Same phone, slow 3G)

  7. Images Garnish 4 steps

    Photos arrive in the best format and size for your screen, only when needed.

    1. 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
    2. 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

    3. 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
    4. Fade in

      A photo that arrives late fades in over its preview.

      After loading

      Only with motion allowed

      Started by

      Starts

      • Largest paint (Styles and paint): Photo arrives. Carries: Fades in over its preview (300 ms, set in code)
  8. When you act

    Your actions You 6 steps

    Taps, clicks, keys and scrolling. Nothing you do here sends data anywhere.

    1. 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
    2. Keyboard first

      Tabbing into content that has not appeared yet shows it at once.

      When you act

      Started by

    3. Dismiss notice

      Closing the concept notice hides it for this tab only.

      When you act

      Started by

      Starts

      • First tiny script (HTML): Next page, this tab. Carries: Notice hidden before the first paint
    4. Open Pages

      The sheet opens; Esc closes it and focus returns to the button.

      When you act

      Narrow screens

      Started by

    5. 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
    6. 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
  9. 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.

    1. 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)
    2. 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
    3. 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.