Privacy: every page load contacts fonts.googleapis.com / fonts.gstatic.com for the VT323 font — self-host it #214

Open
opened 2026-09-18 19:11:16 -04:00 by jared · 1 comment
Owner

Found while verifying #186 (counting third-party hosts contacted on load): the only external hosts on a plain page load are fonts.googleapis.com and fonts.gstatic.com, from index.html:30-32:

<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=VT323&display=swap" rel="stylesheet" />

That sends every visitor's IP + referrer to Google on every load (and is a GDPR problem in the EU per the 2022 Munich ruling), which sits badly next to the landing page's "No ads or tracking". VT323 is OFL-licensed: vendor the .woff2 into public/fonts/, declare it with @font-face in the TDS stylesheet, drop the three tags, and remove fonts.googleapis.com / fonts.gstatic.com from the prod CSP style-src / font-src (matrix repo nginx.conf) so a regression fails loudly. The desktop CSP (tauri.conf.json) likely lists them too.

Found while verifying #186 (counting third-party hosts contacted on load): the only external hosts on a plain page load are `fonts.googleapis.com` and `fonts.gstatic.com`, from `index.html:30-32`: ```html <link rel="preconnect" href="https://fonts.googleapis.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link href="https://fonts.googleapis.com/css2?family=VT323&display=swap" rel="stylesheet" /> ``` That sends every visitor's IP + referrer to Google on every load (and is a GDPR problem in the EU per the 2022 Munich ruling), which sits badly next to the landing page's "No ads or tracking". VT323 is OFL-licensed: vendor the `.woff2` into `public/fonts/`, declare it with `@font-face` in the TDS stylesheet, drop the three tags, and remove `fonts.googleapis.com` / `fonts.gstatic.com` from the prod CSP `style-src` / `font-src` (matrix repo nginx.conf) so a regression fails loudly. The desktop CSP (`tauri.conf.json`) likely lists them too.
jared added this to the Features 2026-Q4 milestone 2026-09-18 19:11:16 -04:00
jared added the priority: mediumsecurityarea: appearance labels 2026-09-18 19:11:16 -04:00
Author
Owner

Done across the three repos:

  • cinny 6f250353: VT323 (OFL) vendored as latin + latin-ext woff2 subsets in public/fonts/ with @font-face in the existing custom-fonts.css; the three Google tags removed from index.html. Also deleted three unreferenced JetBrainsMono-{400,600,700}.woff2 that turned out to be 1.6 kB Google 404 HTML pages, not fonts. Verified headless: no third-party host on a plain load (only the homeserver), document.fonts.load('16px VT323') resolves from /fonts/VT323-latin.woff2.
  • matrix c553c28: cinny/nginx.conf CSP drops fonts.googleapis.com from style-src and fonts.gstatic.com from font-src.
  • cinny-desktop 83c89b8: same two hosts dropped from the Tauri CSP.

⚠️ One manual step for you: per the matrix README the live web config is hand-maintained at /etc/nginx/sites-available/cinny on LXC 106 — apply the same two CSP edits there (after the cinny deploy lands, so the old bundle isn't briefly blocked from Google) and nginx -s reload. Leaving this open until that's done.

Done across the three repos: - **cinny `6f250353`**: VT323 (OFL) vendored as latin + latin-ext woff2 subsets in `public/fonts/` with `@font-face` in the existing `custom-fonts.css`; the three Google tags removed from `index.html`. Also deleted three unreferenced `JetBrainsMono-{400,600,700}.woff2` that turned out to be 1.6 kB Google **404 HTML pages**, not fonts. Verified headless: no third-party host on a plain load (only the homeserver), `document.fonts.load('16px VT323')` resolves from `/fonts/VT323-latin.woff2`. - **matrix `c553c28`**: `cinny/nginx.conf` CSP drops `fonts.googleapis.com` from `style-src` and `fonts.gstatic.com` from `font-src`. - **cinny-desktop `83c89b8`**: same two hosts dropped from the Tauri CSP. ⚠️ **One manual step for you:** per the matrix README the live web config is hand-maintained at `/etc/nginx/sites-available/cinny` on LXC 106 — apply the same two CSP edits there (after the cinny deploy lands, so the old bundle isn't briefly blocked from Google) and `nginx -s reload`. Leaving this open until that's done.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#214