Self-hosted assistant platform

The assistant
that follows up.

Moneypenny turns inbound messages into tracked, verified work for a fleet of agents on your own machines — then keeps chasing the short list only a human can do, until it's actually done. Every other tool waits to be opened. This one checks back.

Local-first — your machines, your data Agent-agnostic — pi · Claude · Codex runners Verified — every claim gated on evidence
Platform

What Moneypenny does

One pipeline from inbound signal to finished work. Each capability below is a running subsystem, not a roadmap item — the status chips in the architecture section say exactly what's live.

Listens on your channels

Channel watchers ingest iMessage and email into one event stream. Every channel enters through the same adapter interface — adding one never means rebuilding the pipeline.

Triages every signal

A classifier scores each event — actionable, routine, or noise — extracts people, dates, and amounts, and builds structured tickets. Skillsets register their own watch-rules.

Dispatches tracked work

Approved tickets become work packets with owners, steps, and acceptance criteria. An allocator serializes IDs across concurrent agents; nothing is minted by hand.

Verifies before "done"

Commit gates check packet shape, scope, and test claims. Messages carry delivery receipts. A "done" without evidence gets reopened — the platform audits itself.

Keeps the human list short

Work that genuinely needs a person — a call, an approval, a two-factor prompt — lands on the Desk as a small, prioritized list instead of another full inbox.

Follows up until done

Desk items re-surface on schedule and escalate to a text message when they slip. Most tools wait to be opened; Moneypenny checks back. That's the point.

Architecture

How the platform is built

Five layers, one direction of flow, with a plugin seam at every stage. Solid chips are running today; dashed chips are planned behind the same interfaces.

L1

Channels

Inbound listeners fire events into a single intake. One adapter contract per channel.

iMessageEmailWhatsAppSMSVoice
L2

Intake & triage

Classifier → ticket builder → entity extraction. Signals become structured tickets with people, dates, and priorities attached.

classifierentity extractionwatch-rules
L3

Human gate — Switchboard

Tickets surface for one-gesture triage. Decisions propagate: a kill cancels in-flight work, an escalation reprioritizes the queue.

approvesnoozekillescalateiPad (Capacitor)
L4

Execution engine

Packets dispatch to whichever agent fits — across machines over an encrypted peer mesh. Eval gates and receipts close the loop on every claim.

work packetspi · Claude · Codexcross-machine mesheval gates
L5

Surfaces

The Board shows what agents are handling. The Desk holds what needs a human. Both render live state — control lives in the engine, not the UI.

BoardDesktext follow-ups
Surfaces

The Board and the Desk

Two views of one system. The Board is the machine's side of the desk; the Desk is yours.

Tap any card to open its record — the same ledger the engine writes to.

The Boardwhat agents are handling
TP-424Email intake → triage UIrunning
agent: mac-node · step 2 of 4
packetTP-424 · email intake → triage UI
ownermac-node · step 2 / 4
gateshape ✓ · scope ✓ · tests pending
lastimporter wiring — not yet green
TP-429Cross-machine agent meshhandled
verified in both directions
packetTP-429 · cross-machine agent mesh
ownersteambox ⇄ mac
gateshape ✓ · scope ✓ · tests ✓
proofhandshake verified both directions
TP-421Single sign-on cutoverwaits on you
proof green · one approval needed
packetTP-421 · single sign-on cutover
owneryou · one approval
gateproof green · 2 days
blocks3 downstream tracks
TP-433Memory search failoverhandled
shipped overnight, gated, attributed
packetTP-433 · memory search failover
ownermac-node · overnight
gateshape ✓ · scope ✓ · tests ✓
commitattributed · shipped 02:14
The Deskwhat needs a human
Call the dentist

"The 4pm has been moved twice; the front desk and I are past pleasantries. A third time and it's gone — and the call is the one thing that needs you."

re-surfaces 3:40 · texts if it slips
itemdesk / call
sourcethread · front desk
historymoved 3:00 → 4:00 → 4:00
rulere-surface 15:40 · text if it slips
Approve the SSO cutover

"Proof's been green for two days. One word and the whole domain flips."

unblocks 3 tracks
itemdesk / approve
sourceTP-421 · proof green
holding2 days
ruleunblocks 3 tracks on approve
Text Mom back

"Eleven days. She's started asking your sister whether you're still alive. Three openers drafted — send one or write your own."

holding · nudges Sunday
itemdesk / reply
sourceiMessage · thread with Mom
history11 days · 3 openers drafted
ruleholding · nudge Sunday

Triage verbs — every item answers to the same five gestures, on desktop or on iPad (installed via Capacitor):

→ done← snooze↓ kill↑ escalatetap expand
Principles

Why it's built this way

Follow-up is the product

Task tools wait to be opened. Moneypenny re-surfaces the things that need a human and escalates to a text when they slip. An assistant that has to be checked isn't assisting.

Evidence or it didn't happen

Every completion claim requires a command and its output. Packet gates, message receipts, and attributed commits mean the system's history can be audited, not just believed.

Runners are swappable

The engine dispatches to pi, Claude, or Codex agents through one contract. Model economics change monthly; the platform doesn't marry any vendor.

State lives one layer down

UIs render state; truth and control live in the engine. Close a laptop, kill a session, switch machines — the work and its history survive.