writeonce is a language whose compiler, runtime, web server and database ship as a single never-stopping Linux binary. Ownership-checked memory, inferred GC where ownership cannot reach, actors on every core — and the page you are reading is served by it.
No broker, no ORM, no async keyword — ownership moves the message, the WAL makes the row durable.
@table
class Message {
room: Text
body: Text
}
class Room {
name: Text
fn receive(msg: Post) {
insert Message { room: self.name, body: msg.body };
print("[${self.name}] ${msg.body}");
}
}
fn main() -> Int {
let general: actor Post = spawn Room { name: "general" };
send(general, Post { body: "hello, writeonce" });
time.sleep(50);
return 0;
}woc build emits a self-contained executable: VM, your bytecode, the database engine. Deploys are a file copy; the runtime swaps code in place.
Rust-shaped ownership checked at compile time; where ownership cannot express the shape, the compiler infers GC — per shard, no global pause.
Every class is a table. Inserts are WAL-logged before they acknowledge; restart replays. No server to operate, no connection string.
spawn returns an address, send moves ownership. Fibers park on io_uring instead of blocking threads — no async/await, ever.
The tutorial is written in the language and stored in its tables — work through the chapters in order: