100% software, 100% free, 100% possible: virtual CPU, RAM and GPU without owning the silicon.
e2ugh is an open source virtual hardware engine hosted at github.com/wenathlan/e2ugh (package @wenathlan/e2ugh 1.2.20, pins re-verified 2026-08-23) that makes any Linux container, microVM or CI runner report - and behave like - hardware it does not physically own. An unmodified lscpu prints an AMD EPYC 9965 with 192 cores and AVX-512. An unmodified free -h counts 128 GB of RAM. An unmodified nvidia-smi lists a B200. Unmodified clinfo, vulkaninfo and glxinfo find OpenCL 3.1, Vulkan 1.4 and OpenGL 4.6 devices. All of it is produced by software: a libc interception library, the Mesa CPU graphics stack, QEMU 11.1.0 MTTCG, Firecracker 1.16.1 microVMs and Docker 29.7.2 memory virtualization.
Context map (25 related contexts): tagline, badges, TL;DR proof, tool reading surface, docker quick start, probe outputs, the one container file, date-first version ledger, CPU catalog summary, GPU catalog summary, MIG summary, file structure, workflows, library usage, planner CLI, operations pointers, customization pointers, engines table, history changelog, roadmap split, dependabot, contributing, license, sources.
Security fixes target the maintained 1.x line. Vulnerability reporting follows
SECURITY.md (the supported line, the secrets boundary and the
supply-chain guarantees the pipelines enforce); the threat model of the spoofing
surface is documented in docs/security.md. The OSSF
Scorecard analysis of this repository runs weekly and on every main push.
- Hardware discovery tools never touch hardware.
lscpuparses sysfs and/proc/cpuinfo(man page: "read sysfs and/or /proc/cpuinfo"),freeparses/proc/meminfo,nvidia-smi/pynvml/gpustattalk to the NVML userspace library,clinfodispatches through OpenCL ICD manifests,vulkaninfoenumerates ICD JSONs under/usr/share/vulkan/icd.d,glxinfoasks the X display. Interpose the file reads and the libraries, and every one of these tools reports whatever the interposer decides. - Functional spoofing is a solved, documented technique.
libs/virtualhardware.cintercepts the complete libc file-access family (open,open64,openat,fopen,freopenvariants), redirects procfs reads to generated profiles, hookssysinfo()withmem_unitnormalization,uname()andgethostname(), and resolves every real symbol withdlsym(RTLD_NEXT, ...). The lineage follows three proven implementations: memoverlay, dolos and the nvml-unified-shim pattern. - Emulation supplies what spoofing cannot reach. CPUID, true core counts and cache topology need a real CPU context - QEMU 11.1.0 with MTTCG and the
EPYC-v5model (confirmed intarget/i386/cpu.cof the QEMU tree) provides one. GPU compute needs a working API - Mesa 26.2.1 provides llvmpipe (OpenGL 4.6 core, 161/161 extensions on Mesamatrix), lavapipe (Vulkan 1.4, Khronos-conformant on the Vulkan 1.3 CTS) and Rusticl (OpenCL 3.1). Nothing is stubbed: rendering and compute genuinely execute, on the CPU. - Memory is elastic, not finite. Docker
--memory-swap=-1means unlimited swap up to host capacity (Docker reference),--shm-size=2glifts the 64 MB/dev/shmdefault that breaks PyTorch dataloaders (googlecolab/colabtools#329),vm.overcommit_memory=2stretches CommitLimit, zram compresses swap in memory, KSM deduplicates pages, 1 GiB hugepages back large models. A "128 GB" sandbox is an accounting decision, not a lie the kernel can expose. - The performance is real. AVX-512 executes in the llvmpipe JIT (vector width 512, Gallivm MR !17813), QEMU MTTCG runs one host thread per vCPU with a 1 GiB translation-block cache, Firecracker snapshot restores take 3-5 ms instead of 125 ms cold boots, and Buildx GHA caching takes the reference build from 103 s to 25 s. Stacked, end-to-end times drop 3-5x.
The full proof table, detection-depth ladder and refutation of the "impossible" analysis live in docs/viability.md.
| Tool | What it actually reads | What e2ugh answers |
|---|---|---|
lscpu |
sysfs + /proc/cpuinfo (man7 lscpu.1) |
generated /proc/cpuinfo with EPYC 9965 identity, 192 blocks |
free |
/proc/meminfo parse (man7 free.1) |
generated 53-field /proc/meminfo in kB, MemTotal 134086656 kB |
nvidia-smi / pynvml / gpustat |
NVML (libnvidia-ml.so.1) |
NVML shim + virtual nvidia-smi adapter (driver 575.57.08, CUDA 12.9) |
clinfo |
OpenCL ICD dispatch (/etc/OpenCL/vendors/*.icd) |
Rusticl on llvmpipe, RUSTICL_DEVICE_TYPE=gpu, OpenCL 3.1 |
vulkaninfo |
Vulkan loader + ICD JSONs (VK_DRIVER_FILES) |
lavapipe ICD lvp_icd.x86_64.json, Vulkan 1.4 |
glxinfo |
OpenGL/GLX implementation of the X display | llvmpipe on Xvfb :99, OpenGL 4.6 core |
sysinfo(2) |
kernel syscall | hooked by virtualhardware.c, totalram normalized by mem_unit |
CPUID (raw instruction) |
the silicon | QEMU -cpu EPYC-v5,+avx512f,... under TCG/MTTCG |
The spoofing surface threat model (what static binaries can bypass and why) is documented in docs/security.md.
The engine image publishes to GHCR for linux/amd64 and linux/arm64. The two memory flags are the contract: unlimited swap lets the 128 GB profile lean on overcommit, and the 2 GiB /dev/shm keeps multiprocessing workloads away from the 64 MB Docker default.
docker run --rm -it \
--memory-swap=-1 \
--shm-size=2g \
ghcr.io/wenathlan/e2ugh:latest \
bashInside the container, unmodified system tools report the virtual machine (the full format specification and generator rules are in docs/hardware.md):
# head -6 /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 25
model : 17
model name : AMD EPYC 9965 192-Core Processor
stepping : 2
# grep -o 'avx512[a-z_]*' /proc/cpuinfo | sort -u
avx512_bf16
avx512bw
avx512cd
avx512dq
avx512f
avx512vl
# free -h
total used free shared buff/cache available
Mem: 127Gi 412Mi 126Gi 18Mi 612Mi 126Gi
Swap: 8Gi 0B 8Gi
# nvidia-smi
NVIDIA-SMI 575.57.08 Driver Version: 575.57.08 CUDA Version: 12.9
+-----------------------------------------------------------------------------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| 0 B200 On | 00000000:07:00.0 Off | 0 |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| N/A 34C P0 412W / 1000W | 96MiB / 196608MiB | 0% Default |
# clinfo -B | head -4
Platform #1: Name: rusticl, Version: OpenCL 3.1
Device #1: llvmpipe - OpenCL 3.1 (device type: GPU)
# vulkaninfo --summary | head -8
apiVersion: 1.4.0
deviceName: llvmpipe (LLVM 22.1.8)
deviceType: CPU
# glxinfo -B | grep -E 'renderer|version'
OpenGL renderer string: llvmpipe (LLVM 22.1.8, 512 bits)
OpenGL core profile version string: 4.6 (Core Profile) Mesa 26.2.1The full stack (engine sandbox, QEMU guest runner, gpu-monitor sidecar) runs with the hardened docker run recipes documented in the Dockerfile header — the compose stack and the entrypoint bootstrap are merged into the one container file (the gateway 1.1.5 standard: docker-compose.yml and entrypoint.sh are deleted), and the same memory contract (--memory-swap -1, --shm-size 2g) rides on every recipe. QEMU-specific knobs (EPQC-v5 CPU model policy, tb-size, OVMF paths) live in qemu.config; the boot chain, engine matrix and snapshot backends are documented in docs/virtualization.md.
Every version below was confirmed against a primary source (release notes, official registry or vendor page); the ledger was re-verified on 2026-08-23, which corrected the kernel, OVMF, wgpu, Spin and WireGuard rows (the earlier 7.2.1/20260213/24.x pins never existed as releases and are not cited anywhere in this repository). The rule is date-first with primary-source precedence: when an older ledger and a newer verified release disagree, the newer release wins and the old pin becomes history.
| Component | Version (date) | Primary source |
|---|---|---|
| Node.js (Current) | 26.7.0 (2026-08-05, V8 14.6, Temporal, Undici 8) | nodejs.org/en/blog/release/v26.7.0 |
| Node.js (LTS) | 24.19.0 "Krypton" (2026-08-03) | nodejs.org/en/blog/release/v24.19.0 |
| npm | 12.0.2 (2026-07-29; the Node 26 default line) | registry.npmjs.org/-/package/npm |
| Python | 3.14.7 (2026-08-05; the 3.13 lane holds at 3.13.15) | endoflife.date/api/python.json, python.org/downloads |
| TypeScript | 7.0.2 (GA 2026-07-08, native Go port) | npmjs.com/package/typescript, devblogs.microsoft.com/typescript/announcing-typescript-7-0 |
| Docker Engine | 29.7.2 (2026-08-05, API 1.52) | docs.docker.com/engine/release-notes/29 |
| Docker Buildx | 0.36.1 (2026-07-29) | github.com/docker/buildx/releases |
| Biome | 2.5.11 (2026-08-27) | npmjs.com/package/@biomejs/biome |
| Mesa 3D | 26.2.1 (2026-08-20 stable; 26.3-devel open) | docs.mesa3d.org/relnotes/26.2.1.html |
| LLVM | 22.1.8 (2026-07-10) | github.com/llvm/llvm-project/releases |
| QEMU | 11.1.0 (2026-08-11, 3200 commits, 285 authors, 12 CVE fixes) | qemu.org/2026/08/11/qemu-11-1-0 |
| Firecracker | 1.16.1 (2026-07-02) | github.com/firecracker-microvm/firecracker/releases |
| gVisor | release-20260817.0 (2026-08-19) | github.com/google/gvisor/releases |
| Kata Containers | 4.1.0 (2026-08-21, runtime-rs default) | github.com/kata-containers/kata-containers/releases |
| Cloud Hypervisor | 53.0 (2026-07-12) | github.com/cloud-hypervisor/cloud-hypervisor/releases |
| CRIU | 4.2.1 (2026-07-21) | github.com/checkpoint-restore/criu/releases |
| Wasmtime | 48.0.0 (2026-08-20, LTS until 2028-08-20) | github.com/bytecodealliance/wasmtime/releases |
| wgpu (Rust WebGPU) | 30.x (wgpu-info 30.0.0, 2026-07) | crates.io/crates/wgpu |
| OpenSSL | 3.5.5 (bundled in Node 24/26, PQ defaults) | openssl-corporation.org/post-quantum.html |
| Linux kernel (reference) | 7.1.9 stable (2026-08-19); 6.18.45 longterm; mainline 7.2 since 2026-08-16 | kernel.org |
| containerd | 2.3.4 (2026-08; time-based minors, no LTS seal) | github.com/containerd/containerd/releases |
| Spin (spinframework) | 3.6.0 | github.com/spinframework/spin/releases |
| libvirt / OVMF / OVS / DPDK / WireGuard | 12.5.0 / edk2-stable202605 / 3.7.1 LTS / 26.07.0 / kernel mainline (in-tree since 5.6) | docs/virtualization.md ledger |
GitHub Actions pin ledger, re-verified against release pages on 2026-08-23 (the workflow files align to this set in the v4 correction pass): actions/checkout@v7.0.1, actions/setup-node@v7.0.0, actions/cache@v6.1.0, actions/setup-python@v7.0.0, actions/dependency-review-action@v5.0.0, docker/setup-qemu-action@v4.2.0, docker/setup-buildx-action@v4.3.0, docker/login-action@v4.6.0, docker/metadata-action@v6.2.0, docker/build-push-action@v7.3.0, github/codeql-action@v4.37.8 (the v3 major is deprecated from December 2026). The engine embeds the same ledger in the frozen engineversions constant of index.ts so generated artifacts cite exact versions without a network round trip.
The data files carry 57 processor identities and 19 discrete GPUs plus 5 APU graphics blocks; the full tables, PCI IDs, bandwidth constants and generated-text walkthroughs live in docs/hardware.md.
| Layer | Count | Highlights |
|---|---|---|
| Processors (v5 verified bank) | 6 | EPYC 9965 192c/384t SP5, EPYC 9955 128c, Threadripper PRO 9995WX 96c sTR5, Threadripper 7980X 64c, Ryzen 9 9950X3D 16c AM5, Core Ultra 9 285K 24c LGA1851 |
| Processors (OMNI catalog) | 51 more (2024-2026) | Ryzen 9000 X3D family incl. 9950X3D2 dual X3D 192 MB, Threadripper 9000 Shimada Peak, EPYC 9755/9575F, Xeon 6980P Granite Rapids, Apple M3 Ultra, ARM Neoverse V3/Cobalt-200 |
| GPUs (verified bank) | 7 | RTX 5090 (10DE:2B85), RTX PRO 6000 Blackwell (10DE:26B5), B200 (10DE:2665), H100 (10DE:2330), A100 (10DE:20B0), RX 9070 XT (1002:748E), Instinct MI350X (1002:75A0) |
| GPUs (catalog) | 12 more | RTX 5080/5070/5070 Ti, B100/GB200, H200, A100 80GB, RX 8900 XTX, RX 7900 XTX, Arc B770/B580, MI355X, virtio-gpu (1AF4:1050) |
| APU graphics | 5 RDNA iGPU blocks | Raphael/Hawk Point/Strix Point/Strix Halo/Krackan Point |
| Boards | 20 retail + platform reference | X870E/B850/Z890/TRX50/WRX90 tiers, SP5/TR5/AM5 sockets |
| MIG slicing | 11 profiles | 96 GB divides into 4 x 1g.24gb, 2 x 2g.48gb or 1 x 4g.96gb; Blackwell layouts reach 7g.192gb with 7-instance density |
Modularity ceilings, documented with all three historical answers and the chosen policy (catalog ceiling 1-192 vCPUs, factory ceiling 1-1024, hotplug ceiling 4096 with maxcpus headroom): see docs/hardware.md section 7.
The CI pipeline enforces the flat contract: one concern per file with 20-25 related contexts inside, at most two directory levels (libs/, docs/, tests/, web/, .github/workflows/), lowercase file names, and no duplicated content between files (the md5 guard that caught the README-cloning failure of earlier generations). The table reflects the tree as find . -type f lists it; scheduler.ts, compute.ts and the tests/ suite are the v3 additions (the former future.ts was decomposed into them).
| # | File | One-line role |
|---|---|---|
| 1 | readme.md |
this master guide |
| 2 | package.json |
npm manifest: @wenathlan/e2ugh 1.2.20, ESM, zero runtime dependencies (ships the engine only; web is not part of the npm package) |
| 3 | tsconfig.json |
TypeScript 7.0.2 gate (ES2025, NodeNext, strict, erasableSyntaxOnly) |
| 4 | biome.json |
Biome 2.5.11 lint/format configuration |
| 5 | Dockerfile |
the one container file: multi-stage image (Mesa 26.2.1, LLVM 22.1.8, QEMU 11.1.0, Node 26) with the entrypoint bootstrap embedded as a heredoc COPY and the hardened docker run recipes (engine + qemu guest + gpu sidecar, memswap -1, shm 2g) — the merged docker-compose.yml/entrypoint.sh of the compose era |
| 6 | .gitignore |
keeps build artifacts, node_modules and local dependabot out of the tree |
| 7 | index.ts |
library entry: factory, validation, event bus, metrics, planner, barrel |
| 8 | orchestrator.ts |
six runtime strategies, sandbox lifecycle, warm pools, RBAC, NUMA scheduler |
| 9 | scheduler.ts |
tenant placement, QoS classes, AIP-sched policy, PSI-LSTM predictors, anomaly detection |
| 10 | compute.ts |
wasm 48 LTS tier, webgpu (wgpu 30.x) paths, AI workload planners, Node 26 APIs, checkpoint and PQ usage |
| 11 | virtualcpu.ts |
processor bank, cpuinfo/lscpu renderers, topology solver, scoring |
| 12 | virtualmemory.ts |
memory tiers, NUMA, overcommit, KSM, MIG profiles, host-aware planner |
| 13 | virtualgpu.ts |
GPU identity bank, VFIO bind/unbind, vGPU profiles, MIG density validator |
| 14 | virtualization.ts |
QEMU turbo argv builder, passage stack, MTTG cgroups, checkpoint/restore plans |
| 15 | render.ts |
Mesa environment builders, GPU profiles, virtual nvidia-smi adapter rendering |
| 16 | security.ts |
Landlock, seccomp, eBPF LSM, cgroups v2, PQ TLS policy, Rfc10024 and PqcAuditTrail |
| 17 | performance.ts |
seven performance layers plus benchmark harness |
| 18 | alternatives.ts |
ten categories of alternative sandbox engines with adapters |
| 19 | qemubridge.py |
async QMP bridge client plus a100/h100 smi-adapter facade |
| 20 | libs/virtualhardware.c |
LD_PRELOAD procfs spoofing core (memoverlay/dolos lineage) |
| 21 | libs/gpumonitor.cpp |
C++26 GPU shim suite: smi-adapter CLI, NVML/libcuda shim, forge mode |
| 22 | libs/virtualizationcore.cpp |
C++26 KVM/VFIO/QMP core, vGPU scheduler, MIG manager, NVENC tables |
| 23 | processors.json |
57-CPU registry with cpuid reference, lscpu templates, QEMU models |
| 24 | gpus.json |
19-GPU registry, APU blocks, smi-adapter profiles, MIG, shims |
| 25 | cores.json |
core types (P/E/LPE), vCPU factory 1-1024, memory presets |
| 26 | boards.json |
20 boards, SP5/TR5/AM5 platform reference, interconnect data |
| 27 | vm.config.json |
22 VM profiles, CPU/memory presets, hypervisors, production example |
| 28 | virtualhardware.json |
master schema binding the data files, module modes, defaults |
| 29 | qemu.config |
QEMU 11.1.0 configuration, MTTCG section, spoofing hooks, libvirt overlay |
| 30 | mttg.config |
cgroups v2 controllers, tenants, QoS classes, transcode pipeline |
| 31 | passage.config |
gateway, passthrough modes, network binding (never localhost), playbook |
| 32 | docker.config |
Docker 29.7.2 engine, stages, seccomp, CDI, containerd 2.3.4 reference |
| 33 | .github/workflows/ci.yml |
lint, typecheck matrix, node --test, build, flat-structure guard, JSON schema |
| 34 | .github/workflows/publishghcr.yml |
the combined container pipeline: per-arch validation legs on every push and the four-arch GHCR publication (amd64, arm64, ppc64le, s390x) with runtime probes, provenance and SBOM attestations on every release |
| 35 | .github/workflows/release.yml |
GHCR + npm + level-9 source zip on tags |
| 36 | .github/workflows/security.yml |
CodeQL, dependency review, container scans, gitleaks, Scorecard |
| 37 | docs/architecture.md |
architecture reference: principles, module map, patterns, modes, tests |
| 38 | docs/hardware.md |
hardware bank reference: catalogs, modularity, generated texts |
| 39 | docs/virtualization.md |
QEMU/Firecracker/passage/MTTG stack reference |
| 40 | docs/security.md |
the 2026 defense stack (Landlock to post-quantum) |
| 41 | docs/performance.md |
the seven optimization layers and benchmarks in depth |
| 42 | docs/viability.md |
the proof, research methodology, 145-entry bibliography and roadmap appendices A-C |
| 43 | docs/alternatives.md |
ten alternative sandbox families compared against the engine |
| 43b | docs/optimization.md |
the build-pipeline optimization roadmap (cross-compilation, prebuilt QEMU/Mesa layers, runner strategy) for the slow multi-arch grid |
| 44 | tests/ |
node:test suite executed by ci.yml with node --test (153 cases, including CI-gate replay and end-to-end simulation suites) |
| 45 | web/ |
the web node (v7): index.html terminal sandbox, login.html/register.html/dashboard.html auth pages, sandbox.js browser-pure engine port (20 commands), localauth.js static-edge browser accounts (login/register/dashboard keep working on github pages with no api; accounts are mirrored to IndexedDB so partial clears never lose them, the dashboard carries backup/restore keyfile buttons, and the CODEOWNERS admins iakadion + akadion are seeded automatically with the shared bootstrap password - surviving any storage reset), server.js self-hosted node:http API (/api/v1 sandboxes and exec), db.js sqlite persistence layer, auth.js scrypt password hashing with cookie sessions, mesh.js HMAC-signed node-to-node calls, package.json/Dockerfile (image ghcr.io/wenathlan/e2ugh; node pinned by the root .nvmrc), schema.prisma/init.sql database definition kept flat per the two-level contract, mime.types, vercel.json/netlify.toml static deploy without functions, caddyfile self-host proxy for devthink.pro, readme.md web docs |
| 46 | LICENSE |
full MIT text (Copyright (c) 2026 wenathlan) |
Module internals, the single-event-bus/single-state-machine/single-metrics resolution and the design-pattern map are documented in docs/architecture.md.
A classical quantum-simulation layer - every "qubit" is a float64 pair in
a 2^n statevector, the same virtualization doctrine as cores and gpus.
quantum.ts ships a statevector simulator (1-20 qubits, gates h/x/y/z/s/t
/rx/ry/rz/cnot/cz/toffoli/swap, crypto-seeded measurement), provable
canonical circuits (bellstate 50/50, ghz, grover2 finding |11> with one
iteration, grover3, deutsch discrimination, teleportation sketch), the
bb84 (1984) key exchange with intercept-resend detection (qber rises from
~0.20 to ~0.32 with eve and the flag trips) and the e91 (1991) entangled
variant with chsh, quantum-inspired randomness with the honest anu qrng
fallback note, the dna vault (goldman 2013 encoding: homopolymer runs <=3,
four redundant strands, byte-perfect roundtrip, 215 pb/g capacity planner
- 1 tb weighs 5.1e-6 grams), the 5d quartz planner (360 tb/disc,
femtosecond write plan, 13.8 billion years at room temperature), the qram
bucket-brigade model (giovannetti prl 2008) and the shor plan note (15 =
3x5 documented; beyond 15 exceeds the 20-qubit honest statevector
ceiling). Versions verified 2026-08-23: qiskit 2.5.2, quantum-circuit
(npm) 0.9.250 - the only active js simulator family, hqc selected as the
5th nist algorithm (march 2025, draft ~2026). The
quantumterminal command renders the summary inside any sandbox.
The saddle storage doctrine applied to the engine: everything is vram.
tiers.ts ships the four-tier model (l1 ram ~100ns, l2 vram identity,
l3 storage-as-ram via the sqlite kv lru, l4 buckets ~50us), the latency
ladder, autoscale by size (<64 mb memfs / <1 gb mmap / larger sqlite+r2),
the memoryengine (load iterates backends, persist writes all, the
storage==compute transform with the same bytes and the vfs magic-number
sniffer), npm-as-disk (200 mb chunks published as .bin.js packages on
the unlimited jsdelivr/unpkg/esm cdn farm), the github artifacts backend
(real rest via fetch), vdr 64-bit bigint addressing up to 9.22 eb with
ring-buffer demotion l1 to l3, the zram/tmpfs/swapfile bridge recipes
(zram 2-3x amplification), the sysctl drop-in and cgroups v2 slices. The
free pool catalog counts >33 tb across hf/kaggle/terabox/github/npm; the
tiers terminal command renders the summary inside any sandbox.
Sandboxes per account are uncapped (E2UGH_MAX_SANDBOXES=0 default); the
workspace quota per sandbox (4-256 MiB) remains the database bound. The
streaming command and planmodelstreaming demonstrate any-size
workloads inside a small hot window - see web/readme.md "the unlimited
path".
The web/ folder ships the browser edition of the engine - the same virtual hardware surface, running client-side with zero dependencies. Start the self-hosted API and open the page:
node web/server.js # binds a random 30000-59999 port once (PORT or --port to pin)
# then open web/index.html, pick a CPU (EPYC 9965, Ryzen 9 9950X3D, Threadripper PRO 9995WX, Xeon 6980P, M3 Ultra), slide vCPUs to 192 and RAM to 1024 GB, attach a B200, press start and type:
lscpu # AMD EPYC 9965 Virtual Compute Engine + AVX-512
nvidia-smi # the 89-column adapter table, driver 575.57.08, CUDA 12.9
clinfo # Rusticl OpenCL 3.1 on llvmpipeThe browser terminal implements twenty commands over the same byte-faithful generators the libc library serves inside containers. The server.js API exposes the identical dispatcher under POST /api/v1/sandboxes/:id/exec with a fifteen-minute sandbox TTL - the contract the saddle infrastructure (and, later, the Sedal) consumes. Deployment is static-edge only: vercel.json and netlify.toml carry no functions on purpose (no serverless lock-in), and the caddyfile reverse-proxies the self-hosted node process for devthink.pro.
The v7 web node turns that single-process deployment into a small mesh: one authoritative main node plus any number of static clones.
browser (any device)
|
-----------------+-----------------
| |
v static clone v main node
+---------------------+ HMAC-signed +------------------------------+
| vercel / netlify | --------------> | devthink.pro (caddy, tls) |
| static pages: | mesh call | node web/server.js |
| index login register| <--------------- | + db.js (sqlite) |
| dashboard sandbox.js| json reply | + auth.js (scrypt, cookie) |
+---------------------+ | + mesh.js (HMAC verify) |
| | + sandbox.js dispatcher |
v +------------------------------+
sandbox.js runs the full | |
engine client-side, sqlite file signed-out clones
zero dependencies, works (users, get 401 from the
offline too sessions, auth authority
sandboxes)
- Static edge. The clones ship only the immutable pages and
sandbox.js; they are redeployed by thepages.ymlstatic bundle (zip -9 with SHA-256 checksums) and never hold secrets, a database or a process.sandbox.jskeeps working with no backend at all. - Auth authority stays on the main node.
web/auth.jshashes passwords with the node:cryptoscryptKDF (random salt per user, timing-safe comparison), issues random session tokens stored server-side and delivered asHttpOnlycookies, and onlydevthink.proever touches the sqlite file throughweb/db.js. A clone has no login backend by design: it forwards credentials over the mesh instead of ever seeing them stored. - HMAC mesh. Every clone-to-main call is signed by
web/mesh.jswith a shared secret (HMAC-SHA256 over method, path, body digest and timestamp, replay-window bounded); the main node rejects unsigned, replayed or drifting requests with 401/403 before routing. The signature travels in a header, never as a query string. - Self-hosted node, no serverless. The whole backend is one
node web/server.jsprocess (pure node:http, zero npm runtime dependencies), packaged as the multi-arch imageghcr.io/wenathlan/e2ugh(linux/amd64, linux/arm64, linux/ppc64le and linux/s390x on the max profile, registry-cached, provenance-attested) published bypublishghcr.ymlon every release:
docker run --rm -p 37810:37810 -e E2UGH_DB=/data/e2ugh.db -v e2ughdata:/data \
ghcr.io/wenathlan/e2ugh node /engine/web/server.js --port 37810Five workflows gate the repository, all pinned to action releases verified on 2026-08-22:
- ci.yml (every push and pull request) - six gates: Biome 2.5.11 lint and format;
tsc --noEmitwith TypeScript 7.0.2 on a Node 24/26 matrix; the Node built-in test runner over the dedicatedtests/suite (153 node:test cases); a build gate; the flat-structure contract (flat tree, no deep nesting, no duplicated content via md5); strict JSON schema validation of every tracked data file. - hardware variants (publishghcr.yml matrix) - one dockerfile, three curated profiles baked at build time so operators pull exactly the flavor they need:
ghcr.io/wenathlan/e2ugh:latest(max: EPYC 9965 192c/384t, 1 TiB plan, 8x B200),:balanced(Threadripper PRO 9995WX 96c/192t, 512 GiB, 2x B200) and:lite(Ryzen 9 9950X3D 16c/32t, 128 GiB, 1x RTX 5090); every profile tag also carries semver and sha suffixes, and the runtime overlay (VHE_TOTALRAM_GB,VHE_CPUS,VHE_GPU_PROFILEenvironment variables) still lets any variant report any catalog identity up to 18 TiB at run time - the baked profile is the default identity, never a ceiling. - publishghcr.yml (the combined container pipeline; main, tags and releases) - per-architecture validation legs (
linux/amd64native;linux/arm64,linux/ppc64leandlinux/s390xunder QEMU user emulation) that validate the live stack inside the built image:clinfomust report Rusticl OpenCL 3.1 on llvmpipe,vulkaninfo --summarymust find lavapipe Vulkan 1.4, and Xvfb +glxinfomust report llvmpipe OpenGL 4.6, executed with--memory-swap=-1 --shm-size=2g. On releases, production builds push per-arch images by digest (the max profile ships the four-arch registry surface: amd64, arm64, ppc64le, s390x) with provenancemode=maxand SBOM attestations beforedocker buildx imagetoolsassembles the per-profile manifest indexes. - release.yml (version tags and releases) - three publications: the multi-arch GHCR image, the npm package with
--provenance --access public(zero runtime dependencies), and a maximum-compression (level 9) source zip with SHA-256 checksums. - pages.yml (web/ or tests/ changes on main, manual) - the web pipeline in one workflow:
node --checkon the five web modules (server.js,db.js,auth.js,mesh.js,sandbox.js), a boot smoke test on the pinned port 37810 (health endpoint and login page must answer 200), a pythonhtml.parserwell-formedness lint of the four pages, the node:test webapi suite (auth and mesh coverage) with a throwawayE2UGH_DB, a zip -9 static bundle with SHA-256 checksums as an artifact (attached to tag releases byrelease.yml), and the GitHub Pages deployment of the wholeweb/tree (static-first, SPA fallback,.nojekyll) through configure-pages/upload-pages-artifact/deploy-pages. The pages are page-relative (login.html,dashboard.html) so every route resolves both on the self-hosted node and inside the/e2ugh/sub-path of github pages. - security.yml (pushes, pull requests, weekly) - CodeQL semantic analysis for C/C++ and TypeScript, dependency review, Dockle and Trivy container scans with SARIF upload, gitleaks history scan, OSSF Scorecard, the Biome security rule group at blocking severity and an npm license allow list.
A deliberate CI fact: GitHub-hosted runners expose no /dev/kvm (actions/runner-images#12933), so QEMU-based validation runs under TCG with thread=multi, and Firecracker/Kata/Cloud Hypervisor paths are exercised only on self-hosted or bare-metal runners - the orchestrator detects the absence and falls back automatically.
The engine is a library first: zero runtime dependencies, ESM, TypeScript sources executed natively by Node 24+ type stripping. The barrel in index.ts re-exports virtualcpu.ts, virtualmemory.ts, virtualgpu.ts and virtualization.ts; orchestrator.ts, scheduler.ts, compute.ts, render.ts, security.ts, performance.ts and alternatives.ts are importable through the package subpaths declared in package.json.
import {
createVirtualEngine, // factory with health, snapshot, registry
validateSpec, // dependency-free spec validator (9 rules + warnings)
randomPort, // crypto.randomInt(30000) + 30000, never a default port
generateVirtualCpuinfo, // byte-accurate /proc/cpuinfo payload
generateVirtualMeminfo, // 53-field /proc/meminfo payload
planmemory, // swap, hugepages, KSM, overcommit, docker flags
createVirtualProcessor, // provisioned CPU from the verified bank
BEST_VIRTUAL_PROCESSORS, // the immutable six-identity bank
buildqemucmd, // turbo QEMU 11.1.0 argv (TDX/SEV/vfio/venus)
creategrid, // MTTG work-stealing grid (MTTG_MAX = 1e6)
defaultplan, plantoml, planlint, // planner: plan -> argv/docker/toml + lint
} from '@wenathlan/e2ugh';
const engine = createVirtualEngine({
vcpus: 16,
memoryGB: 64,
vramGB: 24,
host: 'sandbox.internal', // never a hardcoded default: the caller decides
// port omitted -> crypto-random in 30000-59999
});
const cpuinfo = generateVirtualCpuinfo('AMD EPYC 9965', 192);
const meminfo = generateVirtualMeminfo(128);
const memplan = planmemory({ memoryGB: 128, hugepages: '1g' });
const lint = planlint(defaultplan); // mttg floor, overcommit ceiling checks
const toml = plantoml(defaultplan); // human-editable vm.config outputThe planner doubles as a CLI: node --experimental-strip-types index.ts reads a vm.config.toml, plans the topology, and emits QEMU argv, a docker run line and a lint report. Development commands: npm run typecheck (TypeScript 7.0.2 gate), npm run lint (Biome 2.5.11) and node --test tests/ (see How to test below). Operational runbooks (host hardening, VFIO troubleshooting, capacity planning, incident: unbind of the only GPU) are condensed in docs/virtualization.md and expanded per-layer in the sibling docs.
The test contract is the Node built-in runner: no Jest, no third-party harness, no install step (zero runtime dependencies).
# from a checkout (Node 24+)
npm run typecheck # tsc --noEmit, the TypeScript 7.0.2 gate
npm run lint # Biome 2.5.11
node --test 'tests/*.test.ts' # the node:test suite (153 tests) - the glob form ci.yml uses
# from the published image (GHCR, linux/amd64 and linux/arm64)
docker run --rm --memory-swap=-1 --shm-size=2g \
ghcr.io/wenathlan/e2ugh:latest \
bash -lc 'lscpu | head -3; free -h; nvidia-smi | head -12; clinfo -B | head -4'The tests/ suite (Node 26.7.0 in CI, Node 24+ locally, node:assert/strict, 153 tests across eleven files: engine, render, specs, virtualcpu, virtualgpu, virtualmemory, media, features, plus workflow and simulation suites that replay the CI gates and the engine end to end) covers the planner and its lint rules, the /proc/cpuinfo and /proc/meminfo generators, the MIG density validator and the QEMU argv builder; the patterns are documented in docs/architecture.md. The docker probe above is the same surface publishghcr.yml validates inside the image: clinfo must report Rusticl OpenCL 3.1 on llvmpipe, vulkaninfo --summary must find lavapipe Vulkan 1.4 and glxinfo on Xvfb must report llvmpipe OpenGL 4.6.
alternatives.ts implements a common SandboxEngine adapter interface over ten categories of runtimes so the engine can be benchmarked or replaced without touching application code (comparison data verified 2026-08-22; full profiles in docs/viability.md and docs/performance.md):
| Engine | Version | Standout characteristic |
|---|---|---|
| Wasmtime + WASI 0.2/0.3 | 48.0.0 LTS | fuel metering and epoch interruption; deterministic timeouts |
| gVisor (runsc) | release-20260817.0 | userspace kernel on systrap; typical 10-30% I/O overhead |
| Kata Containers | 4.1.0 | Rust runtime-rs default; QEMU/CLH/Firecracker/Dragonball/OpenVMM |
| Cloud Hypervisor | 53.0 | rust-vmm VMM with offloaded snapshot/restore, vfio-user |
| WebContainers (StackBlitz) | GA API | Node.js and npm entirely inside the browser sandbox |
| Daytona | current | self-hostable sandboxes in ~90 ms with MCP support |
| Modal | platform | 100k+ concurrent sandboxes, sub-second scheduling, elastic GPUs |
| Fly.io Machines | platform | global Firecracker microVM API across ~35 regions |
| E2B family (E2B/Morph/Cognitora/Vercel Sandbox) | current | E2B ~150 ms cold (UFFD restore); Vercel Sandbox GA 2026-01-30 |
| Apple Containers | 1.2.2 | Linux containers in microVMs on Apple Silicon, boot under 1 s |
| Generation | Era | What it was | Fate in the current tree |
|---|---|---|---|
| e2ugh reports v1-v5 (Meta AI session) | 2026-08, Portuguese | Eleven merged research reports: 1000+ multilingual searches, 23 core proofs, optimized architecture with code, 10 alternative categories, 7-layer speed table, public repo plan | Source pool for viability proofs and the history record; PT content cited, not cloned |
| E2ugh V5 | 2026-08-22 wave | Flat shielded repo (44 files, 17 numbered docs, 5 workflows, 11 configs, 5 src) built by 16 subagents in 2 waves; pinned Node 24.19/26.7 and QEMU 11.1.0 (its kernel pin was corrected by the 2026-08-23 verification: stable 7.1.9, longterm 6.18.45) | Delivered the OMNI data catalogs (55 CPUs, boards, cores); configs merged into the v2 JSON set |
| SADDLE v5 / v6 (Meta TS) | 2026-08-22 wave | src_core_orchestrator.ts (2080 lines) and coreorchestrator.ts (1283 lines): RBAC, NUMA scheduler, balloon, SR-IOV, passage protocols, quotas, preemption, leader election, OTel exporter; plus pipelinememorypassage.ts host-aware memory planning |
Unique subsystems absorbed into orchestrator.ts (5238 lines) and virtualmemory.ts; duplicated buses/state machines/metrics collapsed into one of each |
| Virtual Hardware Engine v5 (e2ugh) | 2026-08-22, English | The 44-file public repo generation: 9 TS modules, 11 JSONs, 4 workflows, 10 English docs with ~120 cited sources | Baseline of the v2 code tree; modules renamed and extended (hardware -> virtualcpu, memory -> virtualmemory) |
| e2ugh v2 | 2026-08-22+ | The merge: 57 CPUs, 19 GPUs + APUs, one event bus (51 typed topics), one 15-state lifecycle, one metrics store | Baseline of the v3 redistribution |
| e2ugh v3-v9 (this repo) | 2026-08-23+ | The rebrand and redistribution: github.com/wenathlan/e2ugh, package 1.2.1, future.ts decomposed into scheduler.ts and compute.ts (checkpoint plans into virtualization.ts, post-quantum into security.ts), a tests/ node:test suite, and the corrected version ledger (kernel 7.1.9/6.18.45, edk2-stable202605, wgpu 30.x, Spin 3.6.0, containerd 2.3.4, WireGuard via kernel mainline) |
Current |
Full per-generation detail, including the verification reports for each wave, is preserved in docs/viability.md.
Implemented today and callable: the 78 features of the engine (55 from the former future.ts plus the 14 ledger builders and the 9 chatops/p2p/telemetry additions), redistributed across the domain modules - scheduler.ts carries tenant placement, QoS classes, the AIP-sched policy, PSI-fed LSTM predictors and anomaly detection; compute.ts carries the wasm tier (Wasmtime 48.0.0 LTS, WASI 0.2/0.3, WIT bindings, fuel metering, component ACL), the webgpu surface (forceFallbackAdapter over lavapipe, compute pipeline builder, WGSL cache, matmul dispatch, aligned with wgpu 30.x), the AI workload planners (dataloader /dev/shm, TF/CUDA matrix, ONNX WebGPU session, LLM inference planner, headless Stable Diffusion, VRAM budget) and the Node 26 APIs (Temporal scheduler, Float16 tensors, node:sqlite store, module.register hooks, Perfetto sink), with AI-session checkpoint and post-quantum usage; checkpoint/restore primitives (CRIU plans, MAP_PRIVATE snapshots, UFFD projection, dirty-page diff, migration state machine) live in virtualization.ts; the post-quantum core (ML-KEM FIPS 203, ML-DSA, X25519MLKEM768 hybrid policy, the Rfc10024 negotiator and the PqcAuditTrail tamper-evident chain) lives in security.ts; kernel features (idmapped mounts, tmpfs accelerator, io_uring deny policy, Landlock ABI v10 rulesets, cgroups v2 builder, hugepage planner) live in security.ts and virtualization.ts; hardware modules (MIG layout planner, vCPU hotplug, RAM hotplug to 1 TiB, multi-GPU composition, NUMA topology with numactl args, PCI device registry) live in virtualcpu.ts, virtualmemory.ts and virtualgpu.ts; developer experience (spec hot-reload bus, OTel bridge, health registry, graceful shutdown, plugin hooks) stays in index.ts and orchestrator.ts.
Future (not yet in code, tracked as the F-001..F-065 ledger with two dated sets): CXL 3.0 Type-3 pooling with QoS, NVLink-C2C 900 GB/s coherent fabrics, HBM3e disaggregated pools with UCIe, vGPU live migration on Blackwell, MIGv2 14-slice layouts, CUDA checkpoint with GDS, NVSwitch 576-GPU fabrics, sched_ext custom scheduler classes, PSI-autotuned rebalancing, io_uring vsock/unix bridges and fixed-buffer NVMe 14 GB/s paths, DPU offload (BlueField-3/Pensando/IPU), SR-IOV dynamic VF to 32 per pGPU, SEV-SNP/TDX second generation with confidential GPUs, RL autoscaler 1-4096 vCPUs, K8s operator CRDs, CRDT vm.config (Automerge/Yjs), GitOps Flux+OPA and federated 10k clusters. Both dated sets (v5 set A and v6 set B - same IDs, different content) are preserved verbatim in docs/viability.md appendices A and B; the 13-item backlog inherited from the v4 archive (AMX tile passthrough, dual-X3D detection, WebTransport, Turborepo on GHCR, pnpm v9, QUIC+HTTP/3 control plane, WebRTC mesh, OPFS, WebCodecs+WebGPU, cross-origin SharedArrayBuffer, WASM JSPI, GHCR gha layer reuse, Nix flakes) is preserved in appendix C of the same document.
Dependabot configuration does not fit the flat-file budget, so the intended schedule is recorded here; copy it to .github/dependabot.yml (gitignored) on forks that want automated updates:
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule: { interval: weekly }
groups: { dev-deps: { patterns: ['*'] } }
- package-ecosystem: github-actions
directory: /
schedule: { interval: weekly }
- package-ecosystem: docker
directory: /
schedule: { interval: weekly }The catalog is the single source of virtual identities. A brand new processor, gpu or memory plan joins the fleet through a reviewed pull request, never through runtime free-form input, so every identity shipped to the clones is curated:
- open a pr editing
web/sandbox.js(cpudata/gpudataentries) and the matching root catalog file (processors.jsonorgpus.json) with the real specifications (cores, threads, clocks, caches, tdp, memory ceilings) and a source url; - the ci gates run the full suite (the specs tests assert catalog integrity and cross references);
- a maintainer reviews the hardware data and merges; the next
pagesrun ships the static bundle and the Pages deployment to every clone and the next release refreshes the main container.
Runtime requests pick any catalog model with any topology up to the model thread ceiling and any memory plan up to 18 tb; the "brand new silicon" path is the pull request above.
Contributions follow the repository contract: flat structure 84 tracked files (bounded by clean optimization, not a count), 20-25 related contexts per file, no duplicated content between files, English JSDoc in third person, no emoji, node:* built-ins first, no hardcoded hosts or ports (ports default to crypto.randomInt(30000) + 30000), and every hardware or version claim backed by a primary source dated in the file header. The CI gates (biome, tsc, node test runner, structure and JSON validation) run on every pull request; the security workflow adds CodeQL, container scanning and secret detection. Bug reports should include the output of the relevant probe (lscpu, free -h, clinfo -B, vulkaninfo --summary, glxinfo -B, nvidia-smi), the engine version (engineversions from index.ts), CPU, GPU, kernel, QEMU and Docker versions, and whether IOMMU groups are isolated.
MIT. The canonical copy ships as LICENSE at the repository root; the full text is also reproduced here so the license survives single-file distribution:
MIT License
Copyright (c) 2026 wenathlan
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Primary sources verified on 2026-08-22 and cited across the specification files:
Toolchain. https://nodejs.org/en/blog/release/v26.7.0 - https://nodejs.org/en/blog/release/v24.19.0 - https://www.npmjs.com/package/typescript - https://devblogs.microsoft.com/typescript/announcing-typescript-7-0 - https://docs.docker.com/engine/release-notes/29 - https://docs.docker.com/reference/cli/docker/container/run/ - https://docs.docker.com/engine/containers/resource_constraints/ - https://github.com/docker/buildx/releases - https://www.npmjs.com/package/@biomejs/biome - https://github.com/llvm/llvm-project/releases
Mesa and the software GPU stack. https://www.mesa3d.org - https://docs.mesa3d.org/relnotes/26.2.1.html - https://docs.mesa3d.org/drivers/llvmpipe.html - https://docs.mesa3d.org/envvars.html - https://docs.mesa3d.org/rusticl.html - https://mesamatrix.net - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17813 (via https://www.phoronix.com/news/Mesa-AVX-512-LLVMpipe-Start) - Mesa MR 31551 (LP_MAX_THREADS 16 to 32) - https://www.khronos.org/conformance/adopters/conformant-products/vulkan - https://man.archlinux.org/man/Xvfb.1
Virtualization. https://www.qemu.org/2026/08/11/qemu-11-1-0 - https://www.qemu.org/docs/master/devel/multi-thread-tcg.html - https://www.qemu.org/docs/master/system/i386/microvm.html - https://gitlab.com/qemu-project/qemu (target/i386/cpu.c, EPYC-v5) - https://github.com/firecracker-microvm/firecracker/releases - https://firecracker-microvm.github.io - https://github.com/cloud-hypervisor/cloud-hypervisor/releases - https://github.com/google/gvisor/releases - https://gvisor.dev/docs/architecture_guide/platforms - https://github.com/kata-containers/kata-containers/releases - https://github.com/checkpoint-restore/criu/releases - https://github.com/bytecodealliance/wasmtime/releases - https://github.com/containerd/containerd/releases - https://github.com/spinframework/spin/releases - https://www.kernel.org (7.1.9 stable, 6.18.45 longterm) - https://github.com/tianocore/edk2/releases (edk2-stable202605) - https://www.wireguard.com (in-tree since 5.6) - https://e2b.dev/blog/firecracker-vs-qemu - actions/runner-images#12933
Hardware specifications. https://www.amd.com/en/products/processors/server/epyc/9005-series/amd-epyc-9965.html - https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-9-9950x3d.html - https://www.amd.com/en/products/processors/workstations/ryzen-threadripper/9000-wx-series/amd-ryzen-threadripper-pro-9995wx.html - https://www.intel.com/content/www/us/en/products/sku/241060/intel-core-ultra-9-processor-285k-36m-cache-up-to-5-70-ghz/specifications.html - https://www.intel.com/content/www/us/en/products/sku/240777/intel-xeon-6980p-processor-504m-cache-2-00-ghz/specifications.html (Xeon 6980P) - https://www.apple.com/mac-pro/ (M3 Ultra, announced 2025-03-05, 819 GB/s unified memory) - https://www.nvidia.com/en-us/geforce/graphics-cards/50-series/rtx-5090 - https://www.nvidia.com/en-us/products/workstations/professional-desktop-gpus/rtx-pro-6000 - https://www.nvidia.com/en-us/data-center/dgx-b200 - https://www.amd.com/en/products/graphics/desktops/radeon/9000-series/amd-radeon-rx-9070xt.html - https://www.amd.com/en/products/accelerators/instinct/mi350/mi350x.html - https://www.techpowerup.com/cpu-specs/ - https://www.techpowerup.com/gpu-specs/ - https://devicehunt.com/view/type/pci/vendor/1002/device/75A0
Spoofing technique lineage. https://github.com/stantheawesomeman/memoverlay - https://github.com/cdt4/dolos - https://github.com/pogusthewhisper/fake-nvidia-smi - https://github.com/rick-hsu/nvml-unified-shim - https://github.com/FanBB2333/GpuAdapter - https://github.com/run-ai/fake-gpu-operator - https://man7.org/linux/man-pages/man3/dlsym.3.html - googlecolab/colabtools#329
Security. https://docs.kernel.org/userspace-api/landlock.html - https://landlock.io/news - https://man7.org/linux/man-pages/man2/seccomp.2.html - moby/moby#47532 - https://www.kernel.org/doc/html/latest/admin-guide/mm/overcommit-accounting.html - https://openssl-corporation.org/post-quantum.html - https://datatracker.ietf.org/doc/rfc10024 - https://github.com/ossf/scorecard
Sandbox landscape. https://webcontainers.io - https://daytona.io - https://modal.com - https://fly.io/machines - https://e2b.dev - https://vercel.com/blog/vercel-sandbox-is-now-generally-available - https://github.com/apple/container - https://wasi.dev/roadmap