The CMS tells editors that encoding needs Chrome. Three places in the codebase assert it and none of them demonstrate it.
What is actually established
Chrome treats a public page reaching 127.0.0.1 as a private-network request: it sends Access-Control-Request-Private-Network: true on the preflight and drops the real request unless the response grants it. The encoder answers exactly that in api/src/cors.config.ts (privateNetworkAccessMiddleware), registered ahead of the CORS middleware.
That is the whole Chrome-specific mechanism, and it works.
The encoder's native "trust this site" dialog is a separate thing — its own origin allowlist, in the desktop app. It is not a browser feature and works anywhere.
What is not established
That other browsers cannot reach the encoder. The claim appears in:
cms/src/util/mediaEncoder.ts — "Firefox and Safari do not implement the grant, so this is Chrome-only at time of writing."
docs/guides/media-encoder-integration.md — "Use Chrome. Private-network access is Chrome-only at the time of writing."
- The CMS's own notice copy — "Encoding needs Chrome."
All hedged with "at the time of writing", none with a reproduction.
The reasoning is also backwards on its face: a browser that does not implement Private Network Access would not send the preflight and would not need the grant, so the request should succeed under ordinary CORS — which the encoder also answers. Not implementing PNA should mean fewer restrictions, not more.
The guide separately rules out the obvious alternative explanation: "An HTTPS dev CMS reaching http://127.0.0.1 is not blocked as mixed content — browsers treat loopback as potentially trustworthy."
So either there is a different, unwritten reason (Safari's own local-network restrictions are the likeliest candidate), or the claim traces back to a single failed test that became lore.
What to do
With the desktop encoder running, open a CMS on a public origin in Firefox and in Safari and try to encode. Record for each: whether the health check succeeds, whether POST /api/cms/sessions succeeds, whether the encoder's trust dialog appears, and the exact console error if it fails.
Why it matters
If Firefox works, we are telling editors to switch browsers for no reason, and the guide, two code comments and the notice copy should all say so. If it genuinely fails, nobody has written down why — and that reason belongs in the guide, because it is the thing a future reader will need.
Not urgent
The CMS degrades correctly either way. refreshAvailability consults the browser only after the health request fails, never before it, so a browser that reaches the encoder gets the working Encode button whatever its user agent says. A wrong assumption costs a slightly wrong message, not a locked-out editor.
The CMS tells editors that encoding needs Chrome. Three places in the codebase assert it and none of them demonstrate it.
What is actually established
Chrome treats a public page reaching
127.0.0.1as a private-network request: it sendsAccess-Control-Request-Private-Network: trueon the preflight and drops the real request unless the response grants it. The encoder answers exactly that inapi/src/cors.config.ts(privateNetworkAccessMiddleware), registered ahead of the CORS middleware.That is the whole Chrome-specific mechanism, and it works.
The encoder's native "trust this site" dialog is a separate thing — its own origin allowlist, in the desktop app. It is not a browser feature and works anywhere.
What is not established
That other browsers cannot reach the encoder. The claim appears in:
cms/src/util/mediaEncoder.ts— "Firefox and Safari do not implement the grant, so this is Chrome-only at time of writing."docs/guides/media-encoder-integration.md— "Use Chrome. Private-network access is Chrome-only at the time of writing."All hedged with "at the time of writing", none with a reproduction.
The reasoning is also backwards on its face: a browser that does not implement Private Network Access would not send the preflight and would not need the grant, so the request should succeed under ordinary CORS — which the encoder also answers. Not implementing PNA should mean fewer restrictions, not more.
The guide separately rules out the obvious alternative explanation: "An HTTPS dev CMS reaching
http://127.0.0.1is not blocked as mixed content — browsers treat loopback as potentially trustworthy."So either there is a different, unwritten reason (Safari's own local-network restrictions are the likeliest candidate), or the claim traces back to a single failed test that became lore.
What to do
With the desktop encoder running, open a CMS on a public origin in Firefox and in Safari and try to encode. Record for each: whether the health check succeeds, whether
POST /api/cms/sessionssucceeds, whether the encoder's trust dialog appears, and the exact console error if it fails.Why it matters
If Firefox works, we are telling editors to switch browsers for no reason, and the guide, two code comments and the notice copy should all say so. If it genuinely fails, nobody has written down why — and that reason belongs in the guide, because it is the thing a future reader will need.
Not urgent
The CMS degrades correctly either way.
refreshAvailabilityconsults the browser only after the health request fails, never before it, so a browser that reaches the encoder gets the working Encode button whatever its user agent says. A wrong assumption costs a slightly wrong message, not a locked-out editor.