This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle. I started building StrukLokal on October 12, 2026, the first day of the challenge.
What I Built
StrukLokal is a local-first receipt capture app for freelancers and small businesses that want to turn paper receipts into expense records without sending receipt contents to a hosted OCR service.
It reads receipt images or scanned PDFs and suggests a store name, transaction date, and total. A person can review and correct those fields, approve the transaction, and export approved records to CSV.
The likely users are freelancers, sole proprietors, and small teams who currently enter receipt details by hand. I have not yet tested willingness to pay with users or made a sale, so the commercial opportunity is still a hypothesis.
Demo
There is no hosted demo or video recording yet. The app is designed to run locally:
- Clone the StrukLokal repository.
- Follow the Windows setup steps in the README and install the requirements.
- Run
python prepare_models.pywhile connected to the internet to download and initialize the OCR model. - Run
python app.pyand open http://127.0.0.1:5000.
The model cache is needed after setup. I could not initialize the cached model in my current Windows environment because access to its configuration file was denied, so I cannot provide a verified live OCR demo from this environment. The Flask upload → correction/approval → CSV route has been checked with OCR mocked; this verifies the app flow after OCR returns, not OCR inference itself.
Code
StrukLokal source code on GitHub
How I Built It
StrukLokal uses Flask for its local web interface, PaddleOCR configured for Indonesian text (PP-OCRv6), and a rules-based Python parser for the store name, date, and total.
OCR output is treated as a suggestion. Users can edit the extracted fields and must approve a transaction before it is included in the CSV. The app binds to 127.0.0.1 and keeps transaction data in process memory.
One parser regression test covers a receipt where the tax line is followed by an explicit total:
Subtotal Rp 100.000
Pajak Rp 10.000
TOTAL Rp 110.000
The explicit TOTAL label must take precedence over the Pajak label on the preceding line. Other parser tests cover mixed date formats and preserve the order of date candidates in the OCR text.
On the reviewed commit, all 14 parser unit tests passed. Ruff lint and format checks, Python syntax compilation, and repository hygiene checks passed as well. These checks do not measure OCR accuracy. I have not yet evaluated the app on a labeled set of real Indonesian receipts, so I am not claiming an accuracy percentage.
Why Does Open Innovation Matter?
Using open-source OCR makes local inference possible: the application does not need to upload receipt contents to a commercial OCR API during processing. This matters for financial documents, where users may prefer to keep transaction data on their own machines. It also lets developers inspect and adapt the parser instead of treating extraction as a black box.
There are trade-offs. The model must be downloaded during setup, the first run needs internet access, and model availability alone does not guarantee correct results. I have not yet verified a completely offline run or compared extraction quality and cost against a closed OCR API.
The next step is to test StrukLokal with consented Indonesian receipts, record expected values for each field in advance, and report both correct extractions and failures. I also want to put it in front of potential users and learn whether the workflow saves them enough time to pay for it.
Top comments (0)