# 10 - SPA Runtime Branding Shim
> Why the static `
ARRFLIX` patch wasn't enough, what the shim does,
> and how to extend it when Jellyfin starts overwriting more state on upgrade.
Last verified: 2026-05-08 against Jellyfin 10.10.3 web bundle.
---
## TL;DR
`/web/index.html` already says `ARRFLIX` and embeds our logo as the
favicon (data URL). The browser tab still showed "Jellyfin" + the Jellyfin teal
triangle because **Jellyfin's SPA overwrites `document.title` at runtime** as it
hydrates. Two compounding effects:
1. **SPA runtime overwrite (primary cause).** Bundle code does
`document.title = d.Ay.translateHtml(document.title ...)` and per-route updates
via `LibraryMenu.setTitle` / `Page.setTitle`. Whatever the static `` is,
the SPA will replace it on first hydrate and again on every navigation.
2. **Service worker churn (secondary).** `serviceworker.js` registers and calls
`self.clients.claim()`. The shipped SW does NOT actually cache `index.html`
(it's a notification-only worker), but its presence still pins old clients
to whatever they had at first paint. Killing the SW once forces a clean reload.
Fix: a tiny self-contained shim in ``, INLINE, BEFORE the bundle scripts.
It enforces the title and favicon both on hydrate and on every later DOM mutation.
---
## What the shim does
Lives in `web-overrides/index.html` between `` /
`-END` markers. Insertion is idempotent via `bin/inject-shim.py` (re-running the
script REPLACES the existing block instead of stacking duplicates).
Behaviour:
| Step | When | What |
|------|------|------|
| 1 | Page parse | `