This is a submission for the Hacktoberfest Open-Source AI Challenge: Week 2 — Side Hustle
What I Built
PassThrough helps freelance photographers and videographers turn shoot expenses into invoice-ready lines.
Parking, travel, props, and rush prints are easy to forget when the job is over. Upload a receipt, attach it to a shoot and client, review the extracted fields, then approve the costs that are billable. Only approved, billable expenses appear in the CSV export.
The model suggests the merchant, date, total, currency, and a short expense description. It does not approve anything or send an invoice. The freelancer checks the source receipt and corrects the fields first.
The person I built this for is a working photographer or videographer who regularly fronts small production costs. Recovering even a few missed expenses could justify paying for a small tool like this. I have not tested that willingness to pay with a customer yet; that is the next thing I need to validate.
Demo
The public demo is deployed with Backboard configured. Use sample receipts only: the Render free service can lose stored data after a restart or deploy, and this version is not for sensitive client documents.
Code
How I Built It
The app uses Python, FastAPI, SQLite, and a small HTML/CSS/JavaScript interface. Backboard sends receipt images and scanned PDF pages to the configured open-weight Qwen3.5 9B model through OpenRouter. Searchable PDF text is extracted locally, then sent for model processing.
After extraction, ordinary code validates the date, currency, and positive amount. The user reviews each field and decides whether it is billable. The CSV contains only approved billable lines.
flowchart LR
A[Receipt photo or PDF] --> B[PassThrough web app]
B -->|Image or scanned page| C[Backboard]
B -->|Searchable PDF text| C
C --> D[Qwen3.5 9B via OpenRouter]
D --> E[Suggested receipt fields]
E --> F[Human review and code validation]
F --> G[Workspace expense list]
F --> H[Approved invoice-line CSV]
Each browser profile gets a separate workspace using a private cookie, and database queries scope receipts to that workspace. This is not account authentication: people sharing one browser profile share its workspace. On local runs, receipt files and records stay in the local data directory. On the hosted demo, they are stored by the Render service and may be ephemeral.
Why Does Open Innovation Matter?
I chose an open-weight model because receipt extraction is a narrow job where I want to be able to change the model without rebuilding the whole product around one proprietary model API. Backboard gives this web demo a hosted way to run the configured model, while leaving the model choice visible and replaceable.
There is a real tradeoff: this is not local inference. Receipt images and scanned pages go to Backboard, and searchable PDF text is sent there too. Hosted inference is easier to demo than asking every freelancer to install a vision model, but it adds provider cost and means the public version is not suitable for confidential receipts. A local inference option would be a separate piece of work, not a feature I’m claiming today.
Prize Categories
- Best Use of Backboard
- Best Use of Render

Top comments (1)
The approved-and-billable export boundary is useful. I'd test what happens after approval: approve a parking receipt for shoot A/client A, then change its amount, currency or shoot assignment. Does that edit clear approval before the next CSV, or can a reviewed line silently become an unreviewed charge to another client? A fixture with an already-downloaded CSV would also help: keep an expense ID and revision in the export so the freelancer can see that the old line is stale rather than accidentally billing both versions.