You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
WordPress Playground integration with --experimental-posix-kernel — make the Wasm kernel a selectable runtime in Playground web/CLI behind a flag (the broader Playground beta-flag work is in Layer 10; this is the concrete entry point). Proof-of-concept PRs open against WordPress/wordpress-playground: #3634 (CLI), #3635 (Web).
Explore Node.wasm — bring the Node.js runtime onto the kernel (libuv event loop, native addons via dlopen, child_process via fork+exec). Shipped via QuickJS-NG–based Node-compatible runtime (#482) covering node:crypto, zlib, TCP sockets, TLS, real http/https, and end-to-end npm install lodash/express/vite.
Layer 1 — Stabilize what already works
Fix the web server service worker losing context and failing to load WordPress
Migrate from the deprecated Wasm try instruction to try_table (currently pinned via -wasm-use-legacy-eh=false and -mllvm -wasm-use-legacy-eh=true workarounds)
Layer 2 — Finish the browser surface protocols
HTTP relay protocol — extract from demo code into a documented, versioned spec
Service Worker interface — multi-tab routing + connected-client visibility (see "Partially landed")
A non-isolated tunnel for secrets — a side channel that does not require COOP/COEP, so credentials/API keys can flow into a Kandelo session without granting the isolated context full access to them
Query params as inputs to the boot process — let demo URLs pre-seed argv, env, or boot scripts
fbDOOM mouse support — mouse input device alongside the existing keyboard scancode injection (currently called out as a limitation in docs/browser-support.md) @mho22
fbDOOM sound support — audio output device (/dev/dsp) for sound effects @mho22
fbDOOM music support — background music playback for fbDOOM @mho22
Layer 3 — Distribution & ecosystem
Software installer like apt (the resolver in cargo xtask build-deps resolve is the plumbing — this is the user-facing layer on top)
Standalone published packages for the libraries that aren't yet first-class binary artifacts
readline as its own package (not just bundled into bash)
Deploy multiple kernel versions on the same web server, allowing staging and switching between live versions
Layer 4 — Observability
A thorough OS trace facility (syscalls, signals, scheduling, IPC)
An MCP server for OS tracing — exposes the trace stream to agents
A living diagram of system components, current state, and relationships, served by the running kernel
Process listing (procfs already exists per #220 — needs a UI consumer)
Memory visualizer
File system visualizer and browser
Layer 5 — Agent integration
Run Claude within the kernel
More agentic guidance (CLAUDE.md is a start; codify SDK / build / debug workflows further)
Agent skills for using the SDK
Software building (autoconf/CMake/Makefile flow with wasm32posix-*)
Multi-computer network running in a single browser (multiple kernels, virtual L2/L3 between them)
WebRTC remote login — let other clients log into your in-browser computer
DOOM multiplayer over the WebRTC tunnel (now that fbDOOM mouse + sound + music have landed, this is the obvious payoff)
Store and load kernel VFS images from IPFS
Layer 7 — Branding
Lock in a memorable name — Kandelo is now in README, docs, the live UI host, and Kandelo.dev demo gallery wiring (#427, #467, #483, #485). Repo rename and host/ npm package rename still pending.
Logo
Layer 8 — Additional runtimes & ports
Runtime
Explore Go.wasm — bring the Go runtime onto the kernel (goroutine scheduler interaction with our threads, syscall interface, GC behavior under shared WebAssembly.Memory) @mho22
Explore SDL2 — cross-platform input/audio/video library; depends on the framebuffer (shipped), mouse input + audio output (Layer 2). Unlocks a large catalogue of games and tools. @mho22
Explore ScummVM.wasm — fun/stretch: classic adventure game engine on the framebuffer + audio stack (depends on Layer 2 audio work) @mho22
ALSA sound device — implement alongside /dev/dsp so software targeting the modern Linux audio stack works without falling back to OSS @mho22
wp-load.php benchmark: native vs wasm (the existing WordPress benchmark in benchmarks/run.ts --suite=wordpress measures HTTP first response, not the bare wp-load.php cost)
Support both the Wasm kernel and PHP-WASM in Playground web, with the kernel behind a beta flag
Raw Rust build command — no equivalent SDK wrapper today; user programs are C-only
🟡 Partially landed
Started, but not yet at the level Brandon's note describes:
Protocol for relaying HTTP requests
Working pipeline exists: service worker → MessagePort → kernel worker connection pump (examples/browser/lib/http-bridge.ts, connection-pump.ts, lib/init/service-worker-bridge.ts)
Missing: documented, versioned protocol spec independent from demo glue, with a stable contract for non-Kandelo embedders
A clean, focused Service Worker interface
Current SW is a unified dual-mode file (examples/browser/public/service-worker.js) that already routes HTTP via a single bridgePort
Still owed: route HTTP requests to the right client when multiple browser tabs are connected
Still owed: provide visibility for all connected clients (an enumerable list of attached kernel workers)
Solid E2E tests
Playwright covers most browser demos (examples/browser/test/demos.spec.ts, playwright.config.ts)
Coverage gaps remain for daemonized stacks under failure injection
Shareable computer URL — fold a running kernel's VFS + boot state into a URL another browser can rehydrate
fork() from non-main threads (#468); fork+dlopen replay so children inherit parent dlopens (#466); host reaps child workers that die without SYS_EXIT_GROUP (#465)
Terminal pane on WordPress demos + shell-based VFS (#463)
Kandelo live UI host (#467, #483) + Node.js live gallery demo (#485)
Runtimes on the kernel
Node.js–compatible runtime via QuickJS-NG — node:crypto, real zlib, TCP, TLS, real http/https with Mozilla cacert.pem, npm install lodash/express/vite end-to-end, plus browser Node/npm demo (#482, design #470, implementation plan #471)
SDK & toolchain
All 8 CLI wrappers — wasm32posix-{cc,c++,ar,ranlib,nm,strip,pkg-config,configure} (#sdk batch)
MariaDB mysql-test suite (185 tests in browser) #256, nginx + SQLite test suites #257, SQLite TCL upstream suite #264
Performance benchmark suite (5 suites, Node.js + browser) #282
CI gating on every PR — cargo test, vitest, run-libc-tests.sh, run-posix-tests.sh, and check-abi-version.sh all run in .github/workflows/prepare-merge.yml (Phase B-1/B-2 #428#432, staging release #438)
ABI, packaging, releases
Structural ABI snapshot + enforced version bump #295
Binary resolution via index.toml ledger — replaces the in-package [binary] schema with a per-release index, atomic publish via scripts/index-update.sh, project-state split into build.toml (#464, design #457)
❌ Next
Layer 0 — Headline goals
--experimental-posix-kernel— make the Wasm kernel a selectable runtime in Playground web/CLI behind a flag (the broader Playground beta-flag work is in Layer 10; this is the concrete entry point). Proof-of-concept PRs open againstWordPress/wordpress-playground: #3634 (CLI), #3635 (Web).child_processvia fork+exec). Shipped via QuickJS-NG–based Node-compatible runtime (#482) coveringnode:crypto,zlib, TCP sockets, TLS, realhttp/https, and end-to-endnpm install lodash/express/vite.Layer 1 — Stabilize what already works
tryinstruction totry_table(currently pinned via-wasm-use-legacy-eh=falseand-mllvm -wasm-use-legacy-eh=trueworkarounds)Layer 2 — Finish the browser surface protocols
argv, env, or boot scriptsdocs/browser-support.md) @mho22/dev/dsp) for sound effects @mho22Layer 3 — Distribution & ecosystem
apt(the resolver incargo xtask build-deps resolveis the plumbing — this is the user-facing layer on top)Layer 4 — Observability
Layer 5 — Agent integration
wasm32posix-*)/etc/dinit.d/*authoring)Layer 6 — Multi-host & networking
Layer 7 — Branding
host/npm package rename still pending.Layer 8 — Additional runtimes & ports
Runtime
WebAssembly.Memory) @mho22Port
Layer 9 — Miscellaneous
/dev/dspso software targeting the modern Linux audio stack works without falling back to OSS @mho22Layer 10 — External suggestions
wp-load.phpbenchmark: native vs wasm (the existing WordPress benchmark inbenchmarks/run.ts --suite=wordpressmeasures HTTP first response, not the barewp-load.phpcost)🟡 Partially landed
Started, but not yet at the level Brandon's note describes:
MessagePort→ kernel worker connection pump (examples/browser/lib/http-bridge.ts,connection-pump.ts,lib/init/service-worker-bridge.ts)examples/browser/public/service-worker.js) that already routes HTTP via a singlebridgePortexamples/browser/test/demos.spec.ts,playwright.config.ts)✅ Shipped
Kernel & POSIX coverage
/proc/self,/proc/<pid>/{stat,status,cmdline,environ,maps,fd},/proc/net/{tcp,unix}) #220/dev/{null,zero,urandom,full,fd/N,tty,ptmx,pts/*}(#228 + earlier batch)PTHREAD_PROCESS_SHAREDprimitives #324pthread_setcanceltypeXPASS #334Multi-process
SYS_EXIT_GROUP(#465)execvewith argv/envp #123,posix_spawnattribute handling + fd actions (#167 #168),execveat/fexecveposix_spawnvia SYS_SPAWN (ABI 7→8) (#439)PTHREAD_PROCESS_SHAREDmutexes/condvars #324 #327O_CLOFORK/FD_CLOFORK(POSIX.1-2024) #159Threads & synchronization
clone(CLONE_VM|CLONE_THREAD)via Workers + sharedWebAssembly.Memorypthread_createin centralized mode, futex w/ timeout, RT signals +sigqueuesi_valuepthread_atfork,dladdr, POSIX mqueues #147Memory
MAP_ANONYMOUS,MAP_PRIVATEfile-backed #99,MAP_SHAREDfile +msyncwriteback #100mremap,splice,preadv2/pwritev2,readahead#67,memfd_create+copy_file_range#66,shm_open/sem_openNetworking
SO_RCVTIMEO/SO_SNDTIMEO#115,TCP_INFO+ extra TCP options #271SCM_RIGHTS#112, AF_UNIX bind() creates filesystem inode #356MSG_OOB+SIOCATMARK#104__lookup_name, getaddrinfoSIOCGIFCONFptrWidth-aware for wasm64 #277Filesystem & VFS
MemoryFileSystem(SharedArrayBuffer-backed),OpfsFileSystem(browser persistence),DeviceFileSystem*at()family with stored OFD paths,realpath, hard links,chmod/utimensat.vfs.zstbrowser demo images (#384)vim.zipin shell demo) #279synthetic_file_content(#442)Browser runtime
SharedArrayBuffer+Atomics/dev/fb0) + canvas renderer + fbDOOM (#349 #350 #351 #364)/dev/input/mice+ Pointer Lock (#459)/dev/dsp+ Web Audio (#460)/dev/dsp(#461)Runtimes on the kernel
node:crypto, realzlib, TCP, TLS, realhttp/httpswith Mozillacacert.pem,npm install lodash/express/viteend-to-end, plus browser Node/npm demo (#482, design #470, implementation plan #471)SDK & toolchain
wasm32posix-{cc,c++,ar,ranlib,nm,strip,pkg-config,configure}(#sdk batch)setjmp/longjmpvia Wasm exception handling,exnreffor setjmp #79Ported software (~40 packages)
Testing infrastructure
cargo test,vitest,run-libc-tests.sh,run-posix-tests.sh, andcheck-abi-version.shall run in.github/workflows/prepare-merge.yml(Phase B-1/B-2 #428 #432, staging release #438)ABI, packaging, releases
binaries-abi-v<N>release scheme #365index.tomlledger — replaces the in-package[binary]schema with a per-release index, atomic publish viascripts/index-update.sh, project-state split intobuild.toml(#464, design #457)kernel_abirequired check (#432), Phase C resolver cutover + legacy publish pipeline removal (#438)Documentation
docs/Mapping to Brandon's manual list
These are the items from the original list that are now closed:
wasm32posix-cc+ 7 sibling SDK wrappersLast updated: May 17, 2026 (originally April 30, 2026)