Skip to content

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.sh sets 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 --ref to upgrade.
  • Docker Compose control plane. Postgres, migrations, the API server and Caddy start together; the server waits for migrate to succeed.
  • Published images. Multi-arch ghcr.io/kortix-ai/platinum-server and platinum-console images for each release; the installer pulls them for a release and builds from source on main.
  • Compose profiles. --profile s3 adds a bundled object store and --profile console adds the console.
  • One machine. docker-compose.single-server.yml runs the control plane and a sandbox host on the same box, with the edge proxy on PT_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_env in Python. Sync and async, matching TypeScript setEnv.
  • CLI. pt template list and get show global; pt secret get, update, rotate and rm accept a name or an id.

Changed ​

  • Volumes follow object storage. Volumes are on for every organization when PT_S3_* is set, and return 503 otherwise. features.volumes in GET /v1/auth/me reports which.
  • Volume grant key. Derived from PT_BAUTH_SECRET unless PT_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 :18048 restriction 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 by op and rejects unknown shapes with 400.
  • Unknown templates. Return 404 with code: template_not_found.
  • db:migrate output. Names each migration it applied, or prints nothing to apply; up to date.
  • Schema history. Squashed into a baseline migration.
  • CLI. pt sandbox cp into a directory keeps the file name; list -o json matches get; fork --name names the fork.

Deprecated ​

Removal is planned for the next minor release.

  • TypeScript. SandboxSpec.type and SandboxType are accepted but never sent; use auto_stop_minutes, auto_archive_days or auto_delete_days instead. SandboxState.type is always undefined.
  • Python. sandboxes.create(type=...) and Sandbox.snapshot(name=...) emit DeprecationWarning and are not sent; for type, use auto_stop_minutes, auto_archive_days or auto_delete_days instead.

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 --debug redacts 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=1 on 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_SANDBOX and the other PT_MCP_* settings, like pt 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 gpus returns 400.
  • 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.forOrigin in TypeScript.
  • Sandbox.warm in both SDKs; the API no longer returns it.