Vestiarion
An AI treasury agent paying in USDC on Arc: read its decisions, ledger and books; add invoices.
ماذا يمكنك أن تفعل مع Vestiarion؟
- AP automation — invoices typed in, imported from a bill list in its own columns, dates and currency, read from a PDF, forwarded by email, captured
- Approvals inbox — approve and pay, reject, or return to the agent; claims keep two people from deciding the
- Try a limit first — see which past bills a new payment limit, two-approvals figure or spending limit would have
- Contractor milestones — verified by a merged pull request, by a person accepting the Asana task the work was
- Payee links — a payee enters and confirms their own address, or creates a passkey wallet to be paid in.
- Receivables — pay links on Arc, matched receipts, payments applied to several invoices or part of one with the
- Customer statements — a link per customer to a page of what it owes, where it can say it paid, promise a day or
- Commissions — a sales partner or referrer earns only on money a customer actually paid on Arc, for exactly the
التثبيت
أضف هذا إلى إعدادات MCP في عميلك (Claude Desktop: claude_desktop_config.json، وCursor: .cursor/mcp.json، ويستخدم VS Code وغيره الصيغة نفسها «mcpServers»).
claude mcp add --transport http vestiarion 'https://www.vestiarion.xyz/api/mcp' --header 'Authorization: <A Vestiarion workspace API key, sent as a bearer token. Use a read-only key unless the agent must add records: the write tools need a read-and-write key. No tool can approve or pay.>'
{
"mcpServers": {
"vestiarion": {
"type": "http",
"url": "https://www.vestiarion.xyz/api/mcp",
"headers": {
"Authorization": "<A Vestiarion workspace API key, sent as a bearer token. Use a read-only key unless the agent must add records: the write tools need a read-and-write key. No tool can approve or pay.>"
}
}
}
}
التوثيق
مأخوذ من ملف README للمشروع على GitHub ويُحدَّث أسبوعيًا. تفتح الروابط على GitHub.
المحتويات
Vestiarion
Your AI agent for bills and payments, for small businesses: it checks every bill before it is paid, pays in USDC on Arc inside limits a contract enforces, and signs every decision into a ledger you can verify.
Full tour (7:22) · See your first decision · Open numbers · Mainnet proof · Docs · MCP server · Security
Built on Arc and Circle · Works with Xero · QuickBooks Online · Zoho Books · HubSpot · Pipedrive · Zoho CRM · BlindPay · Asana · Google Sheets · GitHub · Slack · Telegram · Discord · Chrome · @vestiarionhq
Vestiarion runs a small business's money cycle with one agent: it screens counterparties, pays vendors, releases contractor pay, collects receivables and keeps idle cash working. A model proposes each action; ordinary code decides whether it may happen; a person decides what code sends to them; and on Arc mainnet, when the treasury is the owner's own wallet, the money itself can only leave through a spending-limit contract that wallet deployed. Every outcome, refusals included, is signed into a hash-chained ledger anyone in the workspace can verify.
Watch it work: the demo (2:59) or the full product tour (7:22), both recorded on the live product on October 15, 2026, with the Arc mainnet payment from October 12: a freelancer the agent pays on its own once a second member confirmed the address, a new supplier's first bill the model wanted to pay and code refused until a second member approved, the day the agent picks to pay, shadow mode and the customers' figures, Arc mainnet and the proof. The tour opens how the agent decided, line by line, on three of those decisions.
Tameion is ancient Greek for a treasury, the room the money was kept in. In Byzantium that room grew into the vestiarion, the department that minted the coin, held the stores and paid the army.
Contents
- How to evaluate Vestiarion in 5 minutes
- Watch each flow
- What Vestiarion does
- Why it is different
- How payments work
- Safety architecture
- Arc mainnet and Arc testnet
- Product capabilities
- Integrations
- Primitives for Arc builders
- Quick start
- Verifiable activity
- Documentation
- Development
- License
How to evaluate Vestiarion in 5 minutes
Everything below runs on the live app, www.vestiarion.xyz, with an email address and nothing else: no wallet, no USDC, no API key, nothing to install.
- Open a workspace on Arc testnet. Sign in at www.vestiarion.xyz/login with Continue with Google or Email me a sign-in link, give the workspace a name and choose Create workspace (a Test workspace, on Arc testnet, if you are asked). It starts as a sandbox: payments are simulated and nothing reaches a chain.
- Load sample data and run the agent. On Treasury, the console, choose Load sample data: six counterparties, eight invoices (seven to pay and one to collect) and two contractor milestones, chosen so that one cycle shows every outcome. Then choose Run cycle now. To try one of your own bills instead, follow See your first decision.
- Read the decisions and the refusals. On Bills & receivables, each bill shows what the agent decided: pay it, pay it on its discount's last day, ask for a missing purchase order, hold it above its supplier's limit, or flag it as a duplicate. Its card shows Agent’s reasoning and How the agent decided. Where the model wanted to pay and a rule in code stopped it, the card says "Blocked by code, not by the model" and names the rule. How payments are controlled lists every rule, and When the model and the policy disagree shows the payments code refused in production.
- Verify the signed ledger. Open Audit log and choose Verify hash chain: it checks every Ed25519 signature
and hash link and answers "Chain intact". Under Download, Signed JSON exports the chain, and
verify-ledger-export.mjschecks it on your own machine with Node.js alone (Verify an audit export). - Check production. Open numbers reads production on every load: workspaces, payments, decisions and what code refused, per network, with our own payments linked to the explorer under "Verify it yourself". Mainnet proof walks through the first payment on Arc mainnet: held by code as a first payment to a new address, approved by a second person, and paid through the owner's spending-limit contract.
Watch instead: the demo (2:59), the full product tour (7:22), and a short video for each main flow, two minutes or less each.
Reviewing security: www.vestiarion.xyz/security covers the architecture, tenant isolation, encryption, access control, connector tokens, webhooks, the subprocessors and what we do not claim. SECURITY.md says how to report a vulnerability.
Where things are in this repository:
| Path | What it holds |
|---|---|
src/app | The Next.js routes: public pages, the workspace (o/[slug]), the shared links (receipt, pay, report, statement) and the API (api/v1, api/mcp) |
src/lib | The logic: the agent and the rules in code (agent/, agent/guardrails.ts), the signed ledger (ledger.ts), Circle and Arc (circle/), the connectors, the tenant data access layer (dal/) and secrets (secrets.ts) |
src/components | The interface |
supabase/migrations | The Postgres schema, row-level security and database functions, as numbered migrations |
contracts | VestiarionSpendingLimit and VestiarionEscrow, in Solidity |
sdk and cli | @vestiarion/sdk and @vestiarion/cli: the TypeScript client and the vestiarion command |
integrations | The Slack app manifest and the HubSpot app project |
extensions | Vestiarion Invoice Capture, the Chrome extension that sends an invoice from the browser as a draft, with its store listing |
content/docs | The docs site's pages, in MDX |
scripts | Operator commands: migrations, a cycle, the payments switch, contract builds, research replays |
tests | The Vitest suite npm run verify runs, every migration included, on an in-process Postgres |
docs | Running it yourself, releasing, and each feature's design with its rollout record |
Watch each flow
One short video for each main flow, recorded in the live product on Arc testnet with demo data in the team's own workspaces. Each plays at the top of its guide, with its transcript, and on YouTube.
| Flow | Length | What it shows | YouTube |
|---|---|---|---|
| See your first decision | 1:46 | A supplier and one of its bills added in shadow mode, the agent's decision and why, and a verdict. | Watch |
| Your first payment, paid by the agent | 1:32 | A bill the agent pays on its own, one that waits for a second person, and the record of both. | Watch |
| Shadow mode on your own bills | 1:33 | Shadow mode on, test USDC for your real amounts, a mirror address, and a verdict on each decision. | Watch |
| How payments are controlled | 1:25 | A payment code refused, the limits, the people who approve, and the pause. | Watch |
| Take a workspace live on Arc | 1:26 | Wallets created, funded with testnet USDC and taken live, then a workspace on Arc mainnet. | Watch |
| Get paid by a customer on Arc | 1:05 | An invoice to a customer, its pay link and pay page, and the agent's next step on Collections. | Watch |
| Early-payment offers made by the agent | 1:13 | The bills worth paying early, an offer the agent made and the supplier accepted, and a counter. | Watch |
| Pay a contractor for verified work | 1:01 | A freelancer paid through a one-time link, released by the agent, and milestone escrow. | Watch |
| Bills from QuickBooks and Zoho Books | 1:00 | Open bills from QuickBooks and Zoho Books, reviewed and added, then decided by the agent. | Watch |
| Bills that arrive on their own | 1:17 | An invoice PDF read into the form, a pasted list of bills, and the email and Chrome intake. | Watch |
| Pay a vendor's bank account in pesos | 1:01 | Bank payouts set up with BlindPay, the vendor's bank account, and a payout followed to the end. | Watch |
| Evidence and the audit export | 0:56 | Why a payment was made, how each fact is known, and the audit log's chain check. | Watch |
| Bills from Xero, decided by the agent | 1:52 | Bills from the Xero Demo Company come in, one paid in Xero is caught before it is paid twice, and one is paid on Arc testnet. | Watch |
| A deal from HubSpot, collected on Arc | 1:55 | A deal won in HubSpot is planned, its deposit is paid and matched, and the receipt is written back to HubSpot. | Watch |
What Vestiarion does
A small business pays vendors, contractors and recurring bills through several tools a person stitches together by hand, and checks none of it continuously. Vestiarion replaces that with one decision loop, the agent cycle, that reads the whole book each time it runs:
| Area | What the agent does |
|---|---|
| Payables | Three-way match (purchase order, goods received, invoice), duplicate and risk checks, then pay, schedule, hold, request info or flag as fraud, with its reasoning attached; checks scheduled bills against the cash ahead, chooses which bills get the cash first when it cannot cover them all, and, when turned on, asks a supplier for more time on a bill it cannot pay, or a vendor for a bill's missing purchase order or goods receipt through a one-time link |
| Contractors | Releases a milestone once its evidence is verified, such as a merged GitHub pull request; on Arc testnet the milestone's USDC can sit in an escrow contract until then |
| Compliance | Re-screens every counterparty each cycle (OpenSanctions where configured) and tiers its payment limit down on a hit, reversibly. Checks every payout address against the addresses on OFAC's SDN list: the agent and people are refused one on it |
| Receivables | A signed deal becomes a schedule of receivables released on their days; a client pays through a link; the agent matches the transfer to what was owed, suggests how to apply a payment that covers several invoices, part of one or falls a fee short, and, when turned on, sends reminders for what is still owed within bounds code sets, after weighing what the customer said, paid and was promised, its own rules and the HubSpot deal it was sold through, asking a person first when the step is theirs; and, when turned on, while bills are held for want of cash, offers customers a small discount to pay an open invoice within 5 days |
| Treasury | On Arc testnet, sweeps idle cash above a 7-day buffer into Circle's USYC only when the yield beats the round-trip fee, and redeems ahead of what falls due |
| Audit | Appends every decision, human action and system event to an Ed25519-signed, hash-chained ledger, exportable and verifiable in one click, and a monthly close pack: one row per payment with its bill, approvals, checks, transaction and signed entry, as a page, a CSV or signed JSON |
The agent cycle: reconcile -> receipts -> compliance -> document checks -> follow-up -> recurring -> services -> liquidity -> AP -> contractors -> treasury -> forecast -> proposals -> collections -> early offers -> customer offers -> term requests -> document requests -> cash alert -> notices -> telegram -> slack -> discord, each stage's outcome appended to the ledger.
Why it is different
- The model argues; it cannot pay. Anthropic, OpenAI or DeepSeek returns a structured
{action, reasoning, confidence}. Code re-checks every hard rule after the model decides and before money moves, and with no model key at all a transparent rule-based policy takes the model's place. Every ledger entry records which one decided, and the written policy's answer is recorded beside the model's (research: when the model and the policy disagree). - The limit is on the money's path, not only in the code. On Arc mainnet a workspace can pay from a wallet its
owner holds. The agent's wallet can only call
payon a contract that wallet deployed, which refuses anything past the daily or 7-day figure, whatever Vestiarion's code decided. - Vestiarion does not hold that treasury's USDC. On that path the USDC stays in the owner's wallet or passkey smart account; Vestiarion holds no key to it, and the agent's wallet holds only gas. (Other setups differ; see Custody, by setup.)
- People decide what matters. A first payment to a new address, a payment above the two-approval figure, and anything the agent held all wait for a person, and some for two.
- Figures are read, not asserted. Open numbers is queried from the production database on every load, with Arc mainnet and Arc testnet counted apart and our own workspaces counted apart from customers'.
How payments work
On Arc mainnet, a workspace whose treasury is its owner's wallet pays like this:
flowchart TD
T["Owner's treasury<br/>passkey smart account or browser wallet<br/>(Circle Modular Wallets)"]
C["VestiarionSpendingLimit<br/>deployed and approved by the treasury"]
A["Vestiarion agent<br/>proposes pay / hold / flag"]
P["Code: deterministic policy and guardrails"]
H["Approvals inbox<br/>one or two people"]
W["Agent wallet<br/>holds gas only"]
V["Vendor address"]
T -- "approve(contract)" --> C
A --> P
P -- "held, flagged, new payee,<br/>above two-approval figure" --> H
P -- "allowed" --> W
H -- "approve and pay" --> W
W -- "pay(to, amount, ref)" --> C
C -- "transferFrom(treasury, vendor)<br/>within daily and 7-day figures" --> V
V -. "settles on Arc in seconds;<br/>Paid event + signed ledger entry" .-> L[("Ledger")]
In words:
- The owner's wallet is the treasury. In Go live the owner either connects a browser wallet (MetaMask,
Rabby…) or creates a passkey wallet: a Circle smart account on Arc mainnet owned by their passkey, with an optional
recovery address. The owner's wallet deploys the workspace's
VestiarionSpendingLimit, approves it on USDC and sends the agent's wallet its gas; with a passkey that is one confirmation, after the browser checks every call against what it built itself. - The agent proposes. Each cycle the model reads the invoice, the counterparty's screening, the match and the cash position, and proposes an action with its reasoning.
- Code decides. Duplicate, risk, payment-limit, three-way-match, new-payee, spending-limit and liquidity rules run as ordinary code. They can overrule the model; nothing the model writes can overrule them.
- A person decides what code sends them, in the approvals inbox (or from Slack on Arc testnet). A person's approval goes through the same payment step the agent uses.
- The contract decides last. The agent's wallet calls
pay(to, amount, ref). The contract pulls USDC from the treasury to the vendor only within the daily and 7-day figures, and never twice for the sameref. Only the owner's wallet can change the figures (setLimits), or stop the agent by setting its approval to 0. - Arc settles; the ledger records. Payment status is read back from Circle and the chain, the fee from the receipt (Arc's gas token is USDC, so the receipt is the dollar cost), and the outcome is signed into the ledger.
On Arc testnet the same decision path pays from Circle wallets instead, through the same contract once an owner or admin turns on Enforce on Arc.
Custody, by setup
| Setup | Where the USDC sits | Who can move it |
|---|---|---|
| Arc mainnet, your own wallet or passkey | The owner's wallet | The owner; the agent only through the contract, within its figures |
| Your own Circle account (testnet or mainnet) | Developer-Controlled Wallets in the customer's Circle account | Vestiarion, with the API key and entity secret the owner pasted, stored encrypted |
| Hosted testnet wallet | Wallets in Vestiarion's own Circle testnet account | Vestiarion (Arc testnet only) |
Safety architecture
flowchart LR
M["Model<br/>proposes"] --> R["Rules in code<br/>refuse or hold"] --> P["People<br/>approve"] --> K["Contract<br/>caps the spend"] --> S["Signed ledger<br/>records all of it"]
| Layer | What it guarantees |
|---|---|
| Guardrails in code | Never pay a counterparty screened high risk, above its limit, a duplicate of a settled invoice, or with an incomplete match. A refusal records the model's argument and the rule that overruled it |
| New-payee check | The first payment to a payee at an address needs two people behind it: the agent never makes one that only the person who gave the address stands behind, and that person cannot approve it either. Whoever creates a payee link counts as having given the address the payee sends, read from the link's signed ledger entry, or from the link's own record when that entry is missing. For an address sent on GitHub, or one no member can be named as having given, no confirmation counts as the second person: one member confirms it and a different one approves its first payment, and no one approves it alone before another member has confirmed it. The agent asks the same before it sends a payment again whose earlier send was never recorded, so an address changed while a payment waited does not slip past it |
| Payee lock | Off on Arc testnet until an owner turns it on. A workspace created on Arc mainnet starts with it on, with no wait, and there too an owner can turn it off or set a wait in Settings. A changed payout address is paid only once a person records how they checked it (for a call or a message, the contact they used, which they say was on file before the change) and, if the owner sets one, after a wait of 4, 24, 48 or 72 hours from the change. Whoever entered the address cannot confirm it while another member can; where no one else can, they confirm it alone, and the record says so. With the lock on, approving a payment no longer confirms its address. An address that matches or looks like another payee's, or like one the same payee had before, is flagged |
| Two approvals | Above a figure the owner sets, a payment needs two different people. Arc mainnet workspaces start at 100 USDC, and the owner can raise it but not turn it off there |
| Maker and checker | Roles are owner, admin, approver, viewer and accountant, who books and reads but decides no payment. No one approves an invoice they created; only Compliance clears a high-risk counterparty |
| Agent spending limit | A daily and a 7-day figure, checked in code and, where enforced, by the contract. Arc mainnet workspaces start at 50 USDC a day and 150 USDC in 7 days |
| Project budgets | A bill or milestone in a project has its money set aside in the project's budget, under a database lock, before the agent pays or schedules it; one the budget cannot cover waits for a person. An earmark in Vestiarion, never money locked on chain. A bill and a milestone for the same purchase order or delivered work are one obligation: the second waits for a person |
| Try a limit first | A new payment limit, two-approvals figure or spending limit can be tried on the agent's past 30 or 90 days of decisions: the code's checks replayed on what each recorded, in order, with no model call. Applying it is the setting's own change, refused if the setting moved since, and its signed entry records the replay |
| Exactly once | A database claim makes one decision exclusive; an idempotency key keyed on the invoice keeps a payment from leaving twice; the contract refuses a repeated ref |
| Stop switches | Anyone who can approve can pause the agent for the workspace; an owner's wallet can stop the contract; an operator can stop every payment on every deployment within 10 seconds |
| Audit trail | Every entry is Ed25519-signed and covers the hash of the one before. The verifier names the first entry that breaks; signed webhooks push each entry as it is written |
| Shadow mode | On Arc testnet a business keeps paying its bills itself, a person agrees or disagrees with each agent decision, and only agreed payments are made. What the business really paid is recorded beside each decision, never guessed |
| Quality Lab | Every change runs fixed scenarios through the real decision code in CI, the model's answers scripted, often to what an attacker would want: prompt injection in a memo or purchase order, a payee whose address just changed, a send whose answer was lost, clean bills that should be paid. A transfer or schedule where money should stop, one to another address or for another amount, or a second one for a bill fails CI. The result is on Open numbers and, scenario by scenario, in the Quality Lab |
The contract source is in contracts/. It was written for Vestiarion and has not been audited.
Arc mainnet and Arc testnet
Each workspace lives on one network, chosen when it is created, and never moves.
| Arc testnet | Arc mainnet | |
|---|---|---|
| Who can use it | Anyone who signs in | Anyone who signs in at vestiarion.xyz; a self-hosted deployment chooses who with MAINNET_ALLOWLIST |
| Money | Testnet USDC and EURC from Circle's faucet | Real USDC, sent on Arc or brought from another chain through CCTP |
| Treasury | Hosted wallet, or your own Circle account | Your own wallet or passkey wallet, or your own Circle account |
| Spending-limit contract | Opt-in, deployed through Circle's Smart Contract Platform | Deployed by the owner's wallet on the own-wallet path |
| Also available | USYC reserve, milestone escrow, EURC swaps, CCTP and Gateway payouts to other chains, x402, shadow mode | USDC on Arc, and CCTP payouts to Base and Arbitrum; features Arc mainnet lacks are not shown |
Mainnet proof
On Oct 7, 2026 a workspace we run made its first payment on Arc mainnet, from a passkey wallet, through its spending-limit contract:
- The owner's passkey wallet deployed and approved its contract in one transaction, with figures of 50 USDC a day and
150 USDC in 7 days:
0xe6261540…a9bb. - The agent decided to pay a 0.10 USDC invoice. Code held it: a first payment to a new address
(
counterparty.new_payee). - A second member, an admin, approved and paid it. The agent's wallet called the contract, which moved 0.10 USDC
from the passkey treasury to the vendor and emitted
Paid; fee 0.0035 USDC, confirmed in under a second, in block 24,710,870 at 09:43:13 UTC:0xcecef38e…dee6.
Contract: 0xd90cA89Fc318d0330Bb14eaeF78B72C3CA7E7fB6.
On Oct 19, 2026 two of our own test workspaces, not customers, made the first payouts from Arc mainnet to Base. Each paid 1 USDC to a wallet on Base through CCTP V2, with Circle's Forwarding Service minting it there, the CCTP fee on top. In both, the agent read the live CCTP fee and chose to pay on the due date: the bill offered no early-payment discount, so keeping the cash until then cost nothing. Code then held it as a first payment to a new address, and the workspace's only approver approved it.
- From a workspace's own Circle account
(#453): the burn on Arc,
0x89f66f7b…17e9, and the mint on Base,0x33b0f0e5…f0ac. - From the owner's passkey wallet, through version 2 of the spending-limit contract: the agent's gas-only wallet
called
payAcrossChains(#454), which took the payment and its fee from the passkey wallet and burned them on Arc,0x7c3b4b6b…2a17, and the mint on Base,0x9ea0fe5a…150c.
On Oct 22, 2026 the same test workspace on its own Circle account made the first payout from Arc mainnet to
Arbitrum (#498). The agent read Circle's live fee to
Arbitrum, 0.077 USDC, weighed it against the 10% cap on a 1 USDC bill, and chose the due date again; code held it
as a first payment to a new address, and the workspace's only approver approved it. The burn on Arc,
0xce0a7911…d7b8,
and the mint on Arbitrum,
0x385363d4…f987:
1 USDC to the payee, the 0.077084 USDC fee on top. Its shared receipt checks the mint on Arbitrum and states the
invoice number, the fee and who paid it.
Arc mainnet has no customer workspace yet; Open numbers shows the current count.
Proof on Arc testnet
Made by the agent in production:
- a USDC payable paid 53 seconds after it was added, with no one pressing Run:
0x81381c50…4e68; - a payment through the spending-limit contract, within its daily figure:
0xa79cb982…e71e; - a EURC invoice, weighed against a USDC limit at a rate quoted by Circle's Stablecoin Service:
0x2e66257f…8f58; - a payout to Base Sepolia through CCTP: the burn on Arc,
0xbc1961bb…d49c, and the mint Circle forwarded,0x6c749323…ef9a; - an invoice read from a PDF by the model, checked by a person, and paid 16 seconds after it was added:
0x197e979f…64b3; - idle cash into Circle's USYC through its Teller,
0x1cf65900…f42e, then the missing 0.88 USDC redeemed for a bill due today,0x4b5186db…c7f2, and the bill paid 34 seconds after it was added,0x365da374…9d8b; - with the cash short of two bills due the same day, the 50 USDC of database backups the agent chose to pay first,
over a 30 USDC one-off migration the written policy put first,
0x1adfad84…3a7b; - with the payee lock on, a vendor's payout address changed to a fresh wallet holding 0 USDC. The agent held its
3 USDC bill while the address was unconfirmed. The member who entered the address could not confirm it, even with a
full record. A second member confirmed it, and the agent then held the bill through the 4-hour wait. Only after
that did it pay, and the wallet went from 0 to 3 USDC:
0x49787501…0551; - the same in a workspace with one member. A record that did not say the contact was on file before the change was
refused, and so was Agree and pay during the wait. Once the wait ended, the first payment to the new address still
needed the approver:
0x7948ea38…72c5.
Each feature's design under docs/superpowers/specs/ ends with its rollout record: what was
run in production, with its ledger entries and transactions.
Product capabilities
- AP automation — invoices typed in, imported from a bill list in its own columns, dates and currency, read from a PDF, forwarded by email, captured from the browser with the Chrome extension, or sent through the API; recurring payables; early-payment discounts taken when they pay; late fees weighed when a bill waits and when cash is short, never added to what is paid.
- Approvals inbox — approve and pay, reject, or return to the agent; claims keep two people from deciding the same row.
- Try a limit first — see which past bills a new payment limit, two-approvals figure or spending limit would have held or let through, then apply it from the result.
- Contractor milestones — verified by a merged pull request, by a person accepting the Asana task the work was
delivered in, or by a person; GitHub bounties with
/bountyand/payto; a pull request comment once paid. - Payee links — a payee enters and confirms their own address, or creates a passkey wallet to be paid in.
- Receivables — pay links on Arc, matched receipts, payments applied to several invoices or part of one with the agent's suggestions, credit and fees kept apart, reversals appended, reminders for what is still owed that follow the customer's context (a dispute, a claim, a promise, its own rules, its HubSpot deal's owner), and a search by invoice number, id, purchase order, amount or transaction.
- Customer statements — a link per customer to a page of what it owes, where it can say it paid, promise a day or dispute an invoice; the agent's reminders wait while a promise or a dispute stands.
- Commissions — a sales partner or referrer earns only on money a customer actually paid on Arc, for exactly the amount applied; a person turns what is due into a payable the agent pays like any bill, and the partner never approves their own payout.
- Deals — a signed deal (a deposit and the balance, milestones, a retainer or custom lines) as a schedule that adds up to its total exactly; each line released as a receivable on its day, by a person or the agent; a price change or a cancel is a signed new version that never rewrites what was invoiced or paid.
- Projects — a budget and a buffer in USDC for each job, client or launch; its bills, milestones and deals, what is set aside, paid and still available, what its deals collected, and its days in the payment plan. The agent never sets aside the same money twice, and holds what a budget cannot cover for a person.
- Treasury — safe-to-spend today, cash outlook, USYC reserve with Bring cash back (Arc testnet).
- Cross-currency and cross-chain — EURC invoices and swaps, CCTP and Gateway payouts (Arc testnet), and CCTP payouts to Base and Arbitrum from Arc mainnet.
- Supplier payment status — a link per supplier to a page of its own bills: where each one stands, from received to paid, with each payment's transaction on Arc, and never why a bill is held.
- Early-payment offers — the agent's later bills, each with the discount worth asking for paying today; an owner or admin sends the supplier a one-time link, or turns on the agent's own offers: it picks the bills and the discount up to a ceiling, only from cash it can pay today, and emails the supplier the link. An accepted offer is paid at the discounted amount the same day.
- When the cash is short — the agent checks each scheduled bill against the cash ahead and holds one it will not cover days early. When the bills due within 14 days come to more than the cash, the model orders them by what costs the business most to pay late, saying why for each, and code pays in that order only while the cash lasts. When turned on, it asks a supplier for more time on a bill it cannot pay, answers a supplier who proposes fewer days, and takes the request back once the cash is there; and it offers customers a small discount to pay sooner. It tells the owner how much is needed and by when, in the console, Telegram and Slack.
- Weekly brief — on Mondays, owners, admins and approvers get the week by email: what was paid and received, the decisions, what waits for them, what leaves next, whether the cash covers the next 30 days, and the week's payee address changes, frozen payees first. In shadow mode it reports the verdicts instead, and how often the business agreed with the agent.
- Bank payouts — a vendor's bills paid to its bank account in Mexico, in pesos over SPEI through BlindPay, from the workspace's USDC; a person sees what the vendor receives and approves every one (BlindPay's development instance).
- Shadow mode — try the agent on real bills, paid in the business's own way, before it pays anything itself.
- Report — what the agent did with a workspace's real bills: payments with their transactions, what it stopped and why, how often a person stepped in, discounts measured from the transfers, and what is left before a live slice, with how often the business agreed with the agent by decision and by vendor and the number of verdicts behind each figure, which an owner then opens on Arc mainnet with the vendors they choose, each showing that agreement, carried over without typing them in again. Agent vs what really happened lays each bill's decision beside what the business recorded paying outside Vestiarion, one bill at a time, from a CSV, or from a bank statement whose lines are matched to the bills they could have paid, each figure linked to its signed entry. Value keeps measured, estimated and not-counted figures apart, and an owner or admin can share a live copy by a revocable link, with suppliers as labels and amounts hidden if they choose.
- Workspaces and members — per-network workspaces, invitations, five roles, per-member notifications; an accountant console across the businesses an outside accountant looks after, and a one-time link an accountant sends a new client, who opens their own workspace in shadow mode with the accountant already in it.
- When a payment does not settle — each exceptional state says who acts, what Vestiarion already did and what to do next; paying again always looks for the earlier transfer first.
- Why it was paid — one page per payment, link by link from the purchase order to the receipt, each fact marked checked by code, verified outside or stated by a person; entries checked again in the browser, and a JSON download.
- Audit — the signed ledger, one-click verification, exports, and signed webhooks.
Integrations
Circle integrations
| Circle product | Used for |
|---|---|
| Developer-Controlled Wallets | Treasury and agent wallets, transfers, balances, confirmation |
| Modular Wallets | Passkey smart accounts: the owner's treasury on Arc mainnet, and a payee's wallet |
| Smart Contract Platform | Deploying the escrow and spending-limit contracts on Arc testnet |
| Gas Station | Paying the agent wallet's gas on Arc testnet |
| USYC | The yield-bearing reserve, through its Teller (Arc testnet) |
| CCTP V2 and Gateway | Paying payees on other chains: through CCTP and Gateway on Arc testnet, where Gateway also settles x402 purchases, and through CCTP to Base and Arbitrum from Arc mainnet |
| CCTP V2 Forwarding Service | Adding USDC to a workspace's wallet on Arc from Base, Ethereum and other chains, minted by Circle so the wallet needs no gas (both networks) |
| Stablecoin Service | EURC quotes and USDC→EURC swaps (Arc testnet) |
| Notifications | Settlement and incoming-transfer webhooks, recorded within seconds |
Team and developer tools
| Surface | What it does |
|---|---|
| Slack | Decisions in a channel, with bills waiting for approval and a Review button each; /vestiarion today, waiting, ledger; Approve and pay, Reject and Return buttons on Arc testnet within a limit; add an invoice from a message |
| Telegram | Each member's own chat: decisions with reasons, bills waiting for approval with a Review link, /today, /waiting, /ledger, invoices read from a PDF. The bot never approves or pays |
| Discord | Bills the agent holds or flags for a person, posted to a channel through its webhook after each cycle, each with a link to review it in Approvals. A link never approves |
| REST API | /api/v1 with per-member keys: read everything, each payment's evidence and receipt and the monthly close pack included, and with write access add counterparties, invoices, milestones and payee links. A key never approves or pays |
| TypeScript SDK | @vestiarion/sdk: a typed client for every /api/v1 operation, plus webhook and ledger verification, and offline checks of evidence, receipts and close packs |
| CLI | @vestiarion/cli: the vestiarion command for every /api/v1 operation but the evidence reads, asking before each write, plus offline checks of audit exports and webhook signatures |
| Postman | A Getting Started collection, from a key to a first call and a first write, and an API reference collection with every /api/v1 operation, both generated from the OpenAPI document and served at /postman/ |
| MCP server | /api/mcp, whose tools are the /api/v1 operations but the evidence reads, for AI agents; server.json describes it for the MCP Registry |
| Webhooks | Up to 5 HTTPS endpoints per workspace receive every ledger entry, signed, with retries |
| GitHub | Milestone verification from merged pull requests, bounties, and payment comments |
| A workspace address that reads forwarded invoices into drafts a person adds | |
| Chrome extension | Vestiarion Invoice Capture sends the invoice text you select on a page, or a file you choose, to your workspace as a draft: you check the fields it read and send it, and an owner or admin adds it as a bill through the same checks as any bill. It connects by signing in and allowing it, never with an API key, and can only create and read its own drafts: it never adds a bill, approves or pays. Add it to Chrome from the Chrome Web Store, or download it and load it unpacked, as the guide says. Its source is in extensions/chrome-invoice-capture |
| Asana | A milestone linked to the Asana task its work is delivered in is ready for acceptance when the task is completed; a person checks the deliverables against the criteria and accepts it, and the agent then decides its payment as for any verified milestone. A task completed in Asana is never by itself a reason to pay, and a task reopened or changed after acceptance is flagged |
| HubSpot | Won deals come in with their customers every 15 minutes; Plan collections fills in the New deal form, and a deal changed in HubSpot afterwards is flagged on its deal for a person to change or keep; once allowed, each planned deal's receipts are written back to it (collected, still owed, last receipt, reconciliation), read back, never over a person's change; one account per workspace. Watch it (1:55) |
| Pipedrive | Won deals come in with their organizations and persons as soon as Pipedrive says a deal changed, and every 15 minutes; Plan collections fills in the New deal form, and a deal changed in Pipedrive afterwards is flagged on its deal for a person to change or keep; once allowed, each planned deal's receipts are written back to it in Vestiarion's own deal fields, read back, never over a person's change. Pipedrive names no developer sandbox, so only payments on Arc mainnet outside shadow mode are written; one company per workspace |
| BlindPay | Bank payouts: a vendor given its CLABE has its bills paid to its bank account in Mexico, in pesos over SPEI, from the workspace's USDC on Arc. Only the bank and last four digits are kept; every payout is held for a person, who sees BlindPay's quote of what the vendor receives, and takes exactly the bill's amount or sends nothing. BlindPay's development instance in this version |
| Zoho CRM | Won deals come in with their accounts and contacts every 15 minutes, from the Zoho data center the account lives in (any but China's); Plan collections fills in the New deal form, and a deal changed in Zoho CRM afterwards is flagged on its deal for a person to change or keep; read-only, and several workspaces may connect the same organization |
| Xero | Bills approved in Xero come in for review every 15 minutes, through the same check as a bill list, and become payables when a person adds them; once paid on Arc, each payment is drafted as a booking against its bill, which an owner or admin reviews field by field and approves before anything is written to Xero. A payment on Arc testnet or in shadow mode is booked only into a Xero demo company. Watch it (1:52) |
| QuickBooks Online | Open bills in QuickBooks come in for review every 15 minutes, and sooner when QuickBooks says one changed, through the same check; a bill partly paid there comes in at what is left; read-only, with the bank account payments will be booked to chosen ahead |
| Zoho Books | Open bills in Zoho Books come in for review every 15 minutes, through the same check, from the Zoho data center the account lives in (any but China's); a bill partly paid there comes in at what is left, and one paid or voided after it was added is flagged; a person with several organizations picks one; read-only, and a bill deleted in Zoho Books is not seen |
| Google Sheets | A month's close pack exported to a spreadsheet in the connected Google Drive: one row per payment with its signed entry, a summary with the tab's SHA-256, updated in place on the next export. Access to the files it makes only; it never shares them |
The Postman collections are also in a public workspace, Vestiarion API, and the MCP server is in the MCP Registry as io.github.duongnq2798/vestiarion.
npm install @vestiarion/sdk # the typed client
npm install --global @vestiarion/cli # the vestiarion command
The vestiarion command works with a workspace from a terminal, with a key from Settings → API keys:
vestiarion login # asks for the key, checks it, saves it for your user
vestiarion bills list --status held # what the agent held; bills show <id> says why
vestiarion ledger verify vestiarion-acme-ledger-1042.json # an audit export, checked offline
Operators of a deployment of their own also run the repository's scripts (npm run cycle, npm run status, …), listed
in docs/self-hosting.md.
Primitives for Arc builders
Pieces of Vestiarion another Arc app can take as they are, under this repository's license. Each is tested on its own.
To fork just the two contracts and the ledger verifier, without the app, use duongnq2798/vestiarion-primitives: a Foundry project with both contracts byte for byte, a build that reproduces the Arc mainnet bytecode and a script that checks it against the chain, unit, fuzz and invariant tests, deploy scripts, the deployment addresses, and viem examples for each call.
| Primitive | What it gives an Arc app | Where |
|---|---|---|
VestiarionSpendingLimit | An agent that pays from a treasury it does not hold. Only the agent's wallet calls pay(to, amount, ref); it never passes a daily or a 7-day figure and never pays a ref twice. The treasury keeps its USDC and approves the contract, so the contract holds nothing; its owner changes the figures with setLimits, or stops the agent by approving 0. Runs on Arc mainnet: 0xd90cA89Fc318d0330Bb14eaeF78B72C3CA7E7fB6, source verified on Sourcify. | contracts/VestiarionSpendingLimit.sol, deploy and calls in src/lib/spending-limit/, tested in an in-process EVM in tests/spending-limit-contract.test.ts |
VestiarionSpendingLimitV2 | Version 2, which path C deploys since Oct 19, 2026: all of the above, and payAcrossChains(amount, maxFee, domain, recipient, ref), which pays a vendor on Base through CCTP V2 from the same treasury, counting the amount and its fee against the same figures. The token messenger and the allowed domains are fixed at deployment, the fee is capped at 10% and 2 USDC, and the contract holds nothing after a call. Not audited. Runs on Arc mainnet: 0x00b83bA62F17cd49c9ccB8e782e166c481e5d94F, source verified on Sourcify. Every deployed contract is listed with its verified source on Contracts on Arc. | contracts/VestiarionSpendingLimitV2.sol, the upgrade in src/lib/treasury/contract-upgrade.ts, tested in tests/spending-limit-v2-contract.test.ts |
VestiarionEscrow | Milestone escrow in about 80 lines: the payer locks USDC for a payee, releases it, or takes it back from a set date. No owner, no upgrade. | contracts/VestiarionEscrow.sol, src/lib/circle/escrow-holds.ts, tests/escrow-contract.test.ts |
| A signed decision ledger | Every decision an agent makes, with the facts it saw, as an Ed25519-signed, hash-chained entry. Anyone verifies one entry or a whole chain, in a browser or offline from an export. | src/lib/ledger.ts, verifyLedgerEntry in the SDK, Verify an audit export |
| Shadow mode | A way to try an agent on a business's real bills without moving its money: each decision waits for a person's verdict, each agreed payment settles on Arc testnet at the real amount, the agreement rate is counted, overall and by decision kind and vendor with the number of verdicts behind each figure, and what the business really paid is recorded and compared bill by bill. | src/lib/shadow-mode.ts, src/lib/verdicts.ts, src/lib/autonomy-ladder.ts, src/lib/actual-payments-compare.ts, Shadow mode |
@vestiarion/sdk | A typed client with no dependencies, plus webhook and ledger signature checks. | sdk/, npm |
What these add to the circlefin/arc-\* samples. The samples show how to move USDC on Arc: checkout, peer-to-peer
payments, a treasury across chains, an escrow released by an AI review, an agent paying for x402 services. An agent's
budget there, as in arc-nanopayments' --limit, is enforced by the agent's own process. Here the bound is a contract
on Arc that the agent's wallet cannot get past, while the treasury keeps custody. Each payment carries a signed record
of why it was made, and shadow mode measures how often people agree with the agent before it pays on its own.
Quick start
Use the hosted app — no wallet or keys needed to start:
- Sign in at www.vestiarion.xyz with your email and open a workspace on Arc testnet, in shadow mode.
- Add a supplier and one of your bills, or load sample data, and watch the agent decide within a minute.
- Agree or disagree with its decision, read the Report of what the agent did, then verify the signed ledger.
The whole path is in See your first decision. To move testnet USDC, follow Go live and fund the wallet from Circle's faucet.
Call the API — create a key under Settings, then:
curl -H "Authorization: Bearer $VESTIARION_API_KEY" https://www.vestiarion.xyz/api/v1/status
See the Quickstart and Authentication.
Verifiable activity
- Open numbers — workspaces, payments, the agent's decisions, what code refused and what people decided, per network, customers apart from us, read from production on every load. Figures change daily, so this README links there instead of copying them.
- The ledger — every workspace's
/auditverifies its whole chain in one click; exports and webhooks carry the same signed entries. - Research — three weeks of the model's decisions recorded beside the written policy's, including where code had to refuse it.
- Quality Lab — fixed scenarios run through the real decision code on every change, each one's expected and actual outcome, and how many wrong payments: none may merge.
- Address lookalike checker — a free page that compares an address with ones you know, with a broader rule than the lookalike warning on Counterparties, and checks its characters, checksum and OFAC's list in the browser.
Contracts on Arc testnet
Vestiarion's own contracts, the copies in our test workspace:
| Contract | Address |
|---|---|
VestiarionEscrow | 0x74af203fec3f121ff1cd3a763092d1211487702b |
VestiarionSpendingLimit | 0x9da3c47f73ea9399ac566806a189b0bf47b7d4ba |
The Circle contracts it calls:
| Contract | Address |
|---|---|
| USDC | 0x3600000000000000000000000000000000000000 |
| EURC | 0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a |
| USYC | 0xe9185F0c5F296Ed1797AaE4238D26CCaBEadb86C |
| USYC Teller | 0x9fdF14c5B14173D74C08Af27AebFf39240dC105A |
| USYC Entitlements | 0xCC205224862C7641930c87679E98999d23C26113 |
| Gateway Wallet | 0x0077777d7EBA4688BDeF3E311b846F25870A19B9 |
| Gateway Minter | 0x0022222ABE238Cc2C7Bb1f21003F0a260052475B |
| CCTP TokenMessengerV2 | 0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA |
What each one is for, the wallets around them, and the USDC of the chains payees are paid on: Contracts.
Documentation
| Start | See your first decision · How payments are controlled · Go live · Your first payment · Shadow mode |
| Guides | Payment plan · Where a payment is · Workspace report · Try a limit first · Pay a contractor · Asana acceptance · Invoice capture · Get paid · Customer statements · Supplier payment status · Commissions · When a payment does not settle · Accountants · Why a payment was paid · Evidence pack and receipts · Cash scenarios · Deals · Projects · Audit export |
| Developers | Quickstart · API reference · SDK · CLI · Postman · Webhooks · MCP · Changelog |
| This repository | ARCHITECTURE.md · Running it yourself · Feature designs · Contracts · SDK source · CLI source · Changelog · Releases · Releasing · Distribution |
Development
Next.js, TypeScript, Supabase Postgres with row-level security, Vitest, Solidity 0.8.37.
npm install
cp .env.example .env.local # Supabase URL and keys, VESTIARION_MASTER_KEYS, SUPABASE_JWT_SECRET
npm run db:migrate
npm run dev
You need a Supabase project (Project Settings → API for the URL and keys, the JWT secret under JWT Keys). With no Circle or model keys, payments are simulated against Arc's measured fee and latency, and decisions come from the rule-based policy, so the app runs end to end with no credentials.
npm run verify # typecheck, lint and the full test suite: what CI runs
The suite needs no Supabase, Circle or model key: it covers the ledger's tamper cases, risk tiering, treasury economics, guardrails and provider fallback, and runs every migration on an in-process Postgres (PGlite) to hold the database's half of the hash chain to the verifier.
It also runs the Quality Lab (tests/quality-lab.test.ts): the scenarios in src/lib/quality-lab/scenarios.ts
through the real AP stage, with the model's answers scripted. Beside them, tests/quality-lab-shadow.test.ts replays
the team's own shadow-mode decisions (src/lib/quality-lab/shadow-decisions.json) through the same stage, with the
model's answers as recorded. Each fails on any wrong payment, and while its committed result
(src/lib/data/quality-lab.json, src/lib/data/quality-lab-shadow.json) is not what the run gives. After a change to
the decision code, the scenarios or the exported decisions:
npm run quality-lab # runs the scenarios and the replay and writes both result files; commit them
docs/self-hosting.md covers the rest: environment variables, the founding workspace, every script, going live per path, the scheduled jobs (Supabase Cron), Circle notifications, GitHub, and what is live versus simulated.
License
MIT. Zoho, Zoho Books and Zoho CRM are trademarks of Zoho Corporation Pvt. Ltd. Google Sheets and Google Drive are trademarks of Google LLC. Arc, Circle, Slack, Telegram, Discord, Xero, QuickBooks, HubSpot, Pipedrive, Asana and npm are trademarks of their respective owners; their names show what Vestiarion is built on and connects to, not an endorsement.
الأسئلة الشائعة
ما هو Vestiarion؟
An AI treasury agent paying in USDC on Arc: read its decisions, ledger and books; add invoices.
كيف أثبّت Vestiarion؟
يعمل كخادم بعيد. في Claude Code: claude mcp add --transport http vestiarion 'https://www.vestiarion.xyz/api/mcp' --header 'Authorization: <A Vestiarion workspace API key, sent as a bearer token. Use a read-only key unless the agent must add records: the write tools need a read-and-write key. No tool can approve or pay.>'. وفي العملاء الآخرين، الصق إعداد JSON من هذه الصفحة في إعدادات MCP الخاصة بهم.
هل يحتاج Vestiarion إلى مفتاح API؟
نعم. يتطلب Authorization، وتضبطها في إعداداته.
هل Vestiarion مفتوح المصدر؟
نعم. شيفرته متاحة على GitHub بترخيص MIT.
من يصون Vestiarion؟
ينشره duongnq2798. يدرجه AI.tn لكنه لا يصونه ولا يوصي به.
من سجل MCP الرسمي. الإدراج ليس توصية: راجع شيفرة الخادم وصلاحياته قبل منحه الوصول إلى بياناتك.