Pocket Audit: A $19 Private Expense Audit for Freelancers
Tags: #devchallenge #hf26challenge
Drop in a bank CSV. Find duplicate charges, recurring subscriptions, and fee creep โ without uploading your financial data anywhere.
Links: Repository ยท Demo video
Built: October 12โ18, 2026, for the Hacktoberfest Week 2 "Side Hustle" challenge
Stack: Python (stdlib only) ยท Qwen3-1.7B open-weight model via llama-server ยท zero third-party services
The problem
A freelancer has six months of bank transactions and no time to read them. Somewhere in there: a design tool they're paying for twice under two different merchant names, a SaaS subscription that crept from $15 to $20 a month, a recurring charge for something they stopped using months ago.
The existing fixes all ask for too much trust. Expense apps want a live bank connection or a full transaction-history upload to somebody's cloud. You're supposed to hand over the single most revealing document you own โ income, clients, software stack, travel, all of it โ just to find a forgotten $12 subscription.
I wanted the audit without the surrender.
Who would pay for it
Freelancers, consultants, creators โ anyone whose business runs through one checking account and a stack of SaaS tools. Not people who love budgeting software. People who want one question answered: where is my money leaking?
The price is $19, once. Not monthly โ the product helps you kill recurring costs, so becoming one would be a joke. The math that sells it: one forgotten $12/month subscription is $144 a year. Pocket Audit pays for itself in under two months off a single find, and the audit itself takes minutes.
What I built
Pocket Audit is a local-first web app. You choose a bank CSV from your device, confirm the column mapping, and it runs the full audit on your machine:
- Import โ the file never leaves the device. No bank login, no account, no upload.
- Normalize โ every bank format maps into one canonical transaction record (plain bank dates, signed amounts in integer minor units, ISO currency codes).
- Detect โ a deterministic rules engine finds exact duplicates, recurring charges, price creep, and service overlaps.
- Explain โ a compact open-weight model (Qwen3-1.7B, running locally through llama-server) cleans up messy merchant names and writes plain-English explanations. It never touches the math.
- Report โ a dashboard with one honest headline: potential savings from high-confidence findings only, every flag traceable to its transactions, every flag dismissible.
The whole thing runs on a 4GB phone. I know, because that's the hardware I built it against.
Demo
I seeded a year of freelancer checking activity with believable mess: ADOBE*CREATIVECLD 800-833-6687next toAdobe Inc.`, two overlapping design subscriptions, a software bill that rose mid-year, a dead tool still billing.
Pocket Audit's verdict: $184/year in potential savings โ $96 in likely duplicate subscriptions, $48 in a recurring price increase, $40 in charges flagged for review (kept out of the high-confidence headline โ the report won't spend money it can't prove). Each finding opens to the exact transactions behind it. Nothing in the headline I can't prove from the CSV.
(See the demo video linked above for the full run: import โ mapping โ findings โ report, end to end, on-device.)
How it works
The architecture has one non-negotiable principle: the model is never allowed to invent a financial finding.
Every duplicate, recurring pattern, price increase, and dollar total is computed by deterministic code from the imported CSV โ duplicate windows (ยฑ$0.01, 0โ3 days), recurring cadence bands (28โ31 day median, ยฑ5 days, 3+ occurrences), price-creep thresholds (โฅ10% or $3, confirmed twice). The local model gets a narrow, fenced job: normalize a merchant string, pick a category from a 16-item allowlist, return strict JSON. Its output is validated like hostile input โ schema, enum, string guards, a grounding check that rejects merchant names not present in the description โ and anything below 0.75 confidence goes to "Needs review."
Bank CSVs can't prove you don't use a service, so Pocket Audit never says "zombie subscription" or "cancel this." It says "recurring charge to review," with Keep / Ignore / Not recurring controls. Every correction becomes a local alias, so the product gets smarter on your device without your data going anywhere.
Multi-currency is handled without fantasy conversions: native and settled amounts stored side by side, recurrence grouped by merchant + billing currency + account, and a hard rule โ price creep means the native amount rose. If only the settled USD moved, the report says your cost moved with exchange rates. It will not accuse a merchant of raising prices when FX did it.
Why open innovation matters
This section isn't decoration. Open weights are the reason the product can exist at all.
A cloud-AI version of Pocket Audit would send merchant descriptions, dates, and amounts to a hosted inference provider on every import, recategorization, and report. That's a privacy tradeoff demanded before the product delivers value โ for financial data, that's disqualifying for most buyers.
Running a compact open-weight model locally removes the tradeoff and rewrites the unit economics. A hosted API bills per audit; at a $19 one-time price, those per-use costs eventually eat the business. Local inference has no per-audit vendor bill, so the one-time price is structurally sound instead of subsidized. The product doesn't need to become a subscription to survive โ which matters, because its entire pitch is helping you escape subscriptions.
And the model stays mine to choose: a smaller quantized build for constrained devices, swaps as local runtimes improve, no vendor pricing page that can move under me. Open innovation here isn't a badge. It's the privacy story and the business model.
What I learned from a first user
Honest answer: at publish time, the first stranger hasn't run it yet. I built and verified it against seeded data this week, and the next step is putting it in front of one Phoenix freelancer with the question "would you pay $19 for this?" โ then reporting back what they said, including the no. I'll update this section when that happens.
What I would build next
More bank format coverage, the local-alias learning loop wired into the UI (corrections already save locally), a packaged mobile build, and the optional offline FX rate pack for travelers. The detection engine is the moat; everything else is distribution.
Try it yourself
bash
git clone https://github.com/archonstratagemai-lab/pocket-audit
cd pocket-audit
python3 server.py
Top comments (0)