Update infrastructure, minus the drama

Ship updates.
Not surprises.

A calm home for every release. Publish immutable versions, give your apps one reliable update check, and keep everyone current — without rewriting what already works.

Invite-only by default Immutable releases One API
Built for apps that live everywhere
macOS Windows Linux Web iOS Android
The whole release loop

Everything after “it's ready.”

Publish a version, let your apps ask one simple question, and hand people a clear update. Updater stays out of the way of the software you already trust.

Releases that only ever add up.

Every version is written once and kept forever. No silent edits, no deleted history, no mystery builds. Publish forward and keep the receipts.

Canvas 2.4.0 — Glass panels & faster syncjust now
Canvas 2.3.1 — Crash fix on launch6d ago
Canvas 2.3.0 — Offline mode14d ago

One check. Instant answer.

A single authenticated endpoint tells any client whether it's current and where to go next.

http
GET /api/v1/projects/canvas/update
  ?current=2.3.1&platform=macos

→ { "updateAvailable": true,
    "latest": { "version": "2.4.0" } }

Safe by default.

Checksums are optional but encouraged. Releases are append-only and signed webhooks announce every publish.

Append-only SHA-256 Webhooks

A workspace you actually control.

It starts closed. Invite the people you trust with single-use links, decide who gets admin, and open the doors only if you ever want to. Persistent, secure sessions keep you signed in.

Invite-only 30-day sessions Admin controls Per-project keys
Three steps, no ceremony

From new build to “updated.”

Wire it into a CLI, a desktop electron app, a mobile client, or a tiny cron job. If it can make an HTTP request, it can stay current.

01

Publish the release

Add a version, notes, and a download URL from the console — or POST it straight from CI.

POST /releases
02

Ask for the latest

Your app checks with its current version, channel, and platform. The answer is always one clean JSON object.

GET /update
03

Show a gentle button

If an update exists, show your own button and send people to the download. No forced migrations, ever.

updateAvailable: true
Designed for the boring, important part

Updates should be
the safest thing
you ship.

Updater never edits a release in place. It records a new immutable fact and lets clients decide when to move. That means rollbacks are explicit, audits are real, and your history can't be quietly rewritten.

  • Append-only release ledger
  • Scoped, rotatable API keys
  • HMAC-signed webhook payloads
  • Invite-only access from day one
json
{
  "project": { "slug": "canvas" },
  "currentVersion": "2.3.1",
  "updateAvailable": true,
  "latest": {
    "version": "2.4.0",
    "channel": "stable",
    "platform": "macos",
    "publishedAt": "2026-05-18T09:41:00Z",
    "downloadUrl": "https://cdn.example.com/Canvas-2.4.0.dmg",
    "checksum": "sha256:8f14e45f...",
    "notes": "Glass panels, faster sync, and a small fix for offline drafts."
  },
  "checkedAt": "2026-05-18T09:42:10Z"
}
The calm update layer

Your next release
deserves a softer landing.

Set up your private workspace in under a minute. Invite your team when you're ready.