Ask CentProof.
~5 min read · The local-AI feature, explained
What "local" actually means
When you click Ask CentProof and type a question, here is EXACTLY what happens:
- The question goes to a local
llama-serverprocess running on127.0.0.1(your loopback interface — packets never leave your Mac). - The server runs Qwen 2.5 3B Instruct, a 3-billion- parameter open-source language model. The model file is ~1.9 GB and lives in your CentProof app data directory.
- The model translates your question into a structured query (date range, category filter, entity filter, etc.) against your local SQLite database.
- CentProof executes that query — read-only, no writes — and returns the matching rows.
- The model writes a one-paragraph natural-language answer summarizing the results.
- You see the answer at the top of the screen with the source rows in a table below.
Steps 1-5 all happen on your Mac. Network traffic during an Ask CentProof call: zero. You can verify this with Little Snitch or by inspecting the process tree.
What the AI sees vs. what it doesn't
The model sees the SQL-style query results — the actual transaction rows that match your filter. So if you ask "how much did I spend at Whole Foods?", the model sees the rows tagged with Whole Foods as their entity along with their dates and amounts.
The model does NOT see:
- Transactions outside your query's filter — if you're asking about Q3, the model never sees Q1.
- Account numbers, holder names, or other PII.
- Source PDFs themselves.
- Anything from your other apps, Keychain, browser history, etc.
The model can't mutate your data. The query layer CentProof passes its output through is read-only. The model can't accidentally delete a transaction or change a category by suggesting weird SQL.
Questions that work well
Some examples that translate cleanly to queries:
- "How much did I spend on groceries last quarter?" — filters by Groceries category, quarter, sums.
- "What did I pay to State Farm in 2025?" — filters by State Farm entity, year, sums.
- "Show me transactions over $500 last month." — filters by amount + date.
- "How much did Client Acme cost me this year?" — filters by client entity, year, sums (assumes you tagged client-related expenses).
- "What was my biggest expense in November?" — filters by month, sorts by amount descending, returns top row.
- "Find the AT&T payment from last September." — filters by entity + month.
The model is a 3B parameter model — small by modern standards. It works well for queries with a clear filter + aggregation but can stumble on multi-step reasoning (e.g. "compare my Q3 spending to Q2 and tell me why"). For complex analysis, the answer might be partial — but you still get the source rows underneath and can re-ask more specifically.
Source rows — "show your work"
Every Ask CentProof answer is backed by the actual rows from your database that informed it. The rows appear in a table directly below the answer text, with date, description, entity, category, amount, and source statement.
This matters because:
- You can verify the answer against your data without trusting the model.
- If the answer feels wrong, you can scan the rows and spot why (e.g. "oh, I forgot I have one row mis-tagged that's skewing the total").
- Click any row to jump to the original PDF page with the transaction line highlighted — full audit trail.
CentProof is built around the principle that any number you see should be traceable to its source. Ask CentProof answers are no exception.
AI suggestions during import
Ask CentProof is the same local AI that runs suggestion generation in the background after each statement import. On commit, CentProof asks the model to propose an entity and category for any new transaction that wasn't already auto-tagged by a correction rule or the curated merchant dictionary.
Suggestions appear as ghost badges (visually distinct from confirmed tags). You accept or reject each one as you scroll through transactions. Accepting a suggestion optionally creates a correction rule for future imports via the same dialog flow described in Tagging entities and categories.
Free tier limits on Ask CentProof
Free Test Mode caps Ask CentProof at 5 questions lifetime and then 1 per day after that — enough to evaluate whether the AI is useful for your data before deciding to upgrade. Pro Lifetime ($49 one-time) and Pro Monthly ($5/mo) both unlock unlimited questions.
Because the model runs locally, there's no per-query cost to us — the caps exist only as a free-tier limit, not as a backend throttle. After upgrading to Pro, you can ask as many questions as you want without affecting anyone's bill.
Disabling AI entirely
If you don't want any AI involvement — even local — you can turn off both the suggestion pass and Ask CentProof in Preferences:
- Open Preferences (
⌘ ,) → AI tab. - Uncheck "Enable AI suggestions on import" to skip the background suggestion pass.
- Uncheck "Enable Ask CentProof" to hide the feature from the sidebar entirely.
With both off, no AI ever runs in CentProof. Imports still work via the verified parsers, correction rules still auto-apply, and the curated merchant dictionary still suggests entities/categories on import (the dictionary is pure regex, no AI). You just lose the long-tail suggestions and natural-language querying.
Optional: pointing at an external LLM endpoint
If you want a smarter model and are willing to send your query + the matching transaction rows to an external service, Preferences → AI lets you configure a custom OpenAI-compatible endpoint. You provide the URL and optional API key.
Recommended only for advanced users who know what they're trading off. CentProof does NOT default to this — the local model is the default. The external option exists because some users want it; it's not promoted in the UI as the "better" choice.
Next: turn your data into reports + exports
Saved reports, settlement reports, and which export format works for which downstream tool.