From 3aeb2b0d5d8e445c6d51ee5de0d7af0376fe48c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Fri, 3 Jul 2026 10:12:27 +0200 Subject: [PATCH] Self-host Inter and DM Mono fonts (#22506) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the two Google Fonts stylesheets with self-hosted fonts via `@fontsource`, imported in the app entry (and Storybook preview), and removes the duplicate Inter that BlockNote was shipping. ## Why - **The caching argument for Google Fonts is dead.** Browsers partition the HTTP cache by top-level site (Chrome 86+, Firefox 85+, Safari even earlier), so a font cached from another website is never reused on ours. Every first-time visitor downloads the fonts either way — Google just adds a detour. - **Faster first paint.** This removes two render-blocking cross-origin stylesheets from `index.html` (DNS + TLS to `fonts.googleapis.com`, then a second connection to `fonts.gstatic.com`, with no preconnect today). The fonts now ship from our own `/assets` alongside the rest of the app, behind the same CDN and cache policy. - **Privacy.** Visitor IPs are no longer sent to Google on every page load. A German court ruled in 2022 that Google Fonts embedding violates GDPR, and privacy-conscious self-hosters currently have no way to opt out of the dependency. - **Air-gapped / offline self-hosted instances** currently render fallback system fonts; they now get the real ones. ## Font unification We were actually loading Inter from two places: the Google stylesheet, plus `@blocknote/core/fonts/inter.css` (8 weights, latin-only, woff+woff2) imported by the two rich-text editors — whichever loaded last won the cascade. Both are gone; `@fontsource` is now the single source: - Inter 400/500/600 (theme weights) + 700 (rich-text bold, previously only covered by the BlockNote copy) - DM Mono 400/500 (DM Mono has no 600 upstream; the old Google link requested one anyway) Fontsource ships the same `unicode-range` subsets as the Google CSS, so browsers still only download the subset they need (~60KB of woff2 for latin), and non-latin locales keep full coverage — which the latin-only BlockNote copy didn't provide. ## Notes - The BlockNote PDF export (`exportBlockNoteEditorToPdf.ts`) still fetches Inter TTFs from `fonts.gstatic.com` at export time — react-pdf needs TTF files, left unchanged here. Review in cubic --- .../twenty-front/.storybook/preview-head.html | 5 ----- packages/twenty-front/.storybook/preview.tsx | 7 +++++++ packages/twenty-front/index.html | 9 --------- packages/twenty-front/package.json | 2 ++ packages/twenty-front/src/index.tsx | 6 ++++++ .../input/components/RichTextFieldEditor.tsx | 1 - .../StandaloneRichTextEditorContent.tsx | 1 - yarn.lock | 16 ++++++++++++++++ 8 files changed, 31 insertions(+), 16 deletions(-) diff --git a/packages/twenty-front/.storybook/preview-head.html b/packages/twenty-front/.storybook/preview-head.html index 534a4fb9be..ed219d82b5 100644 --- a/packages/twenty-front/.storybook/preview-head.html +++ b/packages/twenty-front/.storybook/preview-head.html @@ -1,8 +1,3 @@ - -