eleven / ocho Public

docs: server-releases.md catches up with arm64 + rolling assets (#438)

The doc predated the arm64 pipeline and the installer: per-build releases
now carry both arches, the rolling release carries latest-stable binaries +
install.sh + the feed, its README is the synced self-hosting guide, and the
manifest example shows the additive arm64_* fields. Also records the
asset-CDN staleness gotcha we hit live.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Paul Campbell 4c625c8d14fe596c4cf2a8c486ece5659a8fcbb8 parent 4a633f2
1 file changed, +29 −8
  • docs/server-releases.md +29 −8
diff --git a/docs/server-releases.md b/docs/server-releases.md
index 6c5b1c5..d53339f 100644
--- a/docs/server-releases.md
+++ b/docs/server-releases.md
@@ -16,14 +16,28 @@ app's Sparkle appcast uses, see `ios/release-mac.sh`):
- **One release per build**: tag `server-<ver>` (ver = the git short sha that
`deploy/build-linux.sh` stamps into the binary as `main.buildVersion`),
- carrying `lchat-linux-amd64` and its `.sha256`.
-- **One rolling release**: tag `server`, whose single asset `manifest.json` is
- the **feed** — re-uploaded with `--clobber` on every publish/promote, so its
- URL never changes:
-
- ```
- https://github.com/elevenmessenger/releases/releases/download/server/manifest.json
- ```
+ carrying **both architectures** — `lchat-linux-amd64` and `lchat-linux-arm64`,
+ each with its `.sha256`.
+- **One rolling release**: tag `server`, whose assets live at fixed URLs
+ (re-uploaded with `--clobber`, so the URLs never change):
+ - `manifest.json` — the **feed**, updated on every publish/promote:
+
+ ```
+ https://github.com/elevenmessenger/releases/releases/download/server/manifest.json
+ ```
+ - `lchat-linux-{amd64,arm64}` (+ `.sha256`) — copies of the current
+ **stable** binaries, refreshed by `promote … stable`. These JSON-free URLs
+ are what `deploy/install.sh` downloads.
+ - `install.sh` — the self-hoster installer, refreshed on every publish.
+- **The releases repo README** is the public self-hosting guide — synced from
+ `docs/self-hosting.md` on every publish (this source repo is private, so the
+ downloads page doubles as the documentation).
+
+> Operator gotcha (learned live): GitHub's asset CDN can serve a
+> freshly-clobbered asset **stale for a few minutes**, and brand-new assets can
+> briefly 404 — different clients may even hit different cache nodes. An update
+> pass right after a publish may quietly no-op; the next hourly pass absorbs
+> it. Don't chase ghosts during that window.
## Channels
@@ -57,6 +71,8 @@ Payload:
"edge": { "version": "a1b2c3d",
"url": "https://github.com/elevenmessenger/releases/releases/download/server-a1b2c3d/lchat-linux-amd64",
"sha256": "…64 hex…", "size": 123456,
+ "arm64_url": "…/server-a1b2c3d/lchat-linux-arm64",
+ "arm64_sha256": "…64 hex…", "arm64_size": 123456,
"notes": "one-liner", "published_at": "…" },
"beta": { "…": "…" },
"stable": { "…": "…" }
@@ -64,6 +80,11 @@ Payload:
}
```
+The flat `url`/`sha256` fields are the **amd64** binary — kept flat so every
+updater ever shipped can read them; `arm64_*` are additive and optional (an
+arm64 box facing a release without them skips it rather than installing the
+wrong architecture — `releaseEntry.forArch` in `release.go`).
+
## Trust model
The updater downloads and *executes* native code, so the chain matters: