Case study 06 / 06 · Mobile app

Paperflow

Docpilot's mobile app. Snap a receipt or invoice, AI reads it in seconds, policy checks run on their own and approvers decide with one tap, from anywhere.

Role
Product design, mobile engineering, API
Relationship
Mobile companion to Docpilot
Stack
Expo SDK 57, React Native, TypeScript, Node 24, Claude
Status
Working build · runs in demo mode with sample data
01The problem

Receipts live in pockets, not inboxes.

Docpilot handles invoices that arrive by email. But a lot of spending happens away from a desk: a taxi to a client, a hotel bill, a delivery note signed on site. Those papers end up crumpled in a wallet, typed in by hand weeks later, or lost.

And approvals stall for the same reason. The manager who needs to sign off is in a meeting, at an airport, on site. The bill waits until they're back at a laptop.

02The system

Same rules as Docpilot. In your pocket.

The phone captures, the AI reads, and the decisions stay in code, exactly the split that makes Docpilot auditable. Claude turns the photo into structured fields with a confidence score for each one. Plain functions then check the maths, look for duplicates, flag shaky readings and apply the spend policy before anyone is asked to decide.

  1. 01HUMAN

    Capture

    Camera with a document frame, or a photo from the library.

  2. 02AI

    Read

    Claude vision fills a strict schema with per-field confidence.

  3. 03CODE

    Check

    Maths, duplicates, confidence, date window, spend limit.

  4. 04CODE

    Route

    Clean and under $75: auto-approved. Otherwise, to a person.

  5. 05HUMAN

    Approve

    Fix any field with a tap, then approve or reject.

  6. 06CODE

    Export

    Approved items flow on to accounting.

Claude call (structured output)Deterministic codeHuman decision
Two phones: one reading a document with a progress checklist, one showing line items and automated policy checks
The AI says what it read and how sure it is. Code decides what happens next.
Low-confidence fields are highlighted for a human. Edits re-run every check instantly.
03The app

Four screens, one job each.

The visual direction is "clean paper": warm off-white, one confident blue, big serif numbers and nothing else competing with the document. It should feel like a calm finance tool a company would trust, not a gadget.

Inbox screen showing $3,020 pending approval and a list of documents with status pills
InboxWhat's waiting, what's flagged, and the total at stake.
Reading screen with a document preview, a blue scan line and a progress checklist
ScanA scan line and live steps while the AI reads.
Review screen for a $2,480 Northwind Logistics invoice with extracted fields and confidence scores, tax highlighted at 74%
ReviewEvery field with its confidence. The shaky one stands out.
Insights screen with approved spend, typing time saved, auto-approvals and spend by category
InsightsSpend by category and the time the team got back.
04In numbers

Built to be shown to clients.

1Codebase for iPhone, Android and the web
5Policy checks on every document
$75Auto-approve limit for clean documents, set in code
0API keys inside the app; extraction runs on a server

Paperflow runs in demo mode by default with realistic sample documents, so anyone can try the full flow without an account. Pointing it at its server switches extraction to Claude.

05Decisions

Choices that make it trustworthy.

01

Confidence, out loud

Every field shows how sure the model was. Anything under 80% is tinted and raises a check, so people spend their attention where it's needed instead of re-reading everything.

02

Edits re-run the rules

Correct a total and the maths, duplicate and limit checks run again immediately. The approver always sees the state of the document as it is now, not as the AI first read it.

03

The key never ships

The app sends a resized photo to a small API, and only the server talks to Claude. A phone app can be unpacked; a secret inside it isn't a secret.

04

Demo mode first

A portfolio app nobody can try is a screenshot. Sample documents, a "try a sample" button and seeded data mean a visitor sees the whole flow in under a minute.

The routing rule is one line.

Policy reads like policy. A client can change the threshold without touching the AI, and every auto-approval leaves a line in the activity timeline explaining why.

const clean = checks.every((c) => c.status === 'pass');
const auto = clean && x.total < POLICY.autoApproveUnder;
// auto → 'approved' + "Auto-approved (under $75, all checks passed)"
// else → 'pending_approval' + "Routed to you for approval"
06For production

What I'd add next.