counter — atomic distributed counters (in-RAM, no DB) Monotonic build numbers / ids shared across machines. GET a name to get the NEXT integer — the GET MUTATES (it increments and hands you the new value), so two machines racing the same name never collide. NEXT NUMBER (this GET increments — it is NOT a pure read): curl https://fleet-counter.0exec.com/ci-build # → 1 then 2, 3, ... on each call, from anywhere PEEK (read the current value WITHOUT incrementing; 0 if it never existed): curl 'https://fleet-counter.0exec.com/ci-build?peek' # → 3 BUMP / SET / RESET / DELETE (POST): curl -X POST 'https://fleet-counter.0exec.com/ci-build?by=10' # += 10 (N may be negative) → new value curl -X POST 'https://fleet-counter.0exec.com/ci-build?by=-1' # -= 1 curl -X POST 'https://fleet-counter.0exec.com/ci-build?set=100' # set to 100 → 100 curl -X POST 'https://fleet-counter.0exec.com/ci-build?reset' # set to 0 → 0 curl -X DELETE https://fleet-counter.0exec.com/ci-build # remove the counter (204) REAL USES: N=$(curl -s https://fleet-counter.0exec.com/ci-build) # grab the next CI build number ID=$(curl -s https://fleet-counter.0exec.com/order-seq) # monotonic id with no shared DB docker build -t app:$(curl -s https://fleet-counter.0exec.com/img-tag) . Notes: * Names: [A-Za-z0-9._-], 1-128 chars, must start alnum. * Values are signed 64-bit. An increment that would overflow int64 is refused with 409 (never silently wrapped) — use ?set to rebase. In RAM only — a restart resets every counter to 0, so these are best-effort monotonic ids, not a durable ledger. * Counters idle past the TTL (default 24h) are evicted; a fresh GET restarts them at 1. There's a hard cap on distinct counters → 429 when full. * Writes are per-IP rate-limited; ?peek reads are not. * zsh "no matches found"? Quote any URL with a ? e.g. 'https://fleet-counter.0exec.com/x?peek'.