// "The browser shouldn't limit you." — Now with a Terminalless Shell

Node's node:* engine & an object-pipe shell—with zero ASCII soup.

vbs runs node:https, node:fs, node:crypto, node:child_process, and vbs:shell 100% client-side in pure Vanilla JS. Pipe real JS objects, inspect files, and spawn live servers through structured visual cards instead of a 1970s VT100 prompt.

Engine: vbs v0.2.0 Disk (OPFS): checking… Port Gateway: checking… Active Ports: booting…

Terminalless Shell (vbs:shell)

Every pipeline passes typed JavaScript objects across stages—no ANSI escape codes, no text scraping, and zero edge server. Click any preset, tap visual stage blocks, or press / to compose.

Structured Execution Stream

5-Layer Client-Only Architecture

Plain ES Modules running directly inside the browser tab—zero bundler, zero edge relay.

LAYER 4 · src/shell/
Terminalless Shell
vbs:shell · child_process

Typed JS object pipelines (ls | where | hash | sort), daemon process table, and non-ASCII visual cards.

LAYER 3 · src/net/
Networking
node:https · node:http

Full createServer, request, and get over virtual ports & /etc/hosts.

LAYER 2 · src/sys/
System & Disk
node:fs · crypto · os

Sync readFileSync/writeFileSync backed by persistent OPFS, plus sync SHA-256 & HMAC.

LAYER 1 · src/core/
Core Primitives
stream · buffer · events · path

objectMode Readable/Transform streams, Buffer, and POSIX paths.

LAYER 0 · src/kernel/
Switchboard Kernel
process · switchboard · sw.js

In-memory loopback, /etc/hosts DNS, BroadcastChannel multi-tab RPC, and /__vbs/:port.

Zero-Build Quickstart

Import vbs:shell or any node:* module directly from https://vbs.jao.life in any static HTML file.

index.html
<script type="importmap">
{
  "imports": {
    "vbs:shell":  "https://vbs.jao.life/src/shell/shell.js",
    "node:https": "https://vbs.jao.life/src/net/https.js",
    "node:fs":    "https://vbs.jao.life/src/sys/fs.js"
  }
}
</script>

<script type="module">
  import shell from "vbs:shell";
  import fs from "node:fs";

  fs.mkdirSync("/www", { recursive: true });
  fs.writeFileSync("/www/app.json", JSON.stringify({ ready: true }));

  // Run a structured object pipeline — zero terminal emulator needed!
  const result = await shell.run("ls /www | where type == file | hash sha256");
  console.log(result.value);
</script>

Programmatic node:* API Demos

Direct Vanilla JS module execution alongside the Terminalless Shell above.

1. Synchronous node:fs + Persistent Browser Disk (OPFS)
Increments /home/vbs/counter.json via fs.writeFileSync—watch it appear immediately in the Explorer above!
import fs from "node:fs";
import crypto from "node:crypto";

const file = "/home/vbs/counter.json";
const prev = fs.existsSync(file)
  ? JSON.parse(fs.readFileSync(file, "utf8"))
  : { runs: 0 };

const next = {
  runs: prev.runs + 1,
  updatedAt: new Date().toISOString(),
  sha256: crypto.createHash("sha256")
    .update(String(prev.runs + 1)).digest("hex").slice(0, 16)
};

fs.writeFileSync(file, JSON.stringify(next, null, 2));
// Click "Write & Read Disk" to test sync fs + OPFS…
2. Interactive node:* & vbs:shell Scratchpad
Write any Vanilla JS module importing vbs:shell, node:child_process, node:https, or node:crypto.
// Output from console.log() appears here…

Supported Modules (v0.2.0)

All modules are dependency-free ES Modules with CORS enabled on https://vbs.jao.life/src/*.

Specifier Source Path Key Exports
vbs:shell/src/shell/shell.jsrun, parsePipeline, registerCommand, listDaemons, stopDaemon
node:child_process/src/sys/child_process.jsspawn, exec, execPipeline, ChildProcess (objectMode streams)
node:https/src/net/https.jscreateServer, request, get, Server, Agent
node:http/src/net/http.jscreateServer, request, get, IncomingMessage, ServerResponse
node:fs/src/sys/fs.jsreadFileSync, writeFileSync, mkdirSync, readdirSync, statSync + OPFS sync
node:crypto/src/sys/crypto.jsSync createHash('sha256'), createHmac('sha256'), randomBytes, randomUUID
node:stream/src/core/stream.jsReadable, Writable, Duplex, Transform, PassThrough (objectMode)
node:buffer/src/core/buffer.jsBuffer.from, alloc, concat, byteLength
node:path / url / util / os / process/src/{core,sys,kernel}/*POSIX paths, URL, inspect/promisify, virtual cpus/env/cwd