Open an account
A Safe that belongs to you, with the Tillwarden module switched on. One transaction. Your owner keys stay yours, and nobody else can move the money.
Your AI agent gets an allowance. The Warden enforces the rules. The money stays in your own Safe, every payment is checked before it is signed, and every dollar leaves a receipt.
A Safe that belongs to you, with the Tillwarden module switched on. One transaction. Your owner keys stay yours, and nobody else can move the money.
A daily and weekly budget, a cap per payment, who it may pay, which hours, and an amount above which you approve by hand. The rules live on chain, so the agent cannot talk its way past them.
The agent gets its own small key. It can ask to pay inside the rules. It cannot change them, add owners, or take the Safe. Lose the key, remove it in one click.
Money out and money in both print a receipt: signed, chained to the one before it, and exportable as CSV for your books.
Each one works on its own. Together they make a runaway agent boring.
Budgets, caps, payees, hours and approvals sit in the Safe module. A signed payment that breaks them reverts. No server can override that, including ours.
Each request is simulated and checked first: payee, amount against balance, unknown contracts, risky approvals, and hidden instructions in what the agent just read.
It learns what normal looks like for each account. A sudden spike, a burst of payments or a rush to a new payee freezes the account. Only an owner can unfreeze it.
Only things you can use right now are listed here. The rest sits on the roadmap strip below, marked as next.
The SDK signs payment intents locally with the agent key. The key never leaves the agent. The same calls exist as a CLI and as MCP tools.
import { Tillwarden } from 'tillwarden';
const tw = new Tillwarden({
baseUrl: 'https://tillwarden.fun',
apiKey: process.env.TILLWARDEN_API_KEY,
agentKey: process.env.TILLWARDEN_AGENT_KEY,
});
// checked, co-signed, submitted, receipted
const res = await tw.pay({ to, amount: '0.25', token: 'USDG', memo: 'search api' });
// res.status: 'paid' | 'pending_approval' | 'blocked'
# ask the firewall first, no wallet needed
npx tillwarden check --to 0x… --amount 12 --token USDG
# pay from the agent's account
npx tillwarden pay --to 0x… --amount 12 --token USDG --memo "data export"
npx tillwarden me
npx tillwarden receipts
npx tillwarden keygen
// claude_desktop_config.json, or any MCP client
{
"mcpServers": {
"tillwarden": {
"command": "npx",
"args": ["-y", "-p", "tillwarden", "tillwarden-mcp"],
"env": { "TILLWARDEN_API_KEY": "…", "TILLWARDEN_AGENT_KEY": "…" }
}
}
}
// tools: tillwarden_pay · tillwarden_check · tillwarden_balance
// tillwarden_rules · tillwarden_receipts
Counted by the engine's indexer from on-chain events. Zero is a real number too.
Waiting for the engine.
Each agent payment through Tillwarden pays a 0.1% fee into the TillJar contract. Anyone can tip the jar over: it buys $TILL and burns it. The jar has no owner and no withdraw.
No promise of returns. Creator tax 2%. No team wallets printed here.
Open an account, set the rules, hand over one key. Keep the receipts.