README.md

site/ — tx9.col-agents.com

Cloudflare Worker serving tx9's public face (docs/tx9-cli-design.md decision 10): the homepage, the curl | sh installer, and release binary downloads out of an R2 bucket.

URL surface

Route Serves
/ public/index.html homepage
/install (and /install.sh) scripts/install.sh, imported at build time via the src/install.txt symlink — no copy step, can't drift. (The .txt alias is load-bearing: Cloudflare's API WAF rejects worker uploads containing a *.sh module with shell content.)
/releases/latest current version as bare text (e.g. 0.1.0)
/releases/latest/<asset> 302 to the versioned path
/releases/<version>/<asset> binary / checksums.txt from R2

R2 bucket layout (tx9-releases)

latest.txt                    "0.1.0\n" — flipped last during publish
0.1.0/tx9_linux_amd64
0.1.0/tx9_linux_arm64
0.1.0/tx9_darwin_amd64
0.1.0/tx9_darwin_arm64
0.1.0/checksums.txt

.depot/workflows/release.yml writes this on every vX.Y.Z tag push, after attaching the same files to the GitHub release (which tx9 upgrade self-update consumes).

One-time setup

  1. npx wrangler r2 bucket create tx9-releases
  2. Add Depot CI secrets for the release workflow (deploys run on Depot; these are depot ci secrets, not GitHub repo secrets): CLOUDFLARE_API_TOKEN (Workers R2 Storage: edit) and CLOUDFLARE_ACCOUNT_ID.
  3. The routes block in wrangler.jsonc binds tx9.col-agents.com (interim hostname on the col-agents.com Cloudflare zone; swap the pattern when tx9 gets its own domain).

Develop / deploy

cd site
npm install
npm run check    # wrangler types + tsc --noEmit
npm run dev      # local worker with a local R2 stub
npm run deploy

To exercise the release routes locally, seed the dev R2 stub:

printf '0.0.1\n' > /tmp/latest.txt
npx wrangler r2 object put tx9-releases/latest.txt --file /tmp/latest.txt --local