ai-startup-skills
AI 제품을 만드는 스타트업을 위한 7단계 에이전트 스킬: 검증 → 비즈플랜 → 정책 → 로드쇼 → 고객 확보 → 가격 책정 → 등록
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Receipts and invoices to a spreadsheet, read by an AI model on your own computer
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Receipts and invoices to a spreadsheet, read by an AI model on your own computer. Photos and PDFs go in; a CSV with the date, shop, category, tax and total comes out. Nothing is uploaded anywhere, and nothing costs money per receipt.
$ receipt-reader scan ~/Receipts -o receipts.csv
[1/3] IMG_2041.jpg: Maple Corner Grocery 17.26 CAD OK
[2/3] IMG_2042.jpg: Blue Kettle Diner 48.10 CAD OK
[3/3] invoice-118.pdf: Papeterie Lefevre 23.40 EUR CHECK: items add up to 21.40, not the total 23.40
3 receipts in receipts.csv; 1 marked CHECK (see the problems column)
A KnowReva open-source project. The guide Build a receipt reader with a local AI model explains every part of the code step by step.
The model reads each receipt into a fixed set of fields (Ollama's structured outputs), and then
code checks the arithmetic: the line items must add up to the subtotal, and subtotal + tax +
tip must equal the total. VAT and GST already included in the prices also count. When a receipt
doesn't add up, the model gets one more look, told exactly what was wrong. If it still doesn't
add up, the row is marked CHECK with the reason, so a misread number never slips quietly into
your spreadsheet.
You can measure the accuracy yourself on your own computer (see Measure it).
You need Ollama and Python 3.10 or newer.
ollama pull qwen2.5vl:7b # the model that reads the receipts (6 GB download, Ollama 0.7.0+)
pip install git+https://github.com/knowreva/receipt-reader
On a smaller computer (8 GB of memory), qwen2.5vl:3b (3.2 GB) is faster but less accurate. Use
it with --model qwen2.5vl:3b.
receipt-reader scan photo.jpg invoice.pdf # files
receipt-reader scan ~/Receipts -o receipts.csv # a whole folder (and its subfolders)
receipt-reader scan ~/Receipts --items items.csv # also every line item, one per row
receipt-reader scan ~/Receipts --json all.json # everything, for your own scripts
receipt-reader scan ~/Receipts --currency CAD # your usual currency, for receipts that only print "$"
# (clues on the receipt itself, like "Ottawa ON" or
# "GST/HST", "ABN", "MwSt", decide it when they are clear)
| Column | |
|---|---|
status | ok: the numbers add up. check: look at this one (the problems column says why) |
date | YYYY-MM-DD |
vendor, category | category is one of groceries, restaurant, fuel, travel, office, utilities, health, other |
currency, subtotal, tax, tip, total | tax is all tax lines added together |
payment_method | as printed (card, cash...) |
notes | anything code corrected by itself, e.g. a store's tax registration number the model read as a tax |
Photos: JPG, PNG, WEBP, TIFF, HEIC. PDFs: invoices with real text are read as text (fast and exact); scanned PDFs are read page by page as images (up to 3 pages). PDFs from phone scanner apps (Adobe Scan, Microsoft Lens...) carry text the app guessed from the photo, with mistakes, so they are read as images too, with that text as a hint. iPhone photos (HEIC) are read as they are.
Settings: --model (or RECEIPT_MODEL), --url (or OLLAMA_URL, default
http://localhost:11434), RECEIPT_CONTEXT (the model's context window in tokens; not sent unless
set, because a size different from the server's makes Ollama reload the whole model, and again for
any other program sharing it. Set 8192 only if your Ollama runs with its default of 4096 and long
receipts get cut off).
An answer that isn't complete JSON (cut off, or broken) gets the same one second look as a receipt that doesn't add up.
--fast)Reading a photo with a vision model takes a minute or two on a computer without a graphics card. Text
recognition (Tesseract) reads a receipt's text in under a second. With --fast, Tesseract reads first
and the model only turns that text into fields, which is much quicker, even more so with a small text
model. The arithmetic check still decides: a receipt whose text reading doesn't add up is read from the
picture as usual.
sudo apt install tesseract-ocr # macOS: brew install tesseract
pip install pytesseract # or: pip install "receipt-reader[fast] @ git+https://github.com/knowreva/receipt-reader"
receipt-reader scan ~/Receipts --fast
receipt-reader scan ~/Receipts --fast --text-model qwen3:4b # a small text model for the text
receipt-reader eval samples/ --fast # how many were read from the text alone, how accurately, how fast
Tesseract is run with --psm 6 (the page as one block of text): with its default layout it left out
the column of prices on every practice receipt; with 6 it read every total.
Run eval with and without --fast on the same receipts before you rely on it: the arithmetic catches
misread numbers, but not a misread shop name or date.
Reading receipts takes the processor and several GB of memory for as long as it runs. If the same Ollama also serves other scheduled jobs (on a Dhoon computer: the knowledge base, a newsroom), run receipt-reader when they are idle, or let it take its turn in Dhoon's queue, which those jobs use:
flock ~/dhoon/runtime/heavy.lock receipt-reader eval samples/ --fast # waits for the running job
While it runs, the other jobs wait for it. Afterwards, ollama ps shows what is still in memory, and
ollama stop qwen2.5vl:7b frees a model you no longer need. RECEIPT_KEEP_ALIVE=5m makes Ollama
unload receipt-reader's models five minutes after the last receipt (best for a model only it uses).
Fix a shop name or a category in the spreadsheet, save it, and tell the tool:
receipt-reader scan ~/Receipts -o receipts.csv
# ...fix "WAL-MART #1007" to "Walmart", "other" to "groceries", save...
receipt-reader learn receipts.csv
From then on, that shop gets your name and your category. Once you have corrected about 15
categories, a small word-counting model (naive Bayes) also suggests categories for shops it hasn't
seen, changing the model's guess only when it is at least 80% sure. Every change is in the notes
column. The memory is one file on your computer (~/.receipt-reader/memory.json, or RECEIPT_MEMORY).
receipt-reader samples samples/ # 30 practice receipts with their correct answers
receipt-reader eval samples/ # how many it reads right, and how many mistakes the check caught
receipt-reader eval samples/ --details why.json # also save each wrong reading next to the right answer
The practice receipts are drawn by code: fictional shops in Canada, the USA, Europe, India and
Australia, with each region's taxes and date formats, a slight tilt, blur and JPEG noise. They are
easier than crumpled real receipts. To test on your own, put a photo next to a <same name>.json
with the correct answer (same fields as the practice ones) and run eval on that folder.
On an Intel NUC with no graphics card, with gemma4:26b, 30 practice receipts (October 2026):
| Field | Right |
|---|---|
| date | 30/30 |
| total | 30/30 |
| tax | 30/30 |
| shop | 30/30 |
| currency | 28/30 |
The two currency misses were Australian practice receipts that printed only "$" and "GST incl.",
with no city or ABN to tell Australia from Canada or New Zealand. Practice receipts now carry those,
as real ones do. The arithmetic check can't catch a wrong currency, so use --currency for your own
receipts. Time: about 100 seconds a receipt. With the model's "thinking" left on, it was 216.
With --fast (Tesseract first, --text-model qwen3:4b-instruct-2507-q4_K_M for the text, gemma4:26b
for the pictures; version 0.3.5, same NUC, same 30 practice receipts):
| Field | Right |
|---|---|
| date | 30/30 |
| total | 30/30 |
| tax | 29/30 |
| currency | 30/30 |
| shop | 30/30 |
29/30 all five right; the one miss (an Australian receipt whose "GST incl." line the model didn't read)
was marked CHECK, and no correct receipt was flagged. 22 were read from the text alone. Time: 64
seconds a receipt on average, about 52 without that one receipt, which took a picture reading and a
second look. Getting there took three runs with eval --details: each showed a kind of mistake
(currency on "$" receipts, the order of dates, tax shown as included), and each became a rule in code
with its readings kept as a test. The default qwen2.5vl:7b is the weak link for accuracy here (21/30
without --fast): with Dhoon's gemma4:26b installed, use it.
Rules tuned on one set of receipts can just fit that set, so the same settings were then run on 30 freshly drawn practice receipts it had never seen: 30/30, every field right, no false alarms, 24 read from the text alone, 65 seconds a receipt. Practice receipts are still tidier than real ones: the next test is your own (see Measure it).
On a real receipt (a crumpled Walmart grocery receipt from Kitchener, Ontario), testing found five mistakes the practice set never showed. All five are now handled:
notes column;notes.The final reading of that receipt was right in every field.
| File | Job |
|---|---|
schema.py | the fields asked for, and the prompt |
model.py | one request to Ollama's /api/chat with the image and the JSON schema |
files.py | photos made upright and smaller; PDF text, or PDF pages as images |
checks.py | the arithmetic check |
reader.py | read, check, one second look |
output.py | CSV and JSON |
evaluate.py, samples.py | accuracy on receipts with known answers |
memory.py | your corrections: shop names, categories, a small naive Bayes model |
pip install -e ".[test]" && pytest # the tests use a stand-in model: no Ollama needed
CHECK.MIT. Use it, change it, sell what you build with it.