Paper receipts and online invoices in one clean sales database, plus a weekly restock list. Small merchants (building supply stores, warungs, or market stalls) keep their sales in paper receipt books. That data is locked away, so nobody can see what sells, what is running out, or what to reorder. scanota reads those receipts, merges them with online orders, and tells the owner what to restock. The app works on 5 main steps: 1. Read. A vision model served with vLLM on AMD ROCm turns a receipt photo into structured JSON. 2. Validate (no LLM). sum(qty x price) == total, date and price-range checks, fuzzy matching of item names to the product master (e.g. "SMN 3R" and "semen tiga roda 50kg" become one SKU). Low-confidence receipts go to a "Needs review" screen; corrections become new aliases. 3. Merge. Online and offline transactions share one canonical schema. 4. Act. Per-SKU demand forecast, safety stock and reorder point produce a weekly restock list with reasons. 5. Ask. Chat in Indonesian is translated to read-only SQL. The LLM never answers sales numbers from memory. The forecast is calculated purely by math, by using Croston/TSB method for intermittent demand with 4-week moving average baseline. Safety stock is calculated by the formula z x sigma x sqrt(lead time), with sigma the RMSE of the last 26 weeks of one-step forecast errors and z set per product category (2.2 for goods that keep, 1.8 for cement, paint and waterproofing, which have a shelf life). scanota uses FastAPI + PostgreSQL in Docker Compose. OpenCV preprocesses receipts, MiniCPM-V-4.7-35B-A3B (optional DeepSeek-V4.1-Flash fallback) extracts data with MinerU2.5-Pro OCR hints, Qwen3.8-27B handles data queries, rapidfuzz matches items to products, and statsforecast powers restock forecasts. All models are accessed via the AMD Token Factory API.
Category tags: