Agents whose behaviour
you can read before it runs.
Expresso is the language coding agents use to build safe, durable autonomous software. The compiler separates what a program computes, what it observes through AI, and what it does to the world — then proves the surface before anything fires.
Agent-authored. Human-governed. Deterministically replayable.
Deterministic
Branching, loops, transformations. Replay simply re-executes it — same input, same result, every time.
Observations
AI answers and external reads. Journaled on first run; replay reuses the recorded value and never asks the model again.
Actions
Tasks, messages, payments. Granted, labeled, and keyed — every action moves through planned → dispatched → succeeded, failed, or outcome-unknown. Ambiguity is never a blind retry.
Five commands from idea to audited agent.
- 01
Install
One tarball, zero dependencies. Node is all you need.
npm install https://expresso.meetcoffee.dev/expresso-lang.tgz - 02
Write the agent
Plain rules. AI steps are typed observations; actions are declared capabilities.
- 03
Prove the surface
The compiler prints everything the program can observe and do — before it runs.
expresso check followup.expr --manifest - 04
Dry-run, then apply
Dry-run is the default. --apply fires real sinks; --journal makes it durable across restarts.
expresso run followup.expr events.json --apply --journal ./state - 05
Audit any run
Replay re-derives a recorded execution from its journal — zero model calls, zero new effects. Inspect shows every operation, attempt, and outcome; resume recovers a crashed run under its provider contracts.
expresso replay exec-1 --journal ./state
agent "MeetingFollowUp" {
grants {
ai.extract_actions // what it may OBSERVE
tasks.create // what it may DO
notes.create
notify.send
}
on meeting ended {
let actions = leaf ai.extract_actions(transcript) -> {
items: list<{ title: string, owner: string }>,
summary: string
}
for item in actions.items {
tasks.create title: item.title assignee: item.owner
}
notes.create title: "Meeting summary" body: actions.summary
notify.send to: meeting.host body: "Follow-up complete."
}
} $ expresso check followup.expr --manifest
Program MeetingFollowUp v0 hash da5c96718c451dfa
Observes: ai.extract_actions
Actions: notes.create, notify.send,
tasks.create
Approval required: (none) Nothing here is hoped for.
Replay never re-asks the model
Every AI answer is journaled. Replaying a run makes zero model calls and reproduces the same actions bit-for-bit — determinism is bought by the journal, not by a fake model.
expresso replay followup.expr events.json Effectively-once actions
Every action carries a stable idempotency key that survives crashes and retries. Receivers that honor the key — the way Stripe does — apply each action once, even when delivery is retried. That dependency is stated, not hidden.
kill -9 mid-send · restart · re-run: nothing fires twice Ambiguity stops the machine
Provider contracts declare recovery: retry with the same key, reconcile by lookup, or stop for a human. A lost response becomes outcome-unknown and is never blindly retried.
expresso resume exec-1 --resolve … Your agent writes it. You approve the authority.
Ship the authoring skill to Claude Code, Cursor, or any coding agent: it writes the
program, the compiler checks effects, grants, and recovery contracts — and you review a
one-screen effect summary instead of the implementation. Version to version,
expresso diff shows exactly what new authority a change asks for.
- Authoring skill + reference docs, packaged in the repo
- Pre-commit gate: every program re-checked before it lands
- Compiled, hash-pinned artifacts — journals refuse a changed program
$ expresso diff followup.expr followup-v2.expr
New authority since v0:
+ dm.send (action)
Changed externally visible behaviour:
agent "MeetingFollowUp" triggers/actions changed
Unchanged authority:
ai.extract_actions, notes.create,
notify.send, tasks.create Built to run every agent in Coffee.
Point a program at a channel or a live meeting. Its actions become real Coffee tasks, notes, messages, DMs, meetings, and contacts — journaled, keyed, and auditable like everything else.
expresso coffee followup.expr --apply --journal ./state
Start with your first
workspace.
Bring the work you already have, keep the tools you need, and replace the busywork nobody wants to own.
Public preview · Web + native apps · Self-hostable