compatibility
Compatibility matrix
What Verklet supports in the browser and server runtimes, what's partial, and what's intentionally out of scope.
This matrix tracks behavior implemented by the Verklet browser and server runtimes. It is a product contract for tests and demos, not a claim of full Node.js compatibility.
Status values:
- supported — covered by automated tests and expected to keep working.
- partial — useful behavior exists, but important Node/browser edge cases are still missing.
- experimental — implemented for smoke tests or demos; the API shape can change.
- missing — planned, not implemented.
- unsupported — intentionally outside the current browser runtime scope.
Host runtime
| Capability | Status |
|---|---|
Runtime.boot() | supported |
backend: 'browser' | supported |
backend: 'server' | supported |
backend: 'auto' Pyodide Python with server fallback | supported |
| Host capability detection | supported |
| Service Worker preview routing | supported |
| Coordinator worker RPC | supported |
| Runtime limits (processes · memory · storage · network · CPU) | supported |
runtime.on('diagnostic') events | supported |
runtime.on('error') event | supported |
| Multiple runtime instances | supported |
runtime.teardown() | supported |
Server runtime
| Capability | Status |
|---|---|
| Runtime broker sessions | supported |
| Browser VFS snapshot promotion | supported |
| Remote VFS read / write / mkdir / rm / rename | supported |
| Python / pip / uv command routing | supported |
| Server workspace persistence | supported |
| Server usage and quota events | supported |
| Server preview provider | experimental |
| Interactive stdin / long-lived server processes | partial |
| Arbitrary native package stacks | partial |
Browser Python
| Capability | Status |
|---|---|
python / python3 through Pyodide | supported |
Browser pip install through Pyodide/micropip | partial |
| Pyodide package preloading | supported |
| VFS snapshot mount and file writeback | supported |
Unsupported Python fallback to server in auto | supported |
uv, subprocesses, venvs, native Python wheels | server-only |
Virtual filesystem
| Capability | Status |
|---|---|
| Mount / read / write / rm / rename | supported |
| Path traversal rejection | supported |
| Watch events | supported |
| Symlinks · hard links | supported |
| Binary snapshots | supported |
| Tar / gzip / zip import / export | supported |
| OPFS project persistence (content-addressed, dedup'd) | supported |
| OPFS cross-tab handoff (BroadcastChannel + Web Locks) | supported |
| Persistent package cache | partial |
Process, shell, terminal
| Capability | Status |
|---|---|
| Process records · stdio streams | supported |
| Node process workers | supported |
sh interactive shell | supported |
jsh interactive shell alias | deprecated |
| WASIX/Toybox userland utilities | supported |
Shell operators (&&, ||, ;, redirection, pipes) | partial |
| Terminal resize | supported |
Signals (SIGINT, kill) | supported |
WASIX process identity (proc_id, proc_parent) | supported |
WASIX fork hook (proc_fork) | partial |
Node compatibility
| Module | Status |
|---|---|
| CommonJS loader | supported |
| ESM loader | supported |
fs · fs/promises | supported |
http · https | supported |
process | supported |
Buffer | partial |
path · url · querystring | supported |
events · stream · string_decoder | supported |
zlib · crypto | supported |
dns · net · tls | experimental |
worker_threads · vm · perf_hooks · v8 | experimental |
async_hooks · node:console · node:util/types | experimental |
child_process | unsupported |
Native .node addons | unsupported |
Explicitly out of scope for this arc: DH/ECDH crypto, http2, real
WebSocket framing, and full AsyncContext propagation.
Package managers
The supported default path is fast lockfile hydration.
| Workflow | Status |
|---|---|
Default install mode (hydrate-lockfile) | supported |
| npm lockfile hydration | partial |
| pnpm lockfile hydration | partial |
| Yarn classic lockfile hydration | partial |
Registry-proxy .wcpkg bundles | partial |
| Lifecycle scripts | partial |
| Arbitrary npm/pnpm/yarn edge cases | missing |
Frameworks and CLIs
| Workflow | Status |
|---|---|
| Simple Node HTTP server | supported |
| Vite dev server | partial |
| React fixtures | partial |
| Next.js minimal app | partial |
| Vue · Svelte · SvelteKit | partial |
| Nuxt · Astro · Remix · React Router | partial |
| Vite HMR | partial |
Browsers
| Browser / mode | Status |
|---|---|
| Chromium desktop | supported |
| Firefox (with CORP headers on every sub-resource) | supported |
| Safari / WebKit (boot + spawn) | supported |
| Safari / WebKit OPFS persistence | partial |
| Non-isolated degraded mode | experimental |
See browser support for the cross-origin isolation headers your hosting page needs to serve, and server runtime for the managed backend path.
The browser utility surface is selected around Toybox rather than
BusyBox, and runs as a trusted embedded Rust/WASI applet binary. It
currently covers cat, cp, echo, env, false, grep, head,
ls, mkdir, mv, ps, pwd, rm, tail, touch, true,
wc, and which; cd remains a host shell command because it
changes shell-local state. /ide now starts sh directly, while
jsh remains as a beta compatibility alias.
proc_fork is exposed through the WASIX host as a runtime callback
hook so fork-capable userland work can allocate child process IDs and
receive the parent memory snapshot. Full browser fork/resume semantics
still require the async WASIX process engine planned for the upstream
Toybox shell path.