One language. One runtime.
One database. One binary.

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.

An actor per chat room, rows in the built-in database

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;
}

One binary

woc build emits a self-contained executable: VM, your bytecode, the database engine. Deploys are a file copy; the runtime swaps code in place.

Memory safety, no tax

Rust-shaped ownership checked at compile time; where ownership cannot express the shape, the compiler infers GC — per shard, no global pause.

The database is built in

Every class is a table. Inserts are WAL-logged before they acknowledge; restart replays. No server to operate, no connection string.

Actors on every core

spawn returns an address, send moves ownership. Fibers park on io_uring instead of blocking threads — no async/await, ever.

Learn writeonce

The tutorial is written in the language and stored in its tables — work through the chapters in order: