Honest answer: the UI is the easy 20%. The mint form, receipts log, and agent rows are about 2 weeks of polish. The system underneath is a real fintech stack — call it 4–9 months solo to MVP, depending on which rails you compromise on. Here's the actual shape:
Card issuing (Mastercard rail) — You don't issue cards, a partner does. Options: Lithic (best DX, US/CA, ~$500/mo + interchange), Stripe Issuing, Marqeta (enterprise). They handle PCI, BIN sponsorship, KYC/KYB. You sign a program agreement (4–8 weeks), build webhooks for auth.created / transaction.created, and implement just-in-time auth — when a swipe hits, Lithic calls your endpoint within 2s and you approve/decline based on policy. That JIT decision engine is your product. Without a partner, this rail is 18+ months and a banking license.
USDC / x402 rail — Buildable solo. Coinbase's x402 spec is ~200 lines of middleware; you hold a Base-chain hot wallet per card, sign payment intents, settle on-chain. Real work is key management (use Privy or Turnkey, ~$0–$2k/mo), gas abstraction, and reconciling on-chain settles back to your ledger. 2–3 weeks.
MPP / Solana, Natural ACH — MPP is pay.sh's spec; integration is similar to x402. ACH agentic is mostly vapor today — skip for MVP or fake it with Stripe ACH debits.
Policy engine — The interesting part. Lives in front of every rail's auth hook: vendor allowlist (merchant MCC + domain match), budget cadence buckets in Postgres or Redis, hard cap, approval threshold gate. Approval flow needs Slack app (block-kit interactive button → webhook → unblock the pending auth before Lithic times out at ~2s — this is a hard latency budget). 3–4 weeks.
Identity + audit — Agent credentials (API keys per agent_id), instance sessions (short-lived JWT or signed nonce), receipt ledger as append-only Postgres table with rail-agnostic schema. Child-card minting = scoped sub-credentials with TTL. The "lifetime audit trail" line in the UI demands this be immutable from day one.
Funding — Bank account at a sponsor bank (via your issuer), USDC treasury wallet, Stripe ACH for top-ups. Reconciliation between fiat float and on-chain balance is its own subsystem.
Compliance — KYB on every org (Persona or Middesk, ~$5–15/check), MTL exposure if you hold customer funds (avoid by routing direct), 1099-K reporting, dispute/chargeback workflows. This is the part nobody budgets for and it eats 20% of eng time forever.
Stack I'd actually build it on: Next.js (already there) + Postgres (Neon) + Inngest for the auth webhook fan-out + Lithic + Privy for wallets + Slack SDK. Skip GraphQL, skip microservices.
Fastest path to "real": pick one rail (Lithic alone), one policy primitive (budget + hard cap), one approval channel (Slack), one funding source (Stripe ACH). Ship to 5 design partners. Add USDC second once cards work. Everything else in the current UI is roadmap, not v1.
Want me to mock the JIT decision endpoint and the receipt schema so the dashboard reads from real data instead of lib/data.ts? That's the smallest real step toward functionality.