Date: 2026-06-04
Accepted
Islandr uses two typefaces in the Admin Console and Self-Service Portal:
Both are currently loaded via the Google Fonts CDN (fonts.googleapis.com / fonts.gstatic.com). Icons are inline SVG rendered from a hand-rolled Icons.jsx component — no external icon CDN is involved.
Two independent risks justify a policy change:
Every Google Fonts request transmits the visitor's IP address to Google servers in the US. The Court of Justice of the EU (CJEU) and German courts (LG München I, January 2022) have ruled this a GDPR violation when done without prior, explicit consent. A consent banner is not a practical remedy for a tool whose Admin Console and Self-Service Portal are used without any marketing-consent flow.
The Islandr app is self-hosted on a private VM with a small, known user base — the practical risk is lower than a public SaaS product, but the legal exposure is identical: the GDPR does not distinguish by deployment scale. Self-hosted operators who open the portal to employees carry the same obligation.
Several widely used typefaces (Arial, Calibri, Times New Roman, Segoe UI) are proprietary Microsoft or Monotype property. Using them as embedded webfonts — even by declaring them in font-family stacks — without a commercial web licence is an infringement. This applies even when the font is installed on the end-user's OS.
The fonts Islandr uses (IBM Plex Sans, IBM Plex Mono) are already Apache 2.0-licensed and free to self-host. The risk here is not the current choice but the absence of a documented policy that prevents a future contributor from introducing a proprietary font.
Self-host all fonts. Use open-source-licensed fonts only. No external font or icon CDN.
Concretely:
IBM Plex Sans + IBM Plex Mono (app): download .woff2 files, serve from src/main/resources/META-INF/resources/fonts/, load via @font-face in tokens.css. Remove the Google Fonts <link> tags from index.html.
Icons: already inline SVG — no change needed. The policy explicitly forbids adding an external icon CDN (Font Awesome CDN, Material Icons CDN, etc.) in the future.
Permitted font licence types: SIL Open Font License (OFL), Apache 2.0, MIT. Any other licence requires explicit legal review before use.
Explicitly prohibited:
src: url(...) in @font-face.Scoring vs. self-hosting as baseline. +1 better, 0 equal, -1 worse.
| Criterion | Self-host (baseline) | Google Fonts CDN | CDN + Consent Banner |
|---|---|---|---|
| GDPR compliance (no consent req) | 0 | −1 | 0 |
| Licence clarity | 0 | 0 | 0 |
| Air-gapped / offline operation | 0 | −1 | −1 |
| Performance (no 3rd-party DNS) | 0 | −1 | −1 |
| Implementation effort | 0 | +1 | −1 |
| Maintenance overhead | 0 | +1 | +1 |
| Total | 0 | −1 | −1 |
CDN + Consent Banner scores the same as CDN alone on the relevant axes: it eliminates the GDPR problem but re-introduces it for every user who hasn't consented yet (i.e. first load), and does nothing for air-gapped environments. It also adds significant implementation and UX complexity for what is primarily an admin tool.
.woff2 files for IBM Plex Sans (4 weights × 2 styles ≈ ~300 KB), IBM Plex Mono (3 weights ≈ ~51 KB) add approximately 155 KB to the served assets (Latin1 subset only). With HTTP/2 and Cache-Control: immutable, this is a one-time cost per client..woff2, commit). Security patches to font files are rare but not impossible.src/main/resources/META-INF/resources/fonts/@font-face declarations to tokens.css, remove Google Fonts <link> from index.html