Skip to content

Repository files navigation

version-service

Powered by Sebastian Software CI License: MIT

Shared update-check endpoint for Sebastian Software CLIs — privacy-bounded version checks with aggregate usage counts, running on Bunny Edge Scripting.

How it works

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.

Wire contract (v2)

POST /check

{
  "project": "palamedes",
  "version": "1.17.3",
  "os": "linux",
  "arch": "x86_64",
  "ci": false,
  "installedSince": "2026-08"
}

Response:

{ "latestVersion": "1.18.0" }
  • project is validated against a server-side allowlist that also maps each project to its version source (npm, crates.io, GitHub Releases).
  • installedSince is 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.

Privacy model

  • 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=1 plus a per-tool opt-out (for example PALAMEDES_UPDATE_CHECK=0), fail silently, and never change command output or exit status.

Architecture

  • 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.

Status

The edge script is implemented in packages/edge-script with a full contract test suite, but the service is not yet deployedDEPLOYMENT.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.

Development

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

License

MIT


Sebastian Software

Built by Sebastian Software — consulting for TypeScript, React & Rust.
Work with us · More open source

Copyright © 2026 Sebastian Software GmbH

About

Shared update-check endpoint for Sebastian Software CLIs — privacy-bounded version checks with aggregate usage counts, running on Bunny Edge Scripting

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages