EMMA lives here

Build software with
a resident agent.

A workspace you can daily-drive, collaboration that needs no server, and EMMA — an agent that runs on your models, on your machine, and never changes a line you haven't approved.

local-first · no account · no telemetry · works offline · cloud models opt-in

the code
// routed to the best available model
export async function brightness(star) {
  const mag = star.apparent();
  return 10 ** (-mag / 2.5);
}
the terminal
~/star-tracker $ npm test
brightness() 12ms
render table 8ms
2 passed · 0 failed
EMMA ready
One hue in, a whole theme out — chrome, syntax and all sixteen ANSI colours, generated together and contrast-checked. The app does this live, for real, with a guard that nudges failing pairs until they pass WCAG AA and then tells you it did.
Nothing lands without you

She proposes. You approve.

EMMA reads the project, stages her changes, and stops. The diff opens, you read it hunk by hunk, and what you untick never touches your disk.

EMMA in agent mode working on a task in src/stars.js, reading the file step by step in the side panel while the editor shows the untouched code, inside the Build Emma workspace
The real app, on a local model — every screenshot here is a capture, not a mockup.
The factory floor

Everything works offline.

Online is a bonus, never a requirement. There is no account to make and nothing phones home.

Workspace

One you can daily-drive

Monaco — the actual VSCode editor — with split editors and editor groups, resizable panes, a real bottom region for Problems and Output, breadcrumbs, sticky scroll, Peek Definition and zen mode. Multi-language LSP for TS/JS, Python, Rust and Go.

◆ EMMA

The heart of the house

Talk to her, hand her tasks, let her run the floor. She works in staged, agentic steps — or calls up a crew of named teammates who work in parallel, each thinking out loud in their own colour. Her brain runs on your local model, Claude, or GPT.

Local AI

Ollama-native, provider-agnostic

Your installed models are first-class — chat, code and agent tasks all on your hardware. Cloud models are an opt-in extra, never a dependency, and your keys are sealed in a local vault behind a passphrase (scrypt + AES-256-GCM).

Together

Multi-user, no servers

Two laptops on the same wifi find each other and pair up. Live cursors, shared EMMA, offline-edit merge, and peer identities verified with Ed25519 — a name can be spoofed, an identity can't. Plus a model mesh that pools everyone's GPUs.

Open tooling

Full MCP, both directions

EMMA uses standard MCP tools, and Build Emma is itself an MCP server — external agents can drive your workspace. Standard tools in, standard tools out. A sandboxed plugin API adds commands and EMMA tools of your own.

Voice

Say it, type it, or just call her

Push-to-talk speech in, spoken replies out, and a "Hey EMMA" wake word — processed entirely on your machine with Whisper and Piper. No audio ever leaves the room.

 How a task actually goes

Every task is a receipt.

She reads, she stages, she runs what she wrote — and if it fails she reads the failure and fixes it. Then you see the diff. Nothing changes your code silently, ever.

you › add a brightness() helper to stars.js and use it in the render table
reading src/stars.js · src/render.js
repo map — render.js depends on stars.js
staging +14 −2 across 2 files (not applied)
verifying — npm test against the staged files
2 passed · workspace restored byte-identical
diff opens · per-hunk review · 4.2s · 1,840 tokens · $0.00 local
v2 — the depth pass

v1 asked "does it work?". v2 asked "is it good?".

Both are answered. These are the parts that took the longest and matter the most — each one found by actually running the thing.

The verification loop

She used to write code and stop; whether it worked was your problem. Now her work is run before you see it. The hard part: staged changes aren't on disk, so a test runner could never see them — verification applies them, runs, and always puts them back. The workspace ends byte-identical and unapproved code never survives a run.

A map, not a file list

Symbols per file, imports between files, and files ranked by how many others depend on them — 170 files in 135ms. A task opens with the project's shape instead of a flat path list, and there's a sidebar panel so when EMMA says a change belongs in rpc.ts, you can see why.

Per-hunk review that tells the truth

The rail lists each change and the diff beside it renders the resolved file — so unticking a hunk makes it vanish from what you're reading. You are always looking at exactly what would land, never at an approximation of it.

Routing that admits what it doesn't know

Every run is recorded passed, failed or unproven, and that record outranks any name-and-size heuristic. Below three proven runs it says nothing at all — one lucky success is not a 100% record.

Collaboration with nothing in the middle

Sessions run on your LAN over mDNS with host-approved joins and editor/viewer roles. Want it over the internet? It tunnels through infrastructure you already own — no service of ours sits in the middle, because there is no service. The engine refuses to open it while joins are unapproved, and that refusal has no setting.

An accessibility pass with teeth

A repeatable audit across five surfaces and both themes — and Monaco and xterm are not excluded, because their colours come from our tokens, so their contrast is ours. It found eight real violations, including generated syntax colours and all sixteen ANSI colours failing AA on a light ground. Every pair passes now.

650
tests in CI,
no model required
21
browser harnesses
driving real Chromium
418→15
inline styles,
gated in CI
8
shipped themes,
all contrast-checked
Get it

Download Build Emma.

One self-contained installer. The UI, the window shell, the engine, a Node runtime and the bundled language servers all ship inside it — you install one thing.

Linux

.AppImage · .deb · .rpm
Download

The AppImage is portable — mark it executable and run it. No root required.

Windows

.exe (installer) · .msi
Download

Not code-signed yet, so Windows will show "Windows protected your PC" on first run. Click More info → Run anyway. Unsigned means no certificate has been bought — it does not mean unchecked.

macOS

.dmg — Apple Silicon & Intel
Not yet

Builds cleanly, but hasn't had its hands-on install check. It follows Linux and Windows rather than shipping untested.

What you need

  • Required: Ollama running locally with at least one model pulled — e.g. ollama pull llama3.1.
  • Optional: a Claude or OpenAI key, if you want cloud models too. It goes in the encrypted vault, not a login.
  • Optional: rust-analyzer / gopls on PATH for Rust and Go. TS/JS and Python language servers are already bundled.
  • Optional: the local voice stack, for speech and the wake word. Text works fine without it.