04 distribution
sys: net-new — no releases table, no r2 binding, no download routes exist today
releases
publish, channel state, and yank for the seven products. everything here writes the shared mock store — the portal app dossiers read it live in this browser.
| product | latest stable | latest beta | last published | open |
|---|---|---|---|---|
| owlette | v3.2.4 | v3.3.0-beta.1 | 2026-09-02 | → |
| Moonshine | v2.4.0 | v2.5.0-beta.2 | 2026-08-27 | → |
| Transmission | v5.1.0 | — | 2026-08-11 | → |
| Starlight | v1.8.2 | — | 2026-07-08 | → |
| Constellation | v4.2.0 | — | 2026-06-30 | → |
| phase | — | v0.9.4 | 2026-08-24 | → |
| Latticus | v2.1.0 | — | 2026-05-19 | → |
§7 distribution contract
sys: net-new — proposed routes — none deployed
# public — cacheable; product sites + in-app update checks
GET /v1/products/:slug/releases?channel=stable|beta
→ [{ version, channel, published_at, notes_md, yanked,
artifacts: [{ os, arch, size_bytes, sha256 }] }]
GET /v1/products/:slug/releases/latest?channel=stable
→ { version: "3.2.4", channel: "stable", published_at: "2026-09-02",
notes_md: "…", artifacts: [{ os:"windows", arch:"x64",
size_bytes: 88300544, sha256: "9f2c…" }],
download_url: "https://id.tridant.io/apps/owlette" }
# gated — verifies entitlement + live standing + major_version_cap (vmax),
# logs a download_event, 302s to a short-lived signed R2 URL
POST /v1/me/downloads { product, version, os, arch } # portal session
POST /v1/licenses/:key/download { version, os, arch } # app / S2S
# admin — R2 direct-upload + finalize; yank
POST /v1/admin/products/:id/releases
POST /v1/admin/releases/:id/yank · product sites render their own version badge + notes from the public read and route the download click to id.tridant.io/apps/:slug
· products.current_version becomes derived — the latest non-yanked stable in this table, single source of truth
· major_version_cap finally enforced — at the gated endpoint and visibly in the portal ledger
10 stations