Repository navigation
shipd v1.0.0 — first stable release
Production-readiness pass on top of v0.9. Existing v0.9 deployments
upgrade in place: SQLite migrations are idempotent; blob layout is
unchanged; existing tokens authenticate without modification. See
UPGRADE.md for the one operator-facing behavior change worth knowing
(install URL signing defaults on with a 30-minute TTL; opt-out via
--install-url-ttl=0).
What's new vs v0.9:
Storage / catalog
- shipd promote: copy a release across channels without re-uploading
- shipd gc + --keep-last + shipd unyank: reclaim disk while
preserving a per-(app, channel, platform) recovery floor
- publish short-circuits with 409 before reading the body on
duplicate (app, version, channel) — saves S3 PutObject costs
on CI retries
- tokens gain expires_at; --ttl on create
Install pages
- HMAC-signed download + manifest.plist URLs with friendly
303-to-install-page recovery on expiry
- multi-platform aware /install/{app}: User-Agent picks primary,
others surface as "Also available"
Auth
- new admin scope (admin > rw > r); admin tokens implicitly
grant rw, so existing rw flows are unchanged
- bootstrap-via-env-var creates an admin token (existing tokens
in DBs are not modified)
Agent / chat
- shipd_promote_release / shipd_unyank_release / shipd_gc /
shipd_create_token / shipd_stats MCP tools
- streamed ask progress: tool-use loops emit "📡 calling X" lines
per intermediate model turn instead of going silent for 10–30s
- stats chat verb mirrors the MCP surface
Observability
- /metrics (admin, Prometheus exposition)
- /api/v1/stats (rw, JSON sibling for chat bots and agents)
Adapters
- Slack adapter via Socket Mode (no public URL needed)
Plus: design.md changelog cleanup, CLAUDE.md repo guidance, fix for
itms-services links being neutered to #ZgotmplZ by html/template.
Built and tested on Go 1.25; the Dockerfile builds on the same.
Live upgrade simulation against a populated v0.9 data directory
verified: tokens authenticate, releases preserve metadata (including
yanked_reason), blobs download byte-identically, install pages render,
install_url_secret auto-generates at mode 0600.