Give an agent an inbox.

A self-hosted visual builder for agents that run when an email arrives at an address you give them. They read the attachments, call your own APIs, and report an explicit outcome.

View on GitHubRun it in three commands

Live example: Receipt agent
Email trigger
receipts@yourcompany.com
Mail to this address starts a run. Attachments are checked and stored.
Upload · receipt.pdf
AI agent
Receipt agent
Extracts merchant, date, currency, and total
Reading receipt.pdf
MCP tool
submit_receipt
POST /receipts
ok: true
Outcome
Reported state
  • Success
  • Failure
  • Needs review
Send email
Confirm to sender
Plain-text reply to the original email.
Reply sent

Illustration of one run. The repository's receipt example stops at the submit_receipt call; the Outcome and reply steps, and the other agents, are things you add with the same building blocks.

Open source under Apache-2.0. Bring your own Gemini, Claude, or OpenAI key.

What will you build?

Any process that starts with an email and a document. Give it an address, attach your APIs as tools, and decide what each outcome does next.

Ships in the repo

Receipt agent

receipts@yourcompany.com

The example that ships with the repository. Send a receipt to the address and the agent reads the PDF or photo, extracts merchant, date, currency, and total, and posts it to your accounting API through submit_receipt. Add an Outcome block to confirm to the sender or hold an unclear receipt for a person.

Email arrivesreceipt.pdf from the sender, checked and stored
Agent calls a toolsubmit_receipt with the extracted fields
Outcome routesSuccess confirms to the sender; Needs review opens a task
Idea

Invoice approval

invoices@yourcompany.com

Matches invoices to purchase orders and holds mismatches for review.

find_purchase_ordercreate_payable
Idea

Support triage

support@yourproduct.com

Turns emailed screenshots into prioritized tickets and replies with the number.

create_ticket
Idea

Contract intake

contracts@yourcompany.com

Extracts parties, dates, and renewal terms into your records.

file_contract
Idea

Expense claims

expenses@yourcompany.com

Checks claims against policy limits before they reach finance.

check_policypost_claim
Idea

Applicant screening

jobs@yourcompany.com

Scores CVs against the role and replies with next steps.

create_candidate
Idea

Insurance claims

claims@yourinsurer.com

Opens claims from photographed forms and asks for missing documents.

open_claim
Idea

Tenant requests

maintenance@yourbuilding.com

Turns photos of a problem into a work order and confirms the visit.

create_work_order
Idea

Donation receipts

donations@yourcharity.org

Records gifts from emailed forms and sends donors their receipts.

record_gift

Every example uses the same seven step types. Each run needs at least one PDF, JPEG, or PNG attachment, and the model only ever chooses tool arguments, never the endpoint.

Build it on a canvas. Read it like a log.

Real screens from the editor and the run inspector.

Seven steps, connected by dragging

Email, Upload, Agent, MCP tool, Tool action, Send email, and Outcome. Publishing validates the graph, credentials, and schemas, then freezes an immutable version. Test run executes it with a generated receipt.

Immutable versionsTest run on the published versionExplicit save
The workflow editor: an AI agent node, Receipt agent, with the MCP tool Submit receipt attached below it by a dashed line, and an Outcome node with Success, Failure, and Needs review outputs.
Workflow editor, showing the shipped receipt example extended with an Outcome block and follow-up steps. The dashed line attaches the MCP tool to the agent; the Outcome block has one output per state.

The agent reports. The outcome routes.

An agent connected to an Outcome block must finish with one state, a reason, and a result. Each state has its own next step. Running out of turns or a provider error fails the run; it never counts as Failure.

Success and Failure built inCustom statesTen turns per agent
The Step settings panel for the Outcome node: step name Receipt result, source agent Receipt agent, and the state named Success with its selection criteria and its next step, Confirm to sender.
Outcome settings. Each state has a name, selection criteria, and one next step.

Every run on the record

Steps, tool calls, and replies are stored in PostgreSQL. Open a run to read the arguments the model sent, the API's response, the reported state, and the branches that never ran. Secrets are masked before anything is stored.

Arguments and responsesNot executed branchesPreview or accepted replies
The Execution details panel for a succeeded run: email, upload, and agent steps with their JSON outputs, then a submit_receipt tool call showing its arguments, merchant Paper and Pine, total 42.5 USD, and the API response with accepted true.
Execution details for a test run, scrolling as you do: three steps, then the submit_receipt call with its arguments and the API's response.

Tools come from your APIs

Describe an endpoint, a method, and a JSON Schema once. The worker exposes it to the model through an in-process MCP server. The model chooses argument values; it never chooses the URL, host, or headers.

Bearer or API-key credentialAllowed origins onlySchema-validated calls
The Edit MCP tool dialog for submit_receipt: tool name, HTTP method POST, description, fixed API endpoint, input JSON Schema, request field mappings, authentication set to bearer token, and the credential Accounting API token.
Editing submit_receipt: name, method, description, fixed endpoint, input JSON Schema, field mappings, and a bearer credential.

Boring where it matters.

Runs are durable, inspectable, and locked to the APIs you allow.

The test run shown above, replayed from what the inspector recorded.

Durable execution

Checkpoints after every upload and model turn. A resumed run continues; it never starts over.

Needs review

A write with a lost response stops the run for a person. Nothing requeues it on its own.

Encrypted credentials

AES-256-GCM at rest, write-only, and resolved only after the arguments validate.

Signed webhooks

Inbound email is verified before it is parsed, and repeated deliveries return the existing run.

Locked-down tool calls

Exact allowed origins, DNS pinned, no redirects, 30 seconds and 1 MiB per call.

Explicit limits

Ten model turns per agent, ten tool calls per turn, five minutes per run including retries.

Running in three commands.

Node.js 22.9 or later, pnpm 10, and Docker Compose. The first run uses a mock provider and a mock API, so it needs no keys.

pnpm install
pnpm setup:local
# Save the administrator password printed by setup.
docker compose up --build -d
  1. 1Open localhost:3000 and sign in as admin@example.com with the generated password.
  2. 2Open Receipt intake, click Publish, then Test run.
  3. 3Read the run in Execution details, then add your own Gemini, Claude, or OpenAI key.

View on GitHubRead the README

Not in this release: cycles, parallel branches, multi-tenant workspaces, billing, and hosting external MCP servers.