Peco - in-app AI agent + workflow builder
Chat to one confirmed action.
Or build the whole workflow.
Peco pairs an in-app assistant with a visual workflow builder over one action model. The assistant turns a plain-English request into a single confirmed action; the builder wires those same actions into workflows. Nothing fires until you approve it.
raise a PO for 10 laptops from Globex
Matched procurement / create_purchase_order. Confirm the details and I will register it.
- vendor
- Globex
- quantity
- 10
- amount
- $8,000.00

What Peco does
Two surfaces, one action model.
PECO, the in-app assistant, and peco-flow, the visual builder, both act through the same catalog of real app actions. One short line each, no jargon.
Assistant
Confirm-first actions
Nothing fires until you approve. PECO drafts the action and waits - your approval is what turns it into a real, logged action.
Assistant
Real app actions
It calls a named action from your app's own catalog - not a screen, not a webhook - with a typed input schema the model must fill.
Builder
Visual builder
peco-flow is a canvas over the same actions. Drag nodes, wire typed ports, and the run walks the graph as a DAG.
Builder
AI workflow planner
Describe a workflow in plain words and get a runnable graph - built only from node types that really exist.
Governance
On-the-record activity
Every confirmed action registers a write-once Event: REGISTERED, then COMPLETED or FAILED. Proof, not a promise.
Builder
Projects
Every workflow you draw is saved to one project store, with a run log of the steps that fired and how long each took.
The confirm-first flow
A sentence becomes one confirmed action.
PECO turns a plain-English request into a single action through six ordered steps. The middle step is the point: nothing fires until you approve the drafted action.
01
Chat
Ask in plain words
02
Match
One real app action
03
Fill
Typed input schema
04
Confirm
Nothing fires until you approve
05
Fire
The action is invoked
06
Event
Write-once record
Governed and on the record
A proposal is never mistaken for a receipt.
- Nothing fires until you approve the drafted action
- A write-once Event records REGISTERED, then COMPLETED or FAILED
- The catalog PECO can act through is always one an admin allowed
ConfirmThe visual builder
Build the whole workflow, visually.
- Drag nodes and wire typed ports on a live canvas
- The run walks the graph as a DAG, with conditional branches
- Every workflow is saved to one project store, with a run log
BuilderWatch
Peco, end to end.
A short walkthrough of the assistant matching a request, the Confirm card, and the same actions wired into a workflow on the peco-flow canvas.
How it compares
Where Peco sits, honestly.
Peco is not a Zapier replacement or an RPA tool - it is a confirm-first agent over your app's own actions, with a matching visual builder. Each of these neighbours keeps a real strength; here is the honest split.
Peco is v0.1.0 and invite-only. Zapier and n8n keep an enormous connector library and mature triggers; RPA reaches legacy apps with no API at all; generic agents run more autonomously. Peco trades that reach for a confirm-first gate, a typed action catalog, and a write-once record - and it is early, which we say plainly.
Under the hood
How it actually holds together.
The story above is the plain version. For engineers, here is the machinery - a React + React Flow frontend over a shared node model, the Rust peco-workflow crate, and a confirm-first agent that registers a write-once Event for every action.
The confirm-first pipeline
A sentence becomes an action in six ordered steps. The middle step is the point: a proposal is drafted for you to approve, and only your approval turns it into a real, logged action - the one green dot below.
- 01Chat
You ask in plain language, inside the app you already use. No trigger to configure, no connector to pick.
- 02Match
PECO picks exactly one action from the catalog your apps registered. It cannot invent a capability - a hallucinated action is rejected.
- 03Fill
It slot-fills the action's input schema, asking for anything missing. Numbers it cannot infer stay blank, never guessed.
- 04Confirm
It restates the whole request in one line and waits. Correct a value and the draft updates. Nothing runs until you approve.
- 05Fire
On approval it invokes the action and, when the job lives in another app, launches it by deep link (peco://event?id=...).
- 06Event
A write-once Event is registered - REGISTERED then COMPLETED or FAILED, gated by a one-time result token. Proof, not a promise.
The Action node calls your app
Every action Peco runs is a real capability your app registered - a RegisteredApp with its Actions and their input schemas. App and action are select fields backed by the live catalog; the model must fill the typed schema correctly. Not a screen, not a webhook.
- vendorstringrequired
- itemstringrequired
- quantitynumberrequired
- amountnumberoptional
A write-once Event, token-gated
Every confirmed action registers a write-once Event: REGISTERED first, then COMPLETED or FAILED, and only the holder of a one-time result token can post the outcome. Apps are gated too - a new RegisteredApp starts PENDING and stays inert until an admin approves it.
- COMPLETED
create_purchase_order
procurement - event 9f3c1a
- COMPLETED
submit_for_approval
procurement - event b21e70
- FAILED
send_invoice
billing - event 4d80c9
- REGISTERED
notify_approver
billing - event 77af12
Type a sentence, get a runnable graph
Describe a workflow in plain words and the planner (workflowPlannerAi.ts) emits strict workflow JSON - only the node types, ports, and config fields that exist - which peco-flow renders as a graph you can run or edit. Hallucinated nodes cannot survive; the planner is constrained to the real palette.
Fetch our vendor list, keep only the active vendors, and POST them to the ops webhook.
{
"name": "Active vendor sync",
"description": "Fetch vendors, keep active, POST to the ops webhook.",
"nodes": [
{ "id": 1, "node_type": "http_request",
"config": { "url": "https://api/vendors", "method": "GET" } },
{ "id": 2, "node_type": "json_transform",
"config": { "expression": "data.vendors" } },
{ "id": 3, "node_type": "http_request",
"config": { "url": "https://ops/hook", "method": "POST" } }
],
"edges": [
{ "from_node": 1, "from_port": "response", "to_node": 2, "to_port": "input" },
{ "from_node": 2, "from_port": "output", "to_node": 3, "to_port": "body" }
],
"rationale": "Executable HTTP + JSON nodes; no files, shell, or LLM needed."
}Ten nodes across seven categories
Nine core nodes mirror the Rust peco-workflow crate; the tenth is the Action bridge. Every node has typed ports - wire an output to an input and the run carries the value across. Shown in neutral tone on purpose: the editor color-codes categories, this page does not.
file_read
file_write
http_request
json_transform
llm_invoke
shell_command
text_transform
aggregate
conditional
action
Point it at a registered app action. On the canvas the outcome is simulated so both success and failure branches are testable; run it for real and PECO invokes the action and returns its token-gated result.
Private - early access
Your words, one confirm away from done.
Peco is auth-gated and invite-only - apps need approval and there is no public install. Tell us the actions your app already exposes and we will help you put a confirm-first assistant, and a workflow canvas, in front of them.