Inspiration
Thirty million Americans file a Schedule C. None of them have a payroll department. Four times a year they're supposed to guess their tax bill and send it in, and the IRS collected a record $7B in penalties from people who guessed wrong.
Existing tools make you categorize everything yourself, or they put an LLM in charge of the arithmetic. We wanted neither. Our persona is Maya, a Brooklyn content creator with AdSense, Patreon, seven brand deals, a contractor she pays, and one bank account for all of it. Her Q3 estimate is due in days.
What it does
Finch works out a NYC freelancer's next quarterly estimated payments — federal 1040-ES and NYS/NYC IT-2105 — from a zip of bank exports and receipts.
Drop in the files, answer seven profile questions, and get the next payment for each authority with every dollar traced back to source rows. Uncertain labels land in a review list instead of blocking the flow; fix one transaction or every transaction at that merchant. A chat agent answers "what if I buy the camera in December?" and any change it proposes waits for your approval.
Finch never pays or files without consent. It links you to IRS Direct Pay and NYS Online Services and stops there.
How we built it
The LLM labels; deterministic code computes.
- Daytona — one persistent sandbox unzips untrusted uploads, parses CSV/XLSX, OCRs receipts (RapidOCR), and runs the tax engine. PolicyEngine-US is imported once in a long-lived interpreter, so a what-if takes ~1–2 s instead of a 25 s cold start. The image pins
policyengine-usand runs a golden self-check at build time. - Amazon Bedrock (Claude via LangChain) — regex rules categorize the obvious transactions; one batched LLM call labels the leftover merchants and tags guesses as
llm-guess. Also words the interview questions, parses answers, handles receipt vision fallback, and powers the chat agent. Every output is Pydantic-validated before it becomes a fact. - SurrealDB — typed, time-aware fact store. Corrections supersede earlier facts with a reason; nothing is overwritten, and the full history is viewable per transaction.
- Arize — OpenTelemetry/OpenInference traces for every step. The categorization eval logs one span per transaction against hand-labeled ground truth, so accuracy sits next to the traces.
- FastAPI + React/Vite/shadcn front end; safe-harbor rules taken directly from the 1040-ES and IT-2105 instructions.
Challenges we ran into
- Keeping tax math out of the model. Numbers must be exact and explainable, so the LLM decides what a transaction is and PolicyEngine decides what it costs.
- Cold starts. PolicyEngine takes 25 s to import; a persistent Daytona code-interpreter context brought what-ifs down to seconds.
- Untrusted uploads. Unzipping and OCRing user files happens inside the sandbox with no API keys present.
- Ambiguity without friction. Some labels only the taxpayer knows. Best guess + review list beat forty clarifying questions.
- NYC. State and city on one form, plus MCTMT detection.
Accomplishments that we're proud of
- End to end: upload → interview → payments → eval, driven by one script
- Engine golden case passes to the dollar on federal and NY
- 70% category accuracy and 75% deductible-amount accuracy against ground truth the agent never sees
- Every fact has a lineage; every number has a source row
What we learned
- Trust comes from traceability, not confidence scores
- Supersede-never-overwrite makes corrections cheap and auditable
- A sandbox is an architecture choice, not just a security one
What's next for Finch
- Launch to a niche of 1099 workers like content creators who want to focus on work and then expand
- Mileage tracker
- Annualized-income method and MCTMT computation
- Joint filers and more states
- Live bank connections instead of exports
- Proactive mode: Finch runs the quarter before you askat we're proud of
Built With
- arize
- bedrock
- claude
- daytona
- langchain
- shadci
- surreal
Log in or sign up for Devpost to join the conversation.