Twinned from https://github.com/cfsh/ninefold/issues/268 by tools/beads/import_github.py's reconcile pass.
> 🔒 Claimed by the distribution chat session (workstation, 2026-07-27). Other Claude sessions: do not pick this issue up from the poll loop — PRs for it are coming from the session that filed it.
Concrete plan to get distribution fully sorted, per the decisions in [discussion #223](https://github.com/cfsh/ninefold/discussions/223) ([summary comment](https://github.com/cfsh/ninefold/discussions/223#discussioncomment-17792131)): itch (secret URL) for the public installer download, Cloudflare R2 for static content (manifests, update files, later sample packs), no code signing for now, Supabase stays dedicated to Wavelet EDU.
Existing infra this builds on (mostly #166): installer/ is already a controller-friendly Godot updater — manifest fetch, sha256 diff sync, hash-verified downloads, stale-file cleanup, UDP LAN discovery, and rename-swap self-update. tools/gen_manifest.py generates the manifest; server/ is the LAN dev server + beacon. The work below is largely "point that machinery at the internet", not greenfield.
installer/ (currently only a Linux game preset exists in export_presets.cfg).http://192.168.1.100:8000/ninefold). UDP discovery stays as the LAN fast path — beacon reply found → LAN; no reply → R2. Config gains the {baseUrl, token?} shape from #223 (token optional, sent as a header if present).butler push the installer builds to aedanpope/ninefold channels (windows, linux). Verify the page downloads work, visibility = restricted/secret URL, and add the one-line SmartScreen note ("More info → Run anyway") to the page.static/install-ninefold.sh once the Linux installer build covers the Steam Deck flow (it's the pre-#166 bootstrap).HttpClient, not Godot HttpRequest) so it's unit-testable under shared/ per repo conventions. The installer's Installer.cs logic is the reference implementation.{baseUrl, token?} (+ LAN beacon fast path). Update available → controller-friendly in-game prompt → download to staging (hash-verified) → rename-swap the game files (.exe/.pck/assemblies — rename-aside is legal on a running exe and doubles as rollback) → relaunch. Include an update-while-second-instance-running guard.tools/release/ script: headless Godot export (game + installer) → gen_manifest.py → sync manifest + files to the R2 bucket (rclone or wrangler, R2 is S3-compatible) → butler push installer to itch. One command from a clean checkout.tools/release/README.md).CLOUDFLARE_API_TOKEN).butler push on the sandbox box. butler v15.29.0 is already installed on the workstation (C:\Tools\butler, on PATH) — run butler login there once.user://) — the checksum-keyed CDN plan; separate issue when wanted.PRs will land stacked where they touch the same files, per the normal workflow. Refs #166.
None.
No comments.