Skip to content

Roadmap

What has shipped and what is planned.

Shipped

ItemRelease
Engine M1: native, wazero executor; wctr pull, images, run, ps, logs, rm, rmi, inspect, kill, version; the wctrd daemonengine v0.1.0
Browser executor (runtime/browser), the shared WASI host (wasi), api/inproc, the cli package, RegistryOptions.Mirrorsengine v0.2.0
wctr completion for bash, zsh, fish and PowerShell; cli/lineedit, a pure-Go line editor with completion, used by the playground terminalengine v0.3.0
Persistence: containers survive a wctrd restart and a page reload (state, exit code, logs, written files; running ones come back exited 137); wctr system df, system prune, diffengine v0.4.0
Fix: a kill, rm -f or shutdown during start could succeed without killing the process; it is now held until the process attachesengine v0.4.1
wctr start (-a), stop, restartengine v0.5.0
wctr events / GET /events (NDJSON, --since, --until, filters)engine v0.6.0
wctr stats (memory against its limit, bytes written, layer and log size, pids; CPU not measured)engine v0.7.0
Volumes: wctr volume create|ls|inspect|rm|prune, run -v NAME:/path[:ro]engine v0.8.0
tar+zstd layers (bounded, fuzzed); WebAssembly exception handling enabled nativelyengine v0.9.0
Networking: sockets for guests (WasmEdge socket extension V2, preview1 sock_*), built-in DNS by container name, the networks bridge (10.88.0.0/16) and none, wctr network create|ls|inspect|rm, run --network, a class network through the relay (wctrd --relay); wctrd --wasi engine is the new default; see Networkingengine v0.10.0
A class joined at run time: the engine’s network manager can add and remove a class network while running (AddDriver, RemoveDriver); the playground’s “Join class” uses itengine v0.11.0
Builder support: wctr commit, wctr tag, dangling <none> images, POST /images/load, container archive PUT/GET (1 GiB limit on those two routes), the full image config with diff_ids, and the wctr extension hook that wctr build usesengine v0.12.0
Host modules and --gpu: typed imports beside wasi_snapshot_preview1, per-process state, cabi_realloc, wctr run --gpuengine v0.13.0
Networks, more: aliases, several networks per container, network connect, disconnect, prune, label filters, HEAD on the archive routeengine v0.14.0
Process primitives: spawn, descriptor tables, process groups, pipesengine v0.15.0
wctr is a module of its own, with wctr build and wctr compose built in; install with two go install commandsengine v0.16.0, cmd/wctr v0.1.0
The WASIX process subset as a host module (wasix_32v1): spawn, join, pipes, tty; sh, pipelines and shell-form RUN can runengine v0.17.0
List filters on the Go client (Containers, Networks, Volumes)engine v0.18.0
Config.Label names a process’s container (the seam for process-level features)engine v0.19.0
wctr exec and the exec endpoints, with a terminal line disciplineengine v0.20.0
The Go client’s old list signatures restored (v0.18.0 had broken the dashboard); filtering through ContainersFiltered, NetworksFiltered, VolumesFiltered; a CI job compiles downstream modulesengine v0.21.0
Published ports natively: run -p, -P, --expose, wctr port, a PORTS column in ps, NetworkSettings.Ports; default bind 127.0.0.1 with a bounded proxy; a refused start records exit 128 and --rm removes the containerengine v0.22.0
wctr run exits 125 when the daemon refuses the start (the container records 128)engine v0.23.0
portmap.Virtual: published ports with no sockets, the groundwork for -p in the browser (not live yet)engine v0.24.0
Restart policies: run --restart no|always|unless-stopped|on-failure[:N]; backoff from 100 ms, doubling, up to a minute; a user’s stop or kill ends the policy until the next start; always and unless-stopped start with the engine; RestartCount and State.Restarting in inspect, restarting in psengine v0.25.0
wctr exec in the browser executor: the process runs in its own worker inside the container’s process group, counts against its limits and is killed with it (not in the playground yet: it is built on engine v0.14.0)engine v0.26.0
exec -t follows window resizes: SIGWINCH on unix, 2 Hz sampling on Windows, wasip1 and jsengine v0.27.0
Headless Linux surfaces fixed: the SwiftShader lane renders (Chromium needs --enable-features=Vulkan --use-vulkan=swiftshader --use-angle=swiftshader); strict pixel checksgpu v0.5.1
Health checks: Config.Healthcheck, State.Health, health_status events, run --health-cmd and the other --health-* flags, --no-healthcheck, an image’s HEALTHCHECK; ps shows (healthy)engine v0.28.0
Dependencies updated (relay v0.3.1, compress v1.20.3, pflag v1.0.10)engine v0.28.1
Tests share one wazero compilation cache: the engine’s CI test job went from 13 min 30 s to 5 min 40 sengine v0.29.0
Browser executor: stdin reads never block the engine; exec waits up to 30 s for a starting containerengine v0.29.1
Typed-ahead keys survive a terminal’s switch to raw mode: when a process on a terminal (exec -t) turns line mode off, the line being typed is handed over at once, as Linux does when ICANON is cleared (before, keys typed before a shell’s first prompt were lost); wasi.Terminal.OnMode; the hand-over runs in at most one goroutine at a timeengine v0.29.2
A container’s own stdin and terminal: Config.Tty, OpenStdin, StdinOnce, HostConfig.ConsoleSize; wctr run -i/-t/--detach-keys, wctr attach, wctr start -ai; POST /containers/{id}/attach with stdin=1 and detachKeys, and POST /containers/{id}/resize; Ctrl-P Ctrl-Q detaches; works in both executorsengine v0.30.0
cmd/wctr v0.2.0: engine v0.22.0, compose v0.3.2, build v0.4.0cmd/wctr v0.2.0
cmd/wctr v0.3.0: requires engine v0.30.0, so the installed wctr has run -i/-t, attach and start -aicmd/wctr v0.3.0
Engine v0.30.1: piped standard input, output and error are no longer reported to a guest as a terminal (file type unknown, as in wasmtime); a guest’s exit codes 0 to 255 are kept and only values outside become 1engine v0.30.1
lineedit, one line editor for wctr and the guest shell: a nested module, github.com/go-wasmcontainers/engine/lineedit (lineedit/v0.1.0), whose only dependency is the standard library; wide and combining characters have their display widths; CSI sequences such as ESC[?25h are no longer inserted as text; cli/lineedit becomes an adapter over itengine v0.31.0
Shell v0.4.0: sh uses the shared lineedit (replacing its own editor): reverse search (^R), wide characters counted, long lines wrap; the core’s completion hook is not wired into sh yet; sh.wasm grows by 79,097 bytes (+1.16 %)shell v0.4.0
Playground v0.7.0, on engine v0.30.1: wctr images and completion show [checked] or [mirrored]; the live catalogue has 52 images, 43 pkgx bottles, 41 of them checked against wasmtime 50.0.1playground v0.7.0, live
A line editor on a terminal (arrow keys, history, ^C, ^D) in sh; the public image ghcr.io/go-wasmcontainers/shell:0.2.0 (digest sha256:32bb0127…505a7, coreutils v0.4.0)shell v0.2.0
wasix/exec, os/exec for WASI containers, in wasix, a module of its ownshell v0.2.0, wasix/v0.1.0
Coreutils: grep flags, tee streaming, ls FILE, find, sort, head/tail, date, tr, printf in full; hostname, uname, id, whoami, clear, whichcoreutils v0.5.0
GPU surface input: wasi-gfx:surface pointer and key streams for the guest, webgpu.SurfaceInput for the pagegpu v0.6.0
Open shell in the dashboard (wctr exec -it CONTAINER sh), request bodies streamed over the bridgedashboard v0.7.0
Playground v0.4.1, on engine v0.30.0: run -it and start -ai in the page (the end-to-end test runs wctr run --rm -it shell); the usercontent shell forgets requests the playground never answersplayground v0.4.1, live
Dashboard surface input: pointer and key events from a GPU pane reach the guest through webgpu.SurfaceInput (gpu v0.6.0); a press gives a pane the focus, F6 leaves it; pointer moves are coalesced to one per framedashboard v0.8.0
GPU surface input in the playground: click a surface’s pane to give it the focus, and its pointer presses and keys reach the guest ({t:"input"} to the engine worker, then webgpu.SurfaceInput); wctr run --rm --gpu triangle [frames [input]] prints what it receives; the end-to-end test TestGPUSurfaceInput checks the coordinates and Shift+A; the playground uses dashboard v0.8.0 and gpu v0.6.0playground v0.6.0, live
Coreutils: env CMD, xargs and find -exec run programs (fsx.Env.Exec, pkg/procx: wasix/exec on wasip1, os/exec natively)coreutils v0.6.0
Shell v0.3.0: the public image ghcr.io/go-wasmcontainers/shell:0.3.0 (digest sha256:bc3b16b7…c5c5ec) with coreutils v0.6.0 (env, xargs, find -exec), and engine v0.29.2 (the line editor keeps typed-ahead keys)shell v0.3.0
Playground v0.4.0, on engine v0.27.2: GPU surfaces and compute (the compute and triangle images), WASIX, the shell image pinned by digest, typing into exec -i, wctr build and wctr compose in the page, and the shell of the second origin for containers’ pages (-p is not live yet)playground v0.4.0, live
Compose health checks: healthcheck applied (CMD, CMD-SHELL, NONE, durations, retries; disable: true is NONE; merged field by field with the image’s check); depends_on service_healthy really waits (errors on unhealthy, on stop, on no check and after up --wait-timeout, default 5 minutes; required: false is a warning); CMD-SHELL needs /bin/sh in the image; needs engine v0.28.0 or latercompose v0.6.0
Compose restart policies: restart and deploy.restart_policy applied (condition none/on-failure/any → no/on-failure/always, max_attempts → retry count; deploy.restart_policy wins over restart; delay and window not applied, with a warning); compose stop ends a restart loop; needs engine v0.25.0 or latercompose v0.5.0
Compose ports: short and long ports syntax and expose; a port with no host address binds 127.0.0.1 on purpose; needs engine v0.22.0 or latercompose v0.4.0
Step output streams live in wctr buildbuild v0.4.0
Rendering on surfaces (wasi-gfx:surface with surface-webgpu, frames to the page), shown in the dashboard’s Surfaces viewgpu v0.5.0
Playground v0.3.0, on engine v0.14.0: the dashboard as the main UI, networking in the browser, Join class (relay), wasi-nn with the mnist imageplayground v0.3.0, live
Playground v0.2.0, on engine v0.9.0 (with completion, persistence and offline use): start, stop, restart, diff, stats, events, volume, system df|prune, run -v; the images lua 5.4.9, sqlite3 3.53.4 and minigzip (zlib 1.3.2), C tools built by go-pkgx for wasip1playground v0.2.0, live
Playground M1: wctr in a browser tab, no serverplayground v0.1.0; live at https://go-wasmcontainers.github.io/playground/
Classroom relay M-relay-1 and M-relay-2: wctr-relay, the relay and firewall with security groups modelled on OpenStack Neutron, its gRPC control API, TLS, OpenID Connectrelay v0.1.0
Live flow map (M-relay-2b): the relay’s page drawing the class’s flows, refused ones in redrelay v0.2.0
CORS for browsers on another origin: wctr-relay serve --cors-originrelay v0.3.0
The POSIX shell (sh, the wasix package) and its public base image with the coreutils (ghcr.io/go-wasmcontainers/shell:0.1.0)shell v0.1.0, coreutils v0.4.0
Compose on engine v0.21.0compose v0.3.2
Relay fix: golang.org/x/net updated for two advisoriesrelay v0.3.1
wctr build: multi-stage builds from a Containerfile or Dockerfile, the build cache, .containerignore; exec-form RUN (Build)build v0.2.0
Shell-form RUN on an image with a shell (engine v0.17.0 or later)build v0.3.0
wctr compose: Compose files in YAML, JSON and HCL2; up, down, ps, logs, start, stop, restart, rm, pull, images, config (Compose)compose v0.1.0
Compose builds (up --build, build)compose v0.2.0
Service-name networking, aliases and several networks (engine v0.14.0 or later), label-filtered listscompose v0.3.0, v0.3.1
GPU: ONNX loader and CPU operators (v0.1.0); wasi-nn host module and mnist (v0.2.0); wasi-nn on WebGPU, proven on a real Apple GPU in CI (v0.3.0); wasi:webgpu compute (v0.4.0) (GPU)gpu v0.1.0 to v0.4.0
Surfaces view for GPU frames; Networks view and Join classdashboard v0.6.0, v0.5.0

What the engine does not do is on Limitations.

Planned

Nothing below exists yet.

ItemWhat it is
Classroom relay, the reststudents’ containers reaching each other through the relay from the playground: the engine’s network driver and the browser path (M-relay-3, -4), ICMP (M-relay-5), high availability across relays (M-relay-HA); see the design
on-resize and on-frame streams, vertex buffers, depth-stencilrendering shipped (gpu v0.5.0, headless Linux fixed in v0.5.1) and input in v0.6.0; these are not served yet; see GPU
Mini-Kubernetesenough of the orchestrator’s API to teach its concepts
apt-like imagesa base image plus tools, from pkgx wasip1 bottles. go-pkgx builds C tools for wasip1 (lua 5.4.9, sqlite 3.53.4, zlib 1.3.2 with minigzip), which are now in the playground’s catalogue; a base image plus tools is still planned
A reference comparisonthe benchmarks set against another WebAssembly runtime

An item moves to “shipped” with the release that carries it.

Created on by tannevaled

Modified on by tannevaled