keys-Auto Receipts Studio (iPhone / may add Autonomous Lamp Skill)
v1.0 alpha
iPhone (or desktop) photo → local Gemma 4 12B-it vision extract → SQLite. Optional Autonomous OS Lamp skill (camera on the robot, 12B on the GPU box — the Lamp’s 6 GB cannot hold 12B).
Gemma 4 12B-it never runs on the Lamp (6 GB) and typically not on a Windows/Mac laptop. The GPU box is the brain. PC / Mac / Linux run the inbox + Review UI. iPhone is a Safari capture client on the same Wi‑Fi.
Pathway
One-shot recipe
Gemma 4 12B
iPhone page
A. Linux NVIDIA GPU box (Spark / Omen)
bash oneshot.sh
started here (:8080, util 0.15, FP8, never above 0.85)
Desktop icon after first UI start: Linux/macOS bash scripts/install-launcher.sh · Windows scripts\install-launcher.bat. Step-by-step for each letter is below.
Screenshots (v1.0 alpha)
iPhone Safari — take a photo, then completion notice:
iPhone: Take photo / Choose file
iPhone: upload in progress
iPhone: Completed Whole Foods Market groceries #5
Desktop Review queue (click a row to edit kind / category / vendor / date / total, or Delete):
Review queue
Inbox drop zone, catalog SKUs, and backend health:
Inbox
Catalog
Settings backends
Promo (v1.0 alpha)
~50s story cut — messy dorm → iPhone (lay the receipt flat, then photograph) → charcoal Autonomous Lamp scans the last receipt → trash → clean room. Bed: Beethoven Symphony No. 5, I. Allegro con brio (public-domain recording).
Idempotent. Installs .venv, fetches google/gemma-4-12B-it to ~/models-gemma4-12b-it if missing (hf auth login once), starts scripts/serve-gemma.sh if :8080 is down, starts the UI on 0.0.0.0:7860.
If vllm is not on PATH and nothing answers on :8080, oneshot skips weights and vLLM (it does not die) and still starts the UI. Then set .env at the GPU box from pathway A:
Double-click Desktop → Receipt Studio.command (first time: right-click → Open). Same as ./scripts/start-ui.sh.
E. iPhone (Safari)
Works against whichever machine runs the UI (A, B, C, or D), same Wi‑Fi. Chrome/Firefox on iOS are not the supported path.
Open http://<ui-machine-lan-ip>:7860/phone
Take photo (camera) or Choose file (Photos / Files, including HEIC)
Wait for Completed: vendor · total · category · #id
Confirm / edit / delete on the desktop Review tab
The phone page POSTs /api/inbox and polls /api/jobs/{id}. The GPU box (or the UI machine talking to Gemma) does extract + embed. Inbox drop and Syncthing into inbox/ use the same pipeline (files idle 30s unless the phone API processes immediately).
Say “scan this receipt”. scripts/scan.py snapshots HAL (:5001/camera/snapshot, 1280 px), then POSTs to Receipt Studio /api/inbox on the GPU box. Fallback: RECEIPT_LLM_BASE_URL=http://<spark-lan-ip>:8080/v1 (direct vLLM) or RECEIPT_HERMES_BASE_URL (same OpenAI-compat URL Hermes registered). On the GPU box, python scripts/register-hermes-gemma.py adds custom_providersgemma4-12b-it.
Intern has no camera; this skill will not install there.
To ship in a fork of autonomous-os: copy skills/keys-receipt-scanner/ into skills/, run python skills/skill-creator/scripts/quick_validate.py, make skills-catalog, open the PR.
Does Gemma 4 12B Unified fit on the Lamp?
No. Lamp is 8-core ARM64 with 6 GB RAM. Gemma 4 12B Unified is a 12B dense omni model (Gemma4UnifiedForConditionalGeneration, hidden size 3840).
Piece
Lamp (6 GB)
GPU box
skills/keys-receipt-scanner/
yes
yes
HAL snapshot
yes
n/a
SQLite + HTTP client
yes
yes
Gemma 4 12B Unified weights
no
yes (vLLM util 0.15)
Gemma 4 12B Unified (omni) on the GPU box
One OpenAI-compat server: vision POST /v1/chat/completionsandPOST /v1/embeddings (dim 3840). Do not raise util above 0.85.
Context at util 0.15 (after ~12.5 GB FP8 weights):
Estimate
Tokens
Conservative (48 layers full attn)
~12k
Hybrid (8 full + 40× sliding-1024)
~65k
Model native window
262,144 (not at 0.15)
A receipt scan uses ~1–2k tokens. Raise RECEIPT_VLLM_MAX_MODEL_LEN only after the boot log shows a large enough GPU KV cache size.
If /v1/embeddings 404s, either serve a pooling convert on another port (RECEIPT_EMBED_BASE_URL) or RECEIPT_EMBED_BACKEND=nvidia + Nemotron-3-Embed-1B at dim 2048. Never mix 3840 and 2048 in one DB.
Fallback vision (not omni embed): Qwen3.8-27B ADay777 at :8078 (RECEIPT_LLM_BACKEND=nvidia, RECEIPT_LLM_MODEL=qwen38-nvfp4). Lightning is text-only — never send images.
Manual UI (any OS, after venv)
bash
1python3 -m venv .venv &&source .venv/bin/activate # Windows: .venv\Scripts\activate2pip install -e ".[dev]"3cp .env.example .env
4# set RECEIPT_LLM_* like pathway B unless Gemma is local5RECEIPT_UI_SHARE_LAN=true python -m app.cli ui