Changelog
What changed in each release. Operator steps for each release are on Upgrades.
v0.1.0 (2026-10-26)
The first public release.
Added
- One-command install.
install.shsets up the Compose control plane, creates the first admin and an API key, and prints the host install command. Re-run it with a newer--refto upgrade. - Docker Compose control plane. Postgres, migrations, the API server and Caddy start together; the server waits for
migrateto succeed. - Published images. Multi-arch
ghcr.io/kortix-ai/platinum-serverandplatinum-consoleimages for each release; the installer pulls them for a release and builds from source onmain. - Compose profiles.
--profile s3adds a bundled object store and--profile consoleadds the console. - One machine.
docker-compose.single-server.ymlruns the control plane and a sandbox host on the same box, with the edge proxy onPT_EDGE_PORT. - Pinned guest kernel. The server image ships one guest kernel, so every sandbox host runs every template.
- On-demand TLS for preview URLs. Caddy issues certificates without a DNS module, only for hostnames of existing sandboxes.
PT_S3_PUBLIC_ENDPOINT. Presigned build uploads use a public bucket address while servers and hosts keep the private one.- Host installer log. The host installer writes
/var/log/platinum-install.log(PT_INSTALL_LOG), which survives its closing reboot. - Host re-homing. Run the new control plane's install command on a host to move it there without reinstalling the OS. Sandboxes and templates do not carry over, so drain the host first (Moving a host).
- EPYC 4004 and 4005 CPU families. Drain and migrate find targets on these hosts.
Sandbox.set_envin Python. Sync and async, matching TypeScriptsetEnv.- CLI.
pt template listandgetshowglobal;pt secret get,update,rotateandrmaccept a name or an id.
Changed
- Volumes follow object storage. Volumes are on for every organization when
PT_S3_*is set, and return503otherwise.features.volumesinGET /v1/auth/mereports which. - Volume grant key. Derived from
PT_BAUTH_SECRETunlessPT_CACHE_GRANT_*is set. - Limits. A per-org override wins over the global default; plan tiers are gone. Per-sandbox caps default to the API maxima: 16 vCPU, 32768 MB RAM, 100 GB disk. Aggregate org pools default to unlimited (
0). - One built-in region,
default. The install command defaults the zone to<region>-1. - Host firewall. The installer saves only Platinum's own rules to
/etc/nftables.conf, so they load at boot on hosts that also run Docker or Tailscale and the:18048restriction survives a reboot. Re-install existing hosts. - Re-installing a host. Replaces the whole bundle tree instead of extracting over it.
POST /v1/templates/from-spec. Validates each step byopand rejects unknown shapes with400.- Unknown templates. Return
404withcode: template_not_found. db:migrateoutput. Names each migration it applied, or printsnothing to apply; up to date.- Schema history. Squashed into a baseline migration.
- CLI.
pt sandbox cpinto a directory keeps the file name;list -o jsonmatchesget;fork --namenames the fork.
Deprecated
Removal is planned for the next minor release.
- TypeScript.
SandboxSpec.typeandSandboxTypeare accepted but never sent; useauto_stop_minutes,auto_archive_daysorauto_delete_daysinstead.SandboxState.typeis always undefined. - Python.
sandboxes.create(type=...)andSandbox.snapshot(name=...)emitDeprecationWarningand are not sent; fortype, useauto_stop_minutes,auto_archive_daysorauto_delete_daysinstead.
Fixed
- Volume root disks. Booting a volume as a root disk needs
volumes:write. - Scoped keys. A fork or clone made with a scoped key stays inside its scope.
- Warm snapshots. Resolved by template id, never by name across organizations.
- Host pinning. Only operators can pin a host with
?host=. - Credentials. Avatar reads are org-scoped, and revocations reach every control plane process within about a second.
- OAuth client registration. Rate-limited, and refuses wildcard redirect hosts.
- SDKs and CLI. The API key is never sent to other origins, and
--debugredacts credentials. - Edge proxy. Strips internal headers before the guest, and keeps platform session cookies away from previews.
- Preview routing. Route hints are bound to their host and expire.
- Raw TCP tunnels. The control plane signs each tunnel with a single-use claim. Set
EDGE_TCP_REQUIRE_CLAIM=1on the edge to refuse tunnels without one. - Edge proxy secret. The edge proxy refuses to start in production without a real HMAC secret. Without one outside production, it refuses private preview tokens (local dev:
PT_EDGE_ALLOW_DEV_SECRET=1). - Edge after re-homing. The edge proxy picks up the host key from the latest registration, so auto-resume keeps working after a host moves.
- Console headers. Console routes send frame and content security headers.
- Template builds. Builds cannot reach host-local or private addresses, or escape the context through
../or symlinks. - Build sandboxing. Build chroots get a synthetic
/dev, and filesystem tools run in a jail over guest images. - Host-to-host migration key. Limited to the receive path.
- Bun on hosts. Installed from a checksum-verified archive.
- MCP server. The standalone entry honours
PT_MCP_CONFINE_SANDBOXand the otherPT_MCP_*settings, likept mcp start.
Removed
- Multi-region control planes. The global/regional database split and cross-region routing are gone; the host region label stays.
- Kubernetes deployment. Not supported.
- GPU passthrough. A create with
gpusreturns400. - Billing and metering. Usage export goes with them.
- Other subsystems. The regional chunk-cache tier, inference proxy, apps and workers API, and cell runtime.
POST /v1/templates/{id}/prepare.pt sandbox snapshot --name.Platinum.forOriginin TypeScript.Sandbox.warmin both SDKs; the API no longer returns it.