Process receipt or invoice images into structured expenses and log them to Google Sheets. Use when the user wants to scan, log, track, or record an expense from a receipt or invoice image, or when they provide a local file path to a receipt/invoice image. OCR uses OpenAI by default; set CLAWSHIER_VISION_PROVIDER=ollama to use local Ollama instead.
Process a receipt or invoice image through a four-step pipeline, then reply with a short summary of what was added.
--date YYYY-MM-DD.Run the safe pipeline runner. If it fails, retry it up to 2 times before surfacing the error.
Run:
node {baseDir}/scripts/run_pipeline.js --image <path_to_image>
If the user explicitly provided a date, always pass it in ISO format:
node {baseDir}/scripts/run_pipeline.js --image <path_to_image> --date 2026-03-25
This runner performs OCR → structure → validate/deduplicate → store internally using JSON files, not shell-interpolated pipeline strings.
It writes to:
MM-YY)Invoice Archive BreakdownSummaryIt also removes the default Sheet1 tab if present.
The individual handlers still support stdin/stdout for testing, but when automating the skill, prefer scripts/run_pipeline.js or the handlers' --input-file/--output-file options instead of embedding untrusted receipt/LLM output into shell commands.
If OCR reports that the image is not a receipt or invoice, tell the user:
I couldn't detect a receipt or invoice in that image. Could you try again with a clearer photo?
If the validator reports a duplicate, stop and tell the user:
This receipt appears to already be logged (vendor, date, total match an existing entry). Skipping.
After a successful run, reply in this format:
Added expense: {vendor} — {total} {currency} on {date} ({category}). Row #{row} in your spreadsheet (tab {MM-YY}).
If the user explicitly asks for tracing/debugging/cost tracing, append a compact per-step trace summary using the last recorded trace file. Otherwise keep the normal success reply short.
If a step still fails after retries, say which step failed and include the error message.
{baseDir} exactly so the commands do not depend on the current working directory.--date YYYY-MM-DD instead of relying on same-day date inference.CLAWSHIER_VISION_PROVIDER=openai|ollama|auto (default: openai).auto tries local Ollama first and falls back to OpenAI. Set to ollama to force local-only OCR.CLAWSHIER_OLLAMA_MODEL, CLAWSHIER_OLLAMA_HOST, and CLAWSHIER_OLLAMA_MAX_DIMENSION to control the Ollama OCR backend.CLAWSHIER_TEST_MODE=1 is present in the environment, the handlers use local test fixtures and a local mock sheet store. Use that for safe smoke tests before touching real APIs.CLAWSHIER_TRACE=1 to record per-step timing/usage metadata to .clawshier-last-trace.json. Show that trace in chat only when the user explicitly asks for tracing/debugging/cost tracing.