Open-source browser-hosted Linux userland

Tidemark

Run RISC-V Linux userland programs inside WebAssembly workers, with filesystem state, process orchestration, terminal I/O, and host-controlled network bridges built for open web applications.

Target RISC-V Linux userland
Runtime WebAssembly workers
Boundary Kernel, runtime, SDK

Open source infrastructure

An open stack you can inspect, fork, and embed.

Tidemark is an Apache-2.0 project split into kernel, runtime, SDK, docs, and artifact repositories so applications can build browser-native Linux userland workflows on their own terms.

Browse repositories

Execution model

Linux-style guest behavior, browser-native orchestration.

01

Kernel

The Rust kernel owns guest-visible RISC-V execution, ELF loading, memory, syscalls, VFS state, processes, threads, signals, pipes, and sockets.

02

Runtime

The TypeScript runtime owns workers, WebAssembly instantiation, status handling, process lifecycle handoffs, snapshots, stdio, and host bridge plumbing.

03

SDK

The SDK gives applications a compact surface for files, commands, terminals, package-backed layers, and host policy integration.

Why it exists

Bring real command-line workflows into product surfaces.

Interactive docs and tutorials

Put runnable Linux userland workflows next to explanations, without sending users to a hosted VM or external IDE.

AI agent sandboxes

Let agents inspect files, run commands, and produce artifacts inside a browser-constrained execution environment.

Embedded development tools

Add terminal-like flows, file snapshots, package layers, and host-managed network access to browser applications.

Built as layers

Use the low-level runtime directly or start from the SDK.

Tidemark keeps guest semantics out of product policy. The kernel defines Linux-visible behavior, the runtime connects that behavior to workers, and host applications decide provisioning, mirrors, persistence, and network rules.

app.ts @tidemarksh/sdk
const tm = await Tidemark.create({
  wasmBytes,
  cwd: "/workspace",
});

await tm.addFile("/workspace/hello.sh", script);

const result = await tm.run("sh", ["hello.sh"]);
console.log(result.stdout);