Shared update-check endpoint for Sebastian Software CLIs — privacy-bounded version checks with aggregate usage counts, running on Bunny Edge Scripting.
A CLI checks at most once per 24 hours whether a newer release exists. The request doubles as an anonymous usage signal: the service counts it in aggregate and answers with the latest released version. There is deliberately no stable identifier — daily request counts approximate daily active installations, and that is the entire metric. This repository is public so that claim stays auditable.
POST /check
{
"project": "palamedes",
"version": "1.17.3",
"os": "linux",
"arch": "x86_64",
"ci": false,
"installedSince": "2026-08"
}Response:
{ "latestVersion": "1.18.0" }projectis validated against a server-side allowlist that also maps each project to its version source (npm, crates.io, GitHub Releases).installedSinceis a coarse year-month install cohort. Finer granularity is deliberately rejected: combined with the other dimensions it would create singleton cells whose daily requests become linkable — a de-facto identifier.- Everything is validated strictly: exact key set, strict semver, token patterns, a 1 KiB body limit.
- No installation ID, no fingerprinting, no PII.
- Client IP addresses and user agents are never stored: events reach the analytics sink with neutralized values.
- Protocol metadata (path,
Content-Type,Content-Length) is read for request validation only. - Clients honor
DO_NOT_TRACK=1plus a per-tool opt-out (for examplePALAMEDES_UPDATE_CHECK=0), fail silently, and never change command output or exit status.
- Runtime: a single standalone Bunny Edge Scripting script (Deno/V8).
- Sink: our self-hosted Rybbit instance via its server-side events API; the API key lives in a Bunny secret, never in this repository.
- Version source: the registry each project publishes to, fetched and cached inside the script — publishing a release is the synchronization.
The edge script is implemented in packages/edge-script with a full contract
test suite, but the service is not yet deployed — DEPLOYMENT.md
is the step-by-step guide, including the live verification that must pass
before any client release embeds the endpoint. The design record is
palamedes#1036.
The Rust reference client lives in
palamedes#973;
a shared Node client (@sebastian-software/update-check) is planned as a
package in this repository.
The deployable script is the single file packages/edge-script/src/script.mjs
(plain Web-API JavaScript; the Bunny bootstrap at the bottom only runs under
Deno, so Node's test runner imports the pure handler directly).
pnpm install
pnpm agent:check # lint + format + typecheck + build + test| Script | What it does |
|---|---|
pnpm lint |
OxLint first (fast), then ESLint (deep, type-aware) |
pnpm format |
Format everything with oxfmt |
pnpm build |
Build all workspace packages |
pnpm test |
Test all workspace packages |
Built by Sebastian Software — consulting for TypeScript, React & Rust.
Work with us · More open source
Copyright © 2026 Sebastian Software GmbH