Repository navigation
Open Compute 0.4.0 adds Container execution and snapshot paths for single-machine deployments.
Publication requires every revision-bound release qualification job to pass.
What's new
- The implementation adds an operator-owned Container Broker and immutable Container targets.
Code-only deployment keeps the current execution.
Image or resource deployment creates a new target and retires the previous execution. - Durable Object containers gain process lifecycle, HTTP and WebSocket transport, exec streams, named images, inactivity policy and snapshot code paths.
The local product cases exercise these paths with real workerd, Docker and SQLite. - Snapshot capture retains filesystem data and excludes volatile
/rundata.
Snapshot restore creates a new execution from the retained image.
Artifact ownership and bounded cleanup remain explicit. - The Container registry accepts ordered OCI manifests that reference a layer more than once.
Every descriptor retains its digest and size checks; each blob enters the admission set once.
Workerd
The candidate uses v1.20260930.0-open-compute-r24.9de631551 at 9de631551791218aed0c4cd570163cece3c00590.
The previous release used v1.20260930.0-open-compute-r4.e98a3e843 at e98a3e8433979356047a202d3e0d1b0e2e2c4b8c.
Both binaries print workerd 2026-09-30.
The pin and lock digest identify the runtime change.
Container callbacks retain the public Durable Object and Service binding policy checks during HTTP and WebSocket streams.
Lease fences prevent a callback from completing a replacement execution.
Automatic monitor calls do not extend the tenant's inactivity timer.
Container snapshots enter a fresh event under the original owner before the platform captures the container image.
Private Container actors expose the configured immutable image map.
Directory snapshot inputs pass through the original owner event and its existing binding checks.
The Broker uses private Container protocol v4 to restore captured directories before the main process starts.
The event loop polls Tokio readiness while KJ remains busy, so large uploads do not monopolize runtime I/O.
The HTTP client closes HTTP/1.0 connections by default and retains explicit keep-alive behavior.
The owning regression checks reuse before EOF arrives, rather than waiting for connection closure.
The previous source gitlink was fdcb8c97f0b9f75f610b66e418d5175b9188ddad.
That gitlink includes a publication-path repair after the formal R4 pin.
The current third_party/workerd gitlink is 9de631551791218aed0c4cd570163cece3c00590.
The formal binary source uses that same revision.
The following table contains all 29 commits between those source gitlinks.
Commit subjects retain their original text.
| Commit | Original subject |
|---|---|
| 98f575287c65 | Add host-authorized dynamic Container leases and revocable provider callbacks |
| 8903b3504393 | Drop managed application packet capture capability |
| fb1a903f1e89 | Serialize Container lease admission and confirm normal process exit |
| c2ff9759d4e2 | Fence Container completion callbacks to their original lease |
| 7b23dc995a01 | Allow fenced Container monitors to confirm exited executions |
| 28d4cb144373 | Qualify native Container protocol and attachment in release builds |
| b359cb6c0026 | Retain native Container owner activity and refresh trusted startup monitors |
| 720d90a4faad | Register native Container egress before admission within its owner |
| c189d6029707 | Keep host-owned Container leases across native owner teardown |
| a8e3d0bd40df | Preserve Container callbacks across execution replacement |
| 7b194dc98fcb | Implement private Container inspection, snapshots and inactivity authority |
| a48880fc12b4 | Use authenticated exec lifecycle and reject truncated output |
| 617f19427ad3 | Keep automatic Container monitoring outside tenant activity |
| f7a64709b3b4 | Expose immutable named images on private Container actors |
| 79a3db287945 | Require Container protocol v3 in release qualification |
| a8d2411621ac | Bound the native Container callback test pool |
| a12a8a6230b4 | Preserve private Container owner inactivity policy across alarm repair |
| eca7215c8d58 | ci: allow 60 seconds for Rosetta medium tests |
| 4bdbfda718f5 | fix: preserve public binding callback ownership across streaming |
| d9b8d6ce40e0 | test: compare policy response bodies as byte arrays |
| 1c0659a70e9a | Run snapshot policy inside a fresh owner control event |
| 204a75bcfcc3 | Retain exec process ownership until output collection completes |
| 65267e100a15 | Route directory snapshots through scoped host capture |
| 25f2a0fded97 | fix: service Tokio readiness while KJ remains busy |
| e1e632f1c7ea | ci: recover R23 artifacts and scope Tokio lint to Rust |
| 52ab9f746da1 | ci: publish retained R23 artifacts without rebuilding |
| f2fb6bdf4de4 | ci: publish verified recovery tags without a target override |
| cf3163dd0bd9 | test: add pinned HTTP/1.0 persistence regression inputs |
| 9de631551791 | fix: honor HTTP/1.0 connection persistence in container tunnels |
SDK
- The candidate pairs
@open-compute/sdk@0.4.0withocd0.4.0.
Both source manifests identify version 0.4.0. - The official management SDK remains
cloudflare@7.2.0.
The OpenAPI source remainscloudflare/api-schemas@780de88d0324b007c907a1782259b1a0e5e87c7d. - Application tooling uses cf
1.0.0-beta.12, the pinned Cloudflare Vite plugin v2,@cloudflare/containers@0.3.7and Workers types5.20260930.2.
A fixed declaration does not establish runtime compatibility. - After publication, install the matching SDK with
bun add @open-compute/sdk@0.4.0.
Published package metadata will appear at npm.
Product surfaces
The English and Chinese Container guides describe the independent Broker, provider prerequisites, instance configuration and accepted snapshot differences.
The README architecture diagram identifies the operator-owned Broker rather than an embedded provider.
The management inventory records the 13 cf-observed Container routes and their local limits under OC-CONTAINERS-MGMT-001.
These routes remain outside the pinned upstream OpenAPI subset.
The pinned official SDK has no corresponding methods, so the generated SDK surface records the 13 exclusions.
The 65-member tenant runtime API remains separate from management SDK coverage.
Fixed
-
Concurrent macOS runtime launches copy verified executables without sharing a read cursor.
Each launch retains its private staging directory and cleanup journal. -
The private KV backend closes HTTP/1 connections when it rejects a streaming PUT with unread upload bytes.
Value limits and permission checks remain unchanged. -
The Broker checks the 12 independent unauthorized sidecar requests concurrently.
Every response must still have HTTP status 401.
The 30-second sidecar qualification deadline and three-second HTTP request deadline remain unchanged.
Qualification failures record the fixed phase and deadline flag without credentials or upstream errors. -
Concurrent KV writes retain their shared staging directory until startup cleanup.
Each completed or rejected write removes its own staging file.
Concurrent directory creation validates the directory created by another writer. -
Exec output collection retains its native process handle until collection completes.
The handle preserves late stdout and stderr when garbage collection occurs. -
Runtime host modules import the public WebSocket wire helpers without importing the private RPC issuer.
Native private modules remain outside the tenant module graph. -
Durable Object alarm setup accepts callable RPC views whose methods are available through property access.
The runtime still checks each required method. -
Container class acquisition and deletion share an ordered transition.
Concurrent route changes revoke the previous grant before a replacement grant becomes current.
Tenant execution remains outside this transition. -
HTTP and WebSocket callbacks retain their original owner and Container lease.
Completion from an old execution cannot complete a replacement execution. -
Snapshot control enters a fresh native event under the original owner.
Source image verification, archive publication and materialization retain their checks and failure boundaries. -
Repeating service start preserves an already running launchd process.
An explicit restart still replaces the process. -
Browser Run waits for the real CDP context before attaching after restart.
The real-browser regression retains its original assertions.
Before you upgrade
Back up the selected persistent data root before an upgrade.
Control migrations V16 and V17 add Container and snapshot state.
Control migration V18 adds Directory snapshot authority.
The candidate retains all published migration bytes.
The Container declarations change the immutable Worker descriptor contract.
The local repair raises the loader schema to 2 and rejects retained executable versions with an older schema before binary replacement.
On 2026-10-20 UTC, the native five-OS installation matrix passed all ten user/system scopes.
The candidate correctly rejected the incompatible 0.3.0 upgrade and preserved the previous installation.
These checks do not establish a successful incompatible in-place upgrade or formal tag qualification.
For an incompatible instance, use a separate fresh installation, explicit data transfer and redeployment.
Do not rewrite stored Worker descriptors or migration records to bypass preflight.
For rollback, retain a backup made with the previous binary.
Do not remove migration rows or edit SQLite files to force a downgrade.
Stop the daemon before you replace its executable or restore its persistent data.
Container execution requires a separately operated Broker and a qualified rootful Linux Docker Engine.
The Broker checks overlay2, cgroup v2, seccomp, resource limits, the exec helper and snapshot behavior.
An installed Docker CLI does not prove these conditions.
The daemon does not install or start the Engine during startup.
Install or upgrade
After the project publishes 0.4.0, back up the selected data root.
For an existing receipt-managed installation that passes preflight, run:
ocd upgrade 0.4.0For a separate fresh user-owned installation, download and review the versioned installer:
curl -fsSL -o install.sh https://raw.githubusercontent.com/elliothux/open-compute/v0.4.0/scripts/install.sh
less install.sh
OPEN_COMPUTE_RELEASE_TAG=v0.4.0 sh install.sh
ocd setup --yesBefore admitting traffic, check ocd --version, ocd config check, ocd instances, ocd doctor and ocd capabilities --json.
Use the reported capability status when selecting products.
Downloads
The candidate retains the three native executable targets:
| Host | Asset |
|---|---|
| macOS on Apple silicon | ocd-v0.4.0-darwin-arm64 |
| Linux on ARM64 | ocd-v0.4.0-linux-arm64 |
| Linux on x86-64 | ocd-v0.4.0-linux-x64 |
The release requires release.json, test-report.html, test-report.json and SHA256SUMS.
Each executable embeds verified workerd and Caddy inputs.
Caddy remains pinned to v2.11.4-open-compute.2.
Windows and Intel macOS remain source-build-only targets.
Do not rename or publish the diagnostic 0.3.0 executables as 0.4.0 assets.
Security
The Broker owns the Docker socket and an authenticated private Unix socket.
Tenant bindings do not expose the Docker socket, host credentials or generation tokens.
Public Durable Object and Service binding checks remain in the Container transport path.
Production startup remains offline.
The platform retains one shared outbound IP capability.
The capability permits host-allowed public, private, loopback and metadata IP traffic.
Unix sockets remain denied to tenant outbound APIs.
Operators own host network filtering; the platform does not claim isolation between Worker or instance networks.
Known limitations
- The local Container API retains all 65 stable members and includes directory backup restoration.
Upstream PR #7123 keepssnapshotDirectory()behind the experimental flag.
The nine stable Directory members use the documented local capture and restore paths.
Local implementation and restore evidence do not establish a hosted stable directory snapshot producer. - Two snapshot behaviors use the accepted upstream direction, rather than reproducing every retained hosted observation.
snapshotContainer()accepts omitted options, as specified by the fixed types and upstream PR #7453.
A restored container returns an emptyinspect().image, as explained in the official documentation change #33825.
The managed registry reference observed after hosted restore has no established mapping to the original image.
The Cloudflare-managed image-size formula remains unknown. - Local custom resources do not establish hosted input compatibility.
The local product case uses0.03125vCPU,128MiB memory and1000MB disk and checks SQLite and Engine resource settings.
On 2026-10-21 UTC, hosted readiness failed for that profile and for separate CPU-only and memory-only reductions.
Two1vCPU,3072MiB,4000MB controls started successfully before and after those probes.
The single-field probes kept the control values for the other two resources.
These observations do not establish the managed predicate, exact limits or actual allocation. - The signal 34 observation covers 12.225 seconds, not permanent signal suppression.
This measurement belongs to the controlled hosted comparison recorded on 2026-10-13. - The platform remains single-machine and self-hosted.
Cloudflare multi-region placement, Sandbox and excluded managed products remain outside the declared scope.
Code signing and macOS notarization are not included.
Verification
The release assets include test-report.json and test-report.html.
The reports bind qualification results to the exact release revision, runtime pin and binary digests.
Earlier candidate results do not replace those reports.
The release workflow publishes only after these checks pass:
- The main source commit passes static CI.
- Rust line coverage reaches at least 90.00%.
- The complete uninstrumented Linux workspace Gate passes with controlled egress.
- Native Darwin ARM64, Linux ARM64 and Linux x64 packages pass their single-binary checks.
- The Linux ARM64 package passes its embedded Dashboard checks.
- All ten user/system installation scopes pass across macOS ARM64, Ubuntu 24 ARM64/x64 and Debian 13 ARM64/x64.
- The complete stress run passes at two CPUs and 4 GiB, within its original error-rate and latency thresholds.
The stress run has a 3600-second total budget after deployment.
Each peak profile runs for 60 seconds at its original rate and concurrency.
The soak uses the remaining budget, lasts at least 1800 seconds and verifies recovery after exactly three injected restarts.
The reports retain phase times, sample counts, error rates, latency percentiles and recovery results.
On 2026-10-30 UTC, all four R24 native builds and their required qualifications passed in run 41025742244.
Each target passed eight Container/KJ HTTP owning targets, 52 normal Rust targets and eleven Root-owner regressions.
Two sanitizer-only Rust targets were incompatible with the release configurations and remain explicitly skipped.
The ten immutable R24 assets passed signature, archive, binary, architecture, protocol and catalog checks.
The pinned KJ HTTP suite failed its new persistence regression before the repair and passed all 140 tests after the repair.
The snapshot fixture lifetime repair passed static CI 41063029915 on 2026-10-30 UTC.
Its native Linux x64 instrumented P23 check 41063047784 also passed.
The focused P23 check supplements the revision-bound release reports; it does not replace full workspace coverage or the final Gate.
The platform conformance catalog remains no_go for blocked or unexecuted hosted product comparisons.
The accepted snapshot contract differences remain documented in Container operations.
Thanks
Thanks to @KonghaYao for the stress-testing request in #145.