Closed general

Private source 403s /files/, breaking auto-update for closed-source product pages

John Lauer · 2mo ago ·closed by Colby Knox

Setting source_visibility: private also 403s /files/, which breaks auto-update for every closed-source product page.

Measured live on adom/adom-bridge (2026-08-08), reverted within a minute.

The "closed-source Page" pattern in the wiki-visibility skill (private source + public releases/pkg) is exactly what we want for Adom Bridge: users install the signed binary, nobody reads the Rust. Applying it via adom-wiki page visibility adom/adom-bridge --preset licensed sets the axes correctly:

visibility: public | source_visibility: private | release_visibility: public | pkg_visibility: public

But source_visibility: private gates the entire /files/ store, and that store holds artifacts that MUST stay anonymously readable:

anon request before preset after preset
/api/v1/pages/adom-bridge/files/version.json 200 403
/api/v1/pages/adom-bridge/files/docs/bridge-sdk.md 200 403

Why this is severe rather than cosmetic. version.json is the auto-update manifest that every deployed Adom Bridge polls anonymously on launch and every 4 hours, and it is the documented contract Hydrogen reads to bundle our installer (consumers are explicitly told to read version.json.windows.installer_url and NEVER to construct a filename). A 403 there silently freezes the whole fleet's updater: no error surfaces to the user, installs just stop updating. The same gate 403s docs/*, so a public README that embeds page screenshots renders with broken images to exactly the audience the public readme exists for.

So today the choice is: private source, or a working product. Not both. We reverted to public source to keep the fleet updating.

The ask: a public carve-out for a small set of /files/ paths while source stays private. Any of these would work for us, in preference order:

  1. A conventional always-public prefix, e.g. files/public/** (or keep version.json + docs/** public by convention), served regardless of source_visibility.
  2. A per-file/per-glob visibility override in page metadata, e.g. public_files: ["version.json", "docs/**"].
  3. Treat version.json specially, since it is already a documented cross-page contract.

Why not just move the manifest. Publishing version.json as a release asset instead would break the documented contract that consumers read it from /files/, and would require coordinated changes in every deployed binary plus Hydrogen. The whole point of the contract is that consumers never construct URLs.

Scope. This is not adom-bridge-specific. The "one product = one page" doctrine plus private source means every closed-source product page that ships an auto-updating binary or an illustrated public readme hits this the moment it flips source private. hydrogen-desktop is in the same position.

Happy to test any carve-out mechanism against a real fleet the day it lands.

1 Reply

Colby Knox · 2mo ago

Fixed and live on prod. A source-sealed but listing-public page now keeps a conventional public carve-out anonymously readable, so private source + public product works:

  • version.json at the repo root (the update manifest every client polls),
  • the docs/ tree (public-facing documentation), and
  • an opt-in public/ prefix for anything else,

plus the hero and README-referenced assets that already worked. The carve-out grants SPECIFIC FILE reads only; the source TREE listing and everything under src/ stay sealed, and a .. segment never matches. So you can set adom/adom-bridge back to --preset licensed (private source), and version.json + docs/* keep serving 200 to anon while the Rust stays members-only. Covered by the source-visibility test suite.

Log in to reply.