Not in the top 1,000 by GitHub stars
googlarz/finance-assistant
Personal finance copilot — real math, not AI guesses. 6 locales · 13 bank formats · Monte Carlo FIRE. claude.ai · Claude Code · Cowork. Open source, free.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
3583c5d3c7e2 → 35644ae95d07
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → 3583c5d3c7e2
No earlier version was observed for comparison.
Verified commit 35644ae95d073e9d0a67baa7c3b6fa0d80a4d26e
git clone --filter=blob:none --no-checkout https://github.com/googlarz/finance-assistant.git .hotskills/googlarz-finance-assistant && git -C .hotskills/googlarz-finance-assistant checkout --detach 35644ae95d073e9d0a67baa7c3b6fa0d80a4d26e
# Copy each selected skill directory from .hotskills/googlarz-finance-assistant into .claude/skills/<skill-name>/Heat
2.8- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
finance-assistant
When your agent uses it
Personal finance assistant for budgeting, savings goals, investment tracking, debt optimization, tax preparation, insurance review, net worth tracking, and financial scenario modeling. Supports multi-currency, bank statement import (CSV/MT940/OFX), and locale-based tax rules. Use for any personal finance question: budget planning, expense tracking, portfolio allocation, FIRE calculations, debt payoff strategies, mortgage comparisons, tax deductions, insurance coverage, retirement planning, and life events with financial impact such as marriage, buying a house, changing jobs, having a baby, or going freelance.
What it loads into context
Frontmatter
193 tokensAlways available to the agent
SKILL.md
10,933 tokensWhen the skill is activated
Reference documents
68,293 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Mission and Boundaries
- 2. Voice and Tone — this is the most important section
- 3. Non-Negotiable Rules
- 3a. Evidence and Data Policy
- 4. Start of Session
- 4a. Scheduled Tasks
- 4b. The "hi" check-in
- 5. Core Turn Loop
- 6. Mode Router
- MCP Server (read-only)
- CLI Usage
- 7. Tool Contract
- Visualizations
Scripts executed separately
install.shscripts/account_manager.pyscripts/accountability_engine.pyscripts/adviser_handoff.pyscripts/alert_telemetry.pyscripts/amount_parse.pyscripts/annual_summary.pyscripts/audit_log.pyscripts/backup.pyscripts/bank_sync.pyscripts/benchmarks.pyscripts/broker_importer.pyscripts/budget_engine.pyscripts/capital_gains.pyscripts/cashflow_forecast.pyscripts/category_learner.pyscripts/chart_builder.pyscripts/comparison_engine.pyscripts/cowork_tasks.pyscripts/csv_importer.pyscripts/currency.pyscripts/data_coach.pyscripts/data_safety.pyscripts/db.pyscripts/db_migrate.pyscripts/debt_optimizer.pyscripts/demo_data.pyscripts/doctor.pyscripts/document_sorter.pyscripts/finance_storage.pyscripts/financial_journal.pyscripts/financial_monitor.pyscripts/generate_report.pyscripts/goal_tracker.pyscripts/hooks/auto_ingest.pyscripts/household.pyscripts/import_router.pyscripts/inbox_scanner.pyscripts/insight_engine.pyscripts/insurance_analyzer.pyscripts/investment_returns.pyscripts/investment_tracker.pyscripts/life_events.pyscripts/llm_import.pyscripts/locale_loader.pyscripts/locale_registry.pyscripts/locale_telemetry.pyscripts/mcp_server.pyscripts/monte_carlo.pyscripts/mt940_importer.pyscripts/net_worth_engine.pyscripts/ofx_importer.pyscripts/onboarding.pyscripts/output_builder.pyscripts/overdraft_detector.pyscripts/pdf_importer.pyscripts/price_sync.pyscripts/profile_manager.pyscripts/receipt_scanner.pyscripts/reconciliation.pyscripts/recurring_engine.pyscripts/report_renderer.pyscripts/scaffold_locale.pyscripts/scenario_engine.pyscripts/scenario_store.pyscripts/session_alerts.pyscripts/session_hygiene.pyscripts/session_memory.pyscripts/snapshot_scheduler.pyscripts/sovereignty_check.pyscripts/subscription_actions.pyscripts/subscription_detector.pyscripts/tax_brief.pyscripts/tax_engine.pyscripts/tax_optimizer.pyscripts/tax_scenarios.pyscripts/threshold_alerts.pyscripts/timeline_engine.pyscripts/transaction_logger.pyscripts/transaction_normalizer.pyscripts/transfer_matcher.pyscripts/validate_locale.pyscripts/viz.pyscripts/weekly_digest.pyscripts/whatif_engine.pyscripts/workspace_builder.pyskill.pytests/__init__.pytests/conftest.pytests/test_account_manager.pytests/test_accountability_engine.pytests/test_annual_summary.pytests/test_audit_log.pytests/test_backup.pytests/test_bank_sync.pytests/test_benchmarks.pytests/test_budget_engine.pytests/test_call_signatures.pytests/test_cashflow_forecast.pytests/test_chart_builder.pytests/test_comparison_engine.pytests/test_currency.pytests/test_data_coach.pytests/test_data_safety.pytests/test_db.pytests/test_debt_optimizer.pytests/test_demo_data.pytests/test_doctor.pytests/test_finance_storage.pytests/test_financial_journal.pytests/test_goal_tracker.pytests/test_health_nudge.pytests/test_household.pytests/test_import_system.pytests/test_importers.pytests/test_insight_engine.pytests/test_insurance_analyzer.pytests/test_investment_tracker.pytests/test_issues_9_10_11.pytests/test_journeys.pytests/test_life_events.pytests/test_llm_import.pytests/test_locale_de.pytests/test_locale_telemetry.pytests/test_mcp_server.pytests/test_monitor_cap.pytests/test_monte_carlo.pytests/test_net_worth_engine.pytests/test_onboarding.pytests/test_overdraft_detector.pytests/test_price_sync.pytests/test_profile_manager.pytests/test_receipt_scanner.pytests/test_recurring_engine.pytests/test_scenario_engine.pytests/test_scenario_store.pytests/test_session_alerts.pytests/test_session_memory.pytests/test_sovereignty_check.pytests/test_subscription_actions.pytests/test_subscription_detector.pytests/test_tax_brief.pytests/test_tax_engine.pytests/test_tax_optimizer.pytests/test_tax_properties.pytests/test_tax_scenarios.pytests/test_threshold_alerts.pytests/test_timeline_engine.pytests/test_transaction_logger.pytests/test_transfer_matcher.pytests/test_v410_all_accounts.pytests/test_v410_hygiene.pytests/test_v410_investments.pytests/test_viz.pytests/test_voice_lint.pytests/test_whatif_engine.pytests/test_workspace_builder.py
Files
.claude/settings.jsonasset259 bytes.github/ISSUE_TEMPLATE/bug_report.mddoc360 bytes.github/ISSUE_TEMPLATE/feature_request.mddoc336 bytes.github/ISSUE_TEMPLATE/new_locale.mddoc346 bytes.github/SECURITY.mddoc1,628 bytes.github/pull_request_template.mddoc377 bytes.github/workflows/ci.ymlasset1,216 bytes.github/workflows/pages.ymlasset599 bytes.github/workflows/validate-locale.ymlasset1,541 bytes.gitignoreasset102 bytes.gitmodulesasset103 bytesCHANGELOG.mddoc47,330 bytesCONTRIBUTING.mddoc5,191 bytesLICENSEasset911 bytesREADME.mddoc15,604 bytesSKILL.mdcore47,464 bytesSKILL.mdcore47,464 bytesSKILL.mdcore47,464 bytesTASKS.mddoc2,510 bytesassets/dashboard-preview.jpgasset928,753 bytesassets/demo.svgasset3,970 bytesassets/finance_dashboard_template.htmlasset108,726 bytesassets/folder_structure_template.mddoc5,676 bytesassets/steuerberater_handoff.mddoc11,030 bytesassets/tax_dashboard_template.htmlasset3,816 bytesdocs/ARCHITECTURE.mddoc21,390 bytesdocs/MCP.mddoc3,098 bytesdocs/SECURITY.mddoc8,675 bytesdocs/index.htmlasset23,338 bytesdocs/launch/CHECKLIST.mddoc3,972 bytesdocs/launch/README.mddoc1,081 bytesdocs/launch/awesome-claude-code-entry.mddoc1,225 bytesdocs/launch/demo-transcript.mddoc2,982 bytesdocs/launch/hn-show.mddoc3,154 bytesdocs/launch/linkedin.mddoc1,306 bytesdocs/launch/plugin-listing.mddoc2,362 bytesdocs/launch/product-hunt.mddoc2,035 bytesdocs/launch/reddit-claudeai.mddoc1,738 bytesdocs/launch/reddit.mddoc3,703 bytesdocs/launch/show-hn.mddoc2,769 bytesdocs/launch/x-thread.mddoc1,367 bytesdocs/sovereignty.mddoc3,833 bytesinstall.shruns1,315 bytesprojects-template/PROJECT_INSTRUCTIONS.mddoc3,394 bytesprojects-template/README.mddoc1,936 bytespyproject.tomlasset828 bytesreferences/budgeting-strategies.mddoc1,330 bytesreferences/debt-strategies.mddoc1,503 bytesreferences/deduction-rules.mddoc16,606 bytesreferences/elster-guide.mddoc11,863 bytesreferences/expat-guide.mddoc9,585 bytesreferences/financial-blind-spots.mddoc9,990 bytesreferences/fire-planning.mddoc1,986 bytesreferences/freelancer-guide.mddoc14,029 bytesreferences/insurance-checklist.mddoc2,167 bytesreferences/investment-basics.mddoc1,769 bytesreferences/law-change-monitoring.mddoc7,955 bytesreferences/life-events.mddoc18,708 bytesreferences/scenarios.mddoc18,015 bytesrequirements.txtdoc698 bytesscripts/account_manager.pyruns13,182 bytesscripts/accountability_engine.pyruns15,575 bytesscripts/adviser_handoff.pyruns5,907 bytesscripts/alert_telemetry.pyruns8,421 bytesscripts/amount_parse.pyruns1,638 bytesscripts/annual_summary.pyruns18,422 bytesscripts/audit_log.pyruns6,708 bytesscripts/backup.pyruns8,994 bytesscripts/bank_sync.pyruns25,356 bytesscripts/benchmarks.pyruns14,836 bytesscripts/broker_importer.pyruns5,172 bytesscripts/budget_engine.pyruns16,954 bytesscripts/capital_gains.pyruns5,556 bytesscripts/cashflow_forecast.pyruns9,991 bytesscripts/category_learner.pyruns4,975 bytesscripts/chart_builder.pyruns38,561 bytesscripts/comparison_engine.pyruns8,593 bytesscripts/cowork_tasks.pyruns10,866 bytesscripts/csv_importer.pyruns27,849 bytesscripts/currency.pyruns8,869 bytesscripts/data_coach.pyruns17,610 bytesscripts/data_safety.pyruns27,969 bytesscripts/db.pyruns11,677 bytesscripts/db_migrate.pyruns19,165 bytesscripts/debt_optimizer.pyruns10,471 bytesscripts/demo_data.pyruns10,961 bytesscripts/doctor.pyruns5,815 bytesscripts/document_sorter.pyruns23,465 bytesscripts/finance_storage.pyruns13,089 bytesscripts/financial_journal.pyruns8,105 bytesscripts/financial_monitor.pyruns9,198 bytesscripts/generate_report.pyruns16,556 bytesscripts/goal_tracker.pyruns8,339 bytesscripts/hooks/auto_ingest.pyruns10,792 bytesscripts/household.pyruns13,528 bytesscripts/import_router.pyruns17,246 bytesscripts/inbox_scanner.pyruns12,080 bytesscripts/insight_engine.pyruns11,342 bytesscripts/insurance_analyzer.pyruns7,863 bytesscripts/investment_returns.pyruns7,841 bytesscripts/investment_tracker.pyruns16,674 bytesscripts/life_events.pyruns4,174 bytesscripts/llm_import.pyruns9,890 bytesscripts/locale_loader.pyruns3,879 bytesscripts/locale_registry.pyruns2,057 bytesscripts/locale_telemetry.pyruns3,082 bytesscripts/mcp_server.pyruns9,367 bytesscripts/monte_carlo.pyruns26,602 bytesscripts/mt940_importer.pyruns3,922 bytesscripts/net_worth_engine.pyruns12,880 bytesscripts/ofx_importer.pyruns3,742 bytesscripts/onboarding.pyruns52,996 bytesscripts/output_builder.pyruns5,267 bytesscripts/overdraft_detector.pyruns16,942 bytesscripts/pdf_importer.pyruns11,400 bytesscripts/price_sync.pyruns8,492 bytesscripts/profile_manager.pyruns17,277 bytesscripts/receipt_scanner.pyruns11,399 bytesscripts/reconciliation.pyruns3,969 bytesscripts/recurring_engine.pyruns14,199 bytesscripts/report_renderer.pyruns7,965 bytesscripts/scaffold_locale.pyruns17,188 bytesscripts/scenario_engine.pyruns17,586 bytesscripts/scenario_store.pyruns12,688 bytesscripts/session_alerts.pyruns29,920 bytesscripts/session_hygiene.pyruns1,892 bytesscripts/session_memory.pyruns4,027 bytesscripts/snapshot_scheduler.pyruns4,692 bytesscripts/sovereignty_check.pyruns5,969 bytesscripts/subscription_actions.pyruns5,568 bytesscripts/subscription_detector.pyruns9,232 bytesscripts/tax_brief.pyruns10,122 bytesscripts/tax_engine.pyruns14,071 bytesscripts/tax_optimizer.pyruns21,217 bytesscripts/tax_scenarios.pyruns7,637 bytesscripts/threshold_alerts.pyruns5,771 bytesscripts/timeline_engine.pyruns23,779 bytesscripts/transaction_logger.pyruns30,230 bytesscripts/transaction_normalizer.pyruns5,199 bytesscripts/transfer_matcher.pyruns13,334 bytesscripts/validate_locale.pyruns9,696 bytesscripts/viz.pyruns12,682 bytesscripts/weekly_digest.pyruns11,750 bytesscripts/whatif_engine.pyruns10,168 bytesscripts/workspace_builder.pyruns16,070 bytesskill.pyruns32,252 bytestests/__init__.pyruns0 bytestests/conftest.pyruns3,266 bytestests/test_account_manager.pyruns6,228 bytestests/test_accountability_engine.pyruns18,846 bytestests/test_annual_summary.pyruns19,693 bytestests/test_audit_log.pyruns2,918 bytestests/test_backup.pyruns3,081 bytestests/test_bank_sync.pyruns22,124 bytestests/test_benchmarks.pyruns8,730 bytestests/test_budget_engine.pyruns4,840 bytestests/test_call_signatures.pyruns4,350 bytestests/test_cashflow_forecast.pyruns13,785 bytestests/test_chart_builder.pyruns14,155 bytestests/test_comparison_engine.pyruns9,847 bytestests/test_currency.pyruns3,309 bytestests/test_data_coach.pyruns6,575 bytestests/test_data_safety.pyruns12,102 bytestests/test_db.pyruns20,343 bytestests/test_debt_optimizer.pyruns4,036 bytestests/test_demo_data.pyruns3,027 bytestests/test_doctor.pyruns844 bytestests/test_finance_storage.pyruns3,451 bytestests/test_financial_journal.pyruns7,470 bytestests/test_goal_tracker.pyruns3,536 bytestests/test_health_nudge.pyruns1,004 bytestests/test_household.pyruns13,280 bytestests/test_import_system.pyruns32,910 bytestests/test_importers.pyruns8,894 bytestests/test_insight_engine.pyruns1,509 bytestests/test_insurance_analyzer.pyruns1,574 bytestests/test_investment_tracker.pyruns6,576 bytestests/test_issues_9_10_11.pyruns5,010 bytestests/test_journeys.pyruns10,514 bytestests/test_life_events.pyruns4,135 bytestests/test_llm_import.pyruns4,764 bytestests/test_locale_de.pyruns3,395 bytestests/test_locale_telemetry.pyruns1,355 bytestests/test_mcp_server.pyruns3,937 bytestests/test_monitor_cap.pyruns1,361 bytestests/test_monte_carlo.pyruns11,247 bytestests/test_net_worth_engine.pyruns7,188 bytestests/test_onboarding.pyruns27,700 bytestests/test_overdraft_detector.pyruns14,309 bytestests/test_price_sync.pyruns9,022 bytestests/test_profile_manager.pyruns2,565 bytestests/test_receipt_scanner.pyruns13,349 bytestests/test_recurring_engine.pyruns3,606 bytestests/test_scenario_engine.pyruns7,980 bytestests/test_scenario_store.pyruns8,486 bytestests/test_session_alerts.pyruns7,280 bytestests/test_session_memory.pyruns4,710 bytestests/test_sovereignty_check.pyruns821 bytestests/test_subscription_actions.pyruns2,785 bytestests/test_subscription_detector.pyruns3,749 bytestests/test_tax_brief.pyruns3,421 bytestests/test_tax_engine.pyruns10,455 bytestests/test_tax_optimizer.pyruns13,178 bytestests/test_tax_properties.pyruns5,598 bytestests/test_tax_scenarios.pyruns2,263 bytestests/test_threshold_alerts.pyruns6,566 bytestests/test_timeline_engine.pyruns17,543 bytestests/test_transaction_logger.pyruns12,475 bytestests/test_transfer_matcher.pyruns13,268 bytestests/test_v410_all_accounts.pyruns5,045 bytestests/test_v410_hygiene.pyruns2,879 bytestests/test_v410_investments.pyruns1,843 bytestests/test_viz.pyruns11,053 bytestests/test_voice_lint.pyruns3,151 bytestests/test_whatif_engine.pyruns7,675 bytestests/test_workspace_builder.pyruns1,105 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubSkills included
- finance-assistant
Repository facts
- License
- No license detected
- Created
- Mar 2, 2026
- Last pushed
- Oct 30, 2026
- Forks
- 12
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 2 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 3 dangerous shell commandsin 3 files: README.md:98 install.sh:3 skill.py:407
- 226 network referencesin 33 files: scripts/scaffold_locale.py:53 tests/test_price_sync.py:50 scripts/bank_sync.py:34 and 30 more
- 2 obfuscation signalsin 2 files: scripts/bank_sync.py:140 scripts/data_safety.py:472
- 2 instruction override signalsin 1 file: SKILL.md:466
- 157 executable scriptsin 157 files: install.sh:1 scripts/account_manager.py:1 scripts/accountability_engine.py:1 and 154 more
- 22 references to secretsin 11 files: tests/test_bank_sync.py:81 scripts/bank_sync.py:119 scripts/finance_storage.py:69 and 8 more
- No requests to vote in Hot
Show all 412 signals by file
.github/SECURITY.md
- Network accessline 22
Alternatively, use [GitHub's private vulnerability reporting](https://github.com/googlarz/finance-assistant/security/advisories/new).
.gitmodules
CHANGELOG.md
- Network accessline 267
### Added — First-class transfer support ([#8](https://github.com/googlarz/finance-assistant/issues/8)) - Network accessline 274
- New `transactions.transfer_peer_id` and `transactions.subcategory` SQLite columns (schema v2 → v3, idempotent migration for existing installs). - Known limitation, by design: cross-currency transfers are not matched (same-currency only, v - Network accessline 276
- Reported and scoped by [@felciano](https://github.com/felciano) in [#8](https://github.com/googlarz/finance-assistant/issues/8) with real-data validation of the false-match rate; PR1 of the same report (honoring `type` in analytics) shipp - Network accessline 290
- **`transfer`/`investment`/`debt_payment` transactions were counted as income or spending**: the transaction schema has supported these types since v2, but every analytics engine that aggregated income/expenses classified purely by amount - Network accessline 291
- Fixed across every engine that aggregates transaction flows: `accountability_engine` (savings-rate trend, category creep), `annual_summary` (donation total), `budget_engine` (history-based limit suggestions), `cashflow_forecast` (average - Network accessline 292
- Added `transaction_logger.is_income_flow()` / `is_expense_flow()`: type-first classification, falling back to amount sign only when type is genuinely unset. All Python-side engines now share this instead of hand-rolling sign checks; SQL-s - Network accessline 293
- Reported by [@felciano](https://github.com/felciano) in [#7](https://github.com/googlarz/finance-assistant/issues/7), who also flagged the risk in 5 more engines beyond the 2 in the original repro — confirmed by audit and fixed in all of - Network accessline 303
- **Multi-account export detection**: new `csv_importer.detect_source_accounts()` reads the Account column of Mint/Monarch/YNAB exports (the three bundled formats whose files can span several of the user's accounts). When a file covers more - Network accessline 304
- **SKILL.md hard-stops on the warning**: Claude must show the account list and ask — import anyway, filter to one account, or split the file — instead of committing a multi-account file silently. Previously the failure mode was invisible: - Network accessline 305
- This is the containment half of [#6](https://github.com/googlarz/finance-assistant/issues/6); per-row account routing + transfer typing remains open there. - Network accessline 314
- **QBI SSTB phase-out was never wired up**: `calculate_qbi_deduction()` implements the §199A SSTB phase-out correctly, but `calculate_liability()` never passed `is_sstb` to it — so every self-employed filer got the full 20% QBI deduction r - Network accessline 316
- Reported by [@felciano](https://github.com/felciano) in [#5](https://github.com/googlarz/finance-assistant/issues/5), with a self-contained repro. Thanks for catching this one. - Network accessline 318
### Merged - [#3](https://github.com/googlarz/finance-assistant/pull/3) — `--doctor`'s locale check imported a function that doesn't exist (`locale_registry.list_locales`), so it always reported degraded. Fixed to use `tax_engine.get_availa - Network accessline 319
- [#3](https://github.com/googlarz/finance-assistant/pull/3) — `--doctor`'s locale check imported a function that doesn't exist (`locale_registry.list_locales`), so it always reported degraded. Fixed to use `tax_engine.get_available_locales - Network accessline 320
- [#4](https://github.com/googlarz/finance-assistant/pull/4) — bulk file imports (CSV/MT940/OFX) dropped `payee`/`tags`, silently breaking subscription detection and merchant analysis for every non-receipt import. (@felciano) - Network accessline 321
- [#2](https://github.com/googlarz/finance-assistant/pull/2) — `.claude/settings.json`'s `UserPromptSubmit` hook hardcoded an absolute path, silently no-op-ing the auto-ingest hook on any machine but the original author's. Now uses `$CLAUDE
CONTRIBUTING.md
- Network accessline 19
git clone --recurse-submodules https://github.com/googlarz/finance-assistant.git - Network accessline 77
"value": 14600, "source": "IRS Rev. Proc. 2023-34", "url": "https://www.irs.gov/pub/irs-drop/rp-23-34.pdf", - Network accessline 78
"source": "IRS Rev. Proc. 2023-34", "url": "https://www.irs.gov/pub/irs-drop/rp-23-34.pdf", "verified": "2024-01-15" - Network accessline 79
"url": "https://www.irs.gov/pub/irs-drop/rp-23-34.pdf",
LICENSE
README.md
- Network accessline 3
[](https://github.com/googlarz/finance-assistant/releases) - Network accessline 4
[](docs/ARCHITECTURE.md#testing) - Network accessline 5
[](#locales--validation) - Network accessline 6
[](#locales--validation) - Network accessline 7
[](docs/SECURITY.md) - Network accessline 8
[](LICENSE) - Network accessline 12
A personal finance copilot that applies actual tax statute to your real numbers — not estimates, not vibes. Runs locally through [Claude Code](https://claude.com/product/claude-code); your data never leaves your machine. Open source, free f - Network accessline 16
**[→ Live demo](https://googlarz.github.io/finance-assistant/)** — see a real conversation without installing - Dangerous shell operationline 98
curl -fsSL https://raw.githubusercontent.com/googlarz/finance-assistant/main/install.sh | bash - Network accessline 98
curl -fsSL https://raw.githubusercontent.com/googlarz/finance-assistant/main/install.sh | bash - Network accessline 104
git clone --recurse-submodules https://github.com/googlarz/finance-assistant.git \ - Network accessline 184
Tax rules live in country-specific plugins (a [git submodule](https://github.com/googlarz/finance-assistant-locales)) that the skill loads dynamically. - Network accessline 196
All seven are validated against **39 official tax-authority test cases** (BMF, HMRC, DGFiP, Belastingdienst, KAS, IRS, Revenue) — `python3 -m pytest locales/tests/test_validation.py -v`. US cases are computed independently from IRS Rev. Pro - Network accessline 210
**Want zero data to Anthropic?** For full privacy, run Claude Code against a local model: point [claude-code-router](https://github.com/musistudio/claude-code-router) at [Ollama](https://ollama.com) and nothing leaves your machine — not eve - Network accessline 242
- [@mattabate](https://github.com/mattabate) — German-format amounts, OFX refunds/transfers and Commerzbank detection (#9, #10, #11), each with the exact line and a repro. - Network accessline 243
- [@vishalhabib99](https://github.com/vishalhabib99) — the US 2026 tax figures (locales PR #3). - Network accessline 244
- [@gregario](https://github.com/gregario) — the Irish locale. - Network accessline 245
- [@felciano](https://github.com/felciano) — import and multi-currency bug reports, and the transfer-matching design (#8).
SKILL.md
- Instruction override signalline 466
**ALWAYS save user-provided financial data before answering.** If the user shares any of the following — even casually, even as part of a question — persist it immediately without asking for permission: - Instruction override signalline 493
**LLM-native fallback — handle ANY format.** If `import_file()` returns a dict with `needs_llm_extraction: True`, no built-in parser matched (unusual bank, foreign layout, copy-pasted table, scanned PDF, screenshot). Do NOT tell the user it
assets/demo.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 352" width="800" role="img" aria-label="Terminal replay of the Finance Assistant demo: seeded sample data, net worth and German tax summary">
assets/finance_dashboard_template.html
- Network accessline 5
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Finance Assistant — Dashboard</title> <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script> - Network accessline 6
<title>Finance Assistant — Dashboard</title> <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script> <style> - Network accessline 7
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
docs/ARCHITECTURE.md
- Network accessline 187
**Multi-account exports (`route_by_account=True`)** ([#8](https://github.com/googlarz/finance-assistant/issues/8)). Three of the 14 bundled formats carry a per-row account field — Mint (`Account Name`), Monarch (`Account`), YNAB (`Account`) - Network accessline 189
**Transfer detection is tiered, not a single heuristic** ([#7](https://github.com/googlarz/finance-assistant/issues/7), [#8](https://github.com/googlarz/finance-assistant/issues/8)): - Network accessline 195
`transfer_peer_id` (nullable, added in schema v3) is the only new column; the flat transaction store is otherwise unchanged — this was a deliberate choice over a double-entry rewrite (see [#8](https://github.com/googlarz/finance-assistant/i
docs/SECURITY.md
- Access to secretsline 124
[Credential-related source omitted]
docs/index.html
- Network accessline 279
<span class="badge">open source</span> <span class="badge">local-first</span> <a href="https://github.com/googlarz/finance-assistant" target="_blank">★ GitHub</a> - Network accessline 280
<span class="badge">local-first</span> <a href="https://github.com/googlarz/finance-assistant" target="_blank">★ GitHub</a> </header> - Network accessline 281
<a href="https://github.com/googlarz/finance-assistant" target="_blank">★ GitHub</a> - Network accessline 286
<p>The precision of a tax accountant. The patience of a financial advisor. The privacy of a local app. No subscription. No cloud. No guessing.</p> <p style="font-size: 0.85rem; color: var(--muted); margin-top: -8px; padding: 8px 16px; bac - Network accessline 287
<p style="font-size: 0.85rem; color: var(--muted); margin-top: -8px; padding: 8px 16px; background: rgba(120,130,140,0.08); border-radius: 6px; max-width: 580px;"> <strong>Heads up:</strong> Finance Assistant is built for <a href="https - Network accessline 288
<strong>Heads up:</strong> Finance Assistant is built for <a href="https://claude.com/product/claude-code">Claude Code</a> (free CLI). The browser-based claude.ai version is limited to conversation — CSV import, SQLite, live prices, and sch - Network accessline 289
<a href="https://github.com/googlarz/finance-assistant#where-this-runs">Feature matrix</a>.<br> - Network accessline 290
<em>Want zero data to Anthropic?</em> Route Claude Code through <a href="https://github.com/musistudio/claude-code-router">claude-code-router</a> + <a href="https://ollama.com">Ollama</a> for fully local inference (answer quality drops noti - Network accessline 537
<footer> <p>Finance Assistant is <a href="https://github.com/googlarz/finance-assistant">open source</a> and free forever. All data stays on your machine.<br> - Network accessline 538
<p>Finance Assistant is <a href="https://github.com/googlarz/finance-assistant">open source</a> and free forever. All data stays on your machine.<br> - Network accessline 539
<strong>Built for <a href="https://claude.com/product/claude-code">Claude Code</a></strong> (full features: CSV import, SQLite, encrypted backup, weekly digest). A <a href="https://claude.ai">claude.ai Projects</a> template is included but
docs/launch/CHECKLIST.md
- Access to secretsline 32
[Credential-related source omitted]
docs/launch/awesome-claude-code-entry.md
- Network accessline 3
Submit to: https://github.com/hesreallyhim/awesome-claude-code - Network accessline 8
- [Finance Assistant](https://github.com/googlarz/finance-assistant) — Personal finance copilot: budgets, multi-locale taxes (DE/FR/NL/PL/UK/US), FIRE Monte Carlo, debt strategies, subscription detection, encrypted backup. Local-first, 14 b - Network accessline 18
Live demo (no install required) at https://googlarz.github.io/finance-assistant/ so reviewers can see what it does without committing real data.
docs/launch/hn-show.md
- Network accessline 22
- No bank API integration in v1 (Plaid/SimpleFin is on the roadmap for v3.8). You import CSVs. - macOS for the launchd-scheduled bits (inbox watcher, weekly digest); the rest is plain Python and works anywhere. - **It's a Claude Code skill - Network accessline 24
- **It's a Claude Code skill — full features need [Claude Code](https://claude.com/product/claude-code) installed.** There's a claude.ai Projects template too, but the browser can't reach your files, so it's conversational only (no CSV impo - Network accessline 26
If you want zero data leaving your machine (not even prompts to Anthropic), you can route Claude Code through [claude-code-router](https://github.com/musistudio/claude-code-router) + [Ollama](https://ollama.com). Honest tradeoff: open local - Network accessline 28
Live demo (no install): https://googlarz.github.io/finance-assistant/ - Network accessline 29
Repo: https://github.com/googlarz/finance-assistant
docs/launch/linkedin.md
- Network accessline 17
https://github.com/googlarz/finance-assistant
docs/launch/plugin-listing.md
- Network accessline 25
git clone --recurse-submodules https://github.com/googlarz/finance-assistant.git ~/.claude/skills/finance-assistant && pip install -r ~/.claude/skills/finance-assistant/requirements.txt - Network accessline 29
## Repo / license https://github.com/googlarz/finance-assistant , CC BY 4.0. Version 4.1.0 (4.2.0 in progress). - Network accessline 30
https://github.com/googlarz/finance-assistant , CC BY 4.0. Version 4.1.0 (4.2.0 in progress).
docs/launch/product-hunt.md
- Network accessline 29
Try the no-install demo first: https://googlarz.github.io/finance-assistant/
docs/launch/reddit-claudeai.md
docs/launch/reddit.md
- Network accessline 32
Demo (no install): https://googlarz.github.io/finance-assistant/ - Network accessline 33
Repo: https://github.com/googlarz/finance-assistant - Network accessline 35
**To use the full thing you need [Claude Code](https://claude.com/product/claude-code) installed** — file system access is required for CSV import, local SQLite, and scheduled digests. There's a claude.ai Projects template if you only want - Network accessline 37
For privacy maximalists: you can route Claude Code through [claude-code-router](https://github.com/musistudio/claude-code-router) + a local [Ollama](https://ollama.com) model so no prompts leave your machine. Answer quality drops though — o - Network accessline 60
Demo: https://googlarz.github.io/finance-assistant/ - Network accessline 61
Repo: https://github.com/googlarz/finance-assistant
docs/launch/show-hn.md
docs/launch/x-thread.md
- Network accessline 3
1/ I built a personal-finance skill for Claude Code where the LLM talks and Python does the math. Tax figures come from deterministic engines, not model guesses. Open source, local-first. https://github.com/googlarz/finance-assistant
docs/sovereignty.md
install.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 2
# One-command install: clone (or update) into ~/.claude/skills, install deps, run the health check. # curl -fsSL https://raw.githubusercontent.com/googlarz/finance-assistant/main/install.sh | bash - Dangerous shell operationline 3
# curl -fsSL https://raw.githubusercontent.com/googlarz/finance-assistant/main/install.sh | bash - Network accessline 3
# curl -fsSL https://raw.githubusercontent.com/googlarz/finance-assistant/main/install.sh | bash - Network accessline 6
DEST="${FINANCE_ASSISTANT_DIR:-$HOME/.claude/skills/finance-assistant}" REPO="${FINANCE_ASSISTANT_REPO:-https://github.com/googlarz/finance-assistant.git}" - Network accessline 7
REPO="${FINANCE_ASSISTANT_REPO:-https://github.com/googlarz/finance-assistant.git}" - Network accessline 21
echo "Installing to $DEST" mkdir -p "$(dirname "$DEST")" git clone --recurse-submodules "$REPO" "$DEST" - Network accessline 22
mkdir -p "$(dirname "$DEST")" git clone --recurse-submodules "$REPO" "$DEST" fi - Network accessline 23
git clone --recurse-submodules "$REPO" "$DEST"
projects-template/PROJECT_INSTRUCTIONS.md
- Network accessline 9
- **Works here:** conversational budgeting, tax estimates, debt payoff comparisons, net-worth math, savings/goal planning — anything where the user supplies the numbers. - **Needs the Claude Code install:** bank-file import, SQLite storage, - Network accessline 10
- **Needs the Claude Code install:** bank-file import, SQLite storage, live stock/crypto prices, FIRE Monte Carlo, encrypted backup, inbox watcher. If a user asks for one of these, don't fake it — name the limit and point to `https://github
projects-template/README.md
- Network accessline 11
1. Go to [claude.ai](https://claude.ai) and create a new **Project**
scripts/account_manager.py
scripts/accountability_engine.py
- Executable scriptline 1
Executable file
scripts/adviser_handoff.py
- Executable scriptline 1
Executable file
scripts/alert_telemetry.py
- Executable scriptline 1
Executable file
scripts/amount_parse.py
- Executable scriptline 1
Executable file
scripts/annual_summary.py
- Executable scriptline 1
Executable file
scripts/audit_log.py
scripts/backup.py
- Executable scriptline 1
Executable file
scripts/bank_sync.py
- Executable scriptline 1
Executable file - Network accessline 34
GOCARDLESS_BASE = "https://bankaccountdata.gocardless.com/api/v2" - Access to secretsline 119
[Credential-related source omitted] - Possible obfuscationline 140
salt = _b64.b64decode(content["salt"]) - Access to secretsline 154
[Credential-related source omitted] - Network accessline 181
resp = requests.post( - Access to secretsline 217
[Credential-related source omitted] - Network accessline 232
resp = requests.get( - Network accessline 254
_ALLOWED_REDIRECT_URIS = {"https://localhost", "http://localhost"} - Network accessline 257
def create_requisition( institution_id: str, redirect_uri: str = "https://localhost", - Network accessline 258
institution_id: str, redirect_uri: str = "https://localhost", ) -> dict: - Network accessline 259
redirect_uri: str = "https://localhost", - Network accessline 264
Returns {"requisition_id": str, "link": str, "status": str}. The link is what the user opens in browser to grant consent. redirect_uri must be one of: https://localhost, http://localhost. - Network accessline 265
The link is what the user opens in browser to grant consent. redirect_uri must be one of: https://localhost, http://localhost. """ - Network accessline 266
redirect_uri must be one of: https://localhost, http://localhost. - Network accessline 280
agreement_resp = requests.post( - Network accessline 295
req_resp = requests.post( - Network accessline 339
resp = requests.get( - Network accessline 379
resp = requests.get( - Network accessline 407
resp = requests.get( - Network accessline 459
resp = requests.get( - Network accessline 679
if requisition_id: try: requests.delete( - Network accessline 680
try: requests.delete( f"{GOCARDLESS_BASE}/requisitions/{requisition_id}/", - Network accessline 681
requests.delete(
scripts/benchmarks.py
- Executable scriptline 1
Executable file
scripts/broker_importer.py
- Executable scriptline 1
Executable file
scripts/budget_engine.py
- Executable scriptline 1
Executable file
scripts/capital_gains.py
- Executable scriptline 1
Executable file
scripts/cashflow_forecast.py
- Executable scriptline 1
Executable file
scripts/category_learner.py
- Executable scriptline 1
Executable file
scripts/chart_builder.py
- Executable scriptline 1
Executable file - Network accessline 21
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.4/dist/chart.umd.min.js" - Network accessline 22
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.4/dist/chart.umd.min.js" integrity="sha384-NrKB+u6Ts6AtkIhwPixiKTzgSKNblyhlk0Sohlgar9UHUBzai/sgnNNWWd291xqt" crossorigin="anonymous" - Network accessline 23
src="https://cdn.jsdelivr.net/npm/chart.js@4.4.4/dist/chart.umd.min.js" - Network accessline 25
onerror="document.body.innerHTML='<div style=\'padding:20px;color:#e0e0e0;background:#1a1a2e;font-family:sans-serif\'><h3>⚠ Chart could not load</h3><p>Chart.js CDN is unavailable (offline or restricted network).</p><p>The data is sho - Network accessline 26
</script> <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-annotation@3.1.0/dist/chartjs-plugin-annotation.min.js" integrity="sha384-3N9GHhCtN3CQef6tNfqgZlv7sQLYIkcChN+uaTZ7xVdzKYp/SjBNPxa92+hM7EAY" crossorigin="anonymous"></scrip - Network accessline 27
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-annotation@3.1.0/dist/chartjs-plugin-annotation.min.js"
scripts/comparison_engine.py
- Executable scriptline 1
Executable file
scripts/cowork_tasks.py
- Executable scriptline 1
Executable file
scripts/csv_importer.py
- Executable scriptline 1
Executable file
scripts/currency.py
- Executable scriptline 1
Executable file - Network accessline 61
_FRANKFURTER_URL = "https://api.frankfurter.app/latest?from=EUR" - Network accessline 75
try: req = urllib.request.Request(_FRANKFURTER_URL, headers={"User-Agent": "Mozilla/5.0"}) - Network accessline 76
req = urllib.request.Request(_FRANKFURTER_URL, headers={"User-Agent": "Mozilla/5.0"}) - Network accessline 77
with urllib.request.urlopen(req, timeout=10) as resp:
scripts/data_coach.py
- Executable scriptline 1
Executable file
scripts/data_safety.py
scripts/db.py
- Executable scriptline 1
Executable file
scripts/db_migrate.py
- Executable scriptline 1
Executable file
scripts/debt_optimizer.py
- Executable scriptline 1
Executable file
scripts/demo_data.py
- Executable scriptline 1
Executable file
scripts/doctor.py
- Executable scriptline 1
Executable file
scripts/document_sorter.py
- Executable scriptline 1
Executable file
scripts/finance_storage.py
scripts/financial_journal.py
- Executable scriptline 1
Executable file
scripts/financial_monitor.py
- Executable scriptline 1
Executable file
scripts/generate_report.py
- Executable scriptline 1
Executable file
scripts/goal_tracker.py
- Executable scriptline 1
Executable file
scripts/hooks/auto_ingest.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/household.py
- Executable scriptline 1
Executable file
scripts/import_router.py
- Executable scriptline 1
Executable file
scripts/inbox_scanner.py
- Executable scriptline 1
Executable file
scripts/insight_engine.py
- Executable scriptline 1
Executable file
scripts/insurance_analyzer.py
- Executable scriptline 1
Executable file
scripts/investment_returns.py
- Executable scriptline 1
Executable file
scripts/investment_tracker.py
- Executable scriptline 1
Executable file
scripts/life_events.py
- Executable scriptline 1
Executable file
scripts/llm_import.py
- Executable scriptline 1
Executable file
scripts/locale_loader.py
- Executable scriptline 1
Executable file
scripts/locale_registry.py
- Executable scriptline 1
Executable file
scripts/locale_telemetry.py
- Executable scriptline 1
Executable file
scripts/mcp_server.py
scripts/monte_carlo.py
- Executable scriptline 1
Executable file
scripts/mt940_importer.py
- Executable scriptline 1
Executable file
scripts/net_worth_engine.py
- Executable scriptline 1
Executable file
scripts/ofx_importer.py
- Executable scriptline 1
Executable file
scripts/onboarding.py
- Executable scriptline 1
Executable file
scripts/output_builder.py
- Executable scriptline 1
Executable file
scripts/overdraft_detector.py
- Executable scriptline 1
Executable file
scripts/pdf_importer.py
- Executable scriptline 1
Executable file
scripts/price_sync.py
- Executable scriptline 1
Executable file - Network accessline 24
_YAHOO_URL = "https://query1.finance.yahoo.com/v8/finance/chart/{symbol}?interval=1d&range=1d" - Network accessline 29
_COINGECKO_URL = "https://api.coingecko.com/api/v3/simple/price?ids={ids}&vs_currencies={vs}" - Network accessline 56
url = _COINGECKO_URL.format(ids=coingecko_id, vs=vs_currency.lower()) try: req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) - Network accessline 57
try: req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) with urllib.request.urlopen(req, timeout=10) as resp: - Network accessline 58
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) - Network accessline 59
with urllib.request.urlopen(req, timeout=10) as resp: - Network accessline 89
url = _YAHOO_URL.format(symbol=symbol) try: req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) - Network accessline 90
try: req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) with urllib.request.urlopen(req, timeout=10) as resp: - Network accessline 91
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) - Network accessline 92
with urllib.request.urlopen(req, timeout=10) as resp:
scripts/profile_manager.py
scripts/receipt_scanner.py
- Executable scriptline 1
Executable file
scripts/reconciliation.py
- Executable scriptline 1
Executable file
scripts/recurring_engine.py
- Executable scriptline 1
Executable file
scripts/report_renderer.py
- Executable scriptline 1
Executable file
scripts/scaffold_locale.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 53
"AT": { "authority": "Bundesministerium für Finanzen (BMF)", "income_tax": "https://www.bmf.gv.at/themen/steuern/das-steuersystem/einkommensteuer.html", - Network accessline 54
"authority": "Bundesministerium für Finanzen (BMF)", "income_tax": "https://www.bmf.gv.at/themen/steuern/das-steuersystem/einkommensteuer.html", "social": "https://www.gesundheitskasse.at", - Network accessline 55
"income_tax": "https://www.bmf.gv.at/themen/steuern/das-steuersystem/einkommensteuer.html", - Network accessline 56
"social": "https://www.gesundheitskasse.at", - Network accessline 58
"CH": { "authority": "Eidgenössische Steuerverwaltung (ESTV)", "income_tax": "https://www.estv.admin.ch/estv/en/home/direct-federal-tax/direct-federal-tax.html", - Network accessline 59
"authority": "Eidgenössische Steuerverwaltung (ESTV)", "income_tax": "https://www.estv.admin.ch/estv/en/home/direct-federal-tax/direct-federal-tax.html", "social": "https://www.ahv-iv.ch", - Network accessline 60
"income_tax": "https://www.estv.admin.ch/estv/en/home/direct-federal-tax/direct-federal-tax.html", - Network accessline 61
"social": "https://www.ahv-iv.ch", - Network accessline 63
"CA": { "authority": "Canada Revenue Agency (CRA)", "income_tax": "https://www.canada.ca/en/revenue-agency/services/tax/individuals/frequently-asked-questions-individuals/canadian-income-tax-rates-individuals-current-previou - Network accessline 64
"authority": "Canada Revenue Agency (CRA)", "income_tax": "https://www.canada.ca/en/revenue-agency/services/tax/individuals/frequently-asked-questions-individuals/canadian-income-tax-rates-individuals-current-previous-years.html", - Network accessline 65
"income_tax": "https://www.canada.ca/en/revenue-agency/services/tax/individuals/frequently-asked-questions-individuals/canadian-income-tax-rates-individuals-current-previous-years.html", - Network accessline 66
"social": "https://www.canada.ca/en/employment-social-development/programs/ei.html", - Network accessline 68
"AU": { "authority": "Australian Taxation Office (ATO)", "income_tax": "https://www.ato.gov.au/rates/individual-income-tax-rates/", - Network accessline 69
"authority": "Australian Taxation Office (ATO)", "income_tax": "https://www.ato.gov.au/rates/individual-income-tax-rates/", "social": "https://www.ato.gov.au/individuals/super/", - Network accessline 70
"income_tax": "https://www.ato.gov.au/rates/individual-income-tax-rates/", - Network accessline 71
"social": "https://www.ato.gov.au/individuals/super/", - Network accessline 73
"ES": { "authority": "Agencia Tributaria", "income_tax": "https://sede.agenciatributaria.gob.es/Sede/en_gb/irpf.html", - Network accessline 74
"authority": "Agencia Tributaria", "income_tax": "https://sede.agenciatributaria.gob.es/Sede/en_gb/irpf.html", "social": "https://www.seg-social.es", - Network accessline 75
"income_tax": "https://sede.agenciatributaria.gob.es/Sede/en_gb/irpf.html", - Network accessline 76
"social": "https://www.seg-social.es", - Network accessline 78
"IT": { "authority": "Agenzia delle Entrate", "income_tax": "https://www.agenziaentrate.gov.it/portale/web/guest/schede/dichiarazioni/irpef", - Network accessline 79
"authority": "Agenzia delle Entrate", "income_tax": "https://www.agenziaentrate.gov.it/portale/web/guest/schede/dichiarazioni/irpef", "social": "https://www.inps.it", - Network accessline 80
"income_tax": "https://www.agenziaentrate.gov.it/portale/web/guest/schede/dichiarazioni/irpef", - Network accessline 81
"social": "https://www.inps.it", - Network accessline 83
"PT": { "authority": "Autoridade Tributária e Aduaneira", "income_tax": "https://www.portaldasfinancas.gov.pt", - Network accessline 84
"authority": "Autoridade Tributária e Aduaneira", "income_tax": "https://www.portaldasfinancas.gov.pt", "social": "https://www.seg-social.pt", - Network accessline 85
"income_tax": "https://www.portaldasfinancas.gov.pt", - Network accessline 86
"social": "https://www.seg-social.pt", - Network accessline 88
"SE": { "authority": "Skatteverket", "income_tax": "https://www.skatteverket.se/privat/skatter/beloppochprocent.4.html", - Network accessline 89
"authority": "Skatteverket", "income_tax": "https://www.skatteverket.se/privat/skatter/beloppochprocent.4.html", "social": "https://www.forsakringskassan.se", - Network accessline 90
"income_tax": "https://www.skatteverket.se/privat/skatter/beloppochprocent.4.html", - Network accessline 91
"social": "https://www.forsakringskassan.se", - Network accessline 93
"NO": { "authority": "Skatteetaten", "income_tax": "https://www.skatteetaten.no/en/rates/", - Network accessline 94
"authority": "Skatteetaten", "income_tax": "https://www.skatteetaten.no/en/rates/", "social": "https://www.nav.no", - Network accessline 95
"income_tax": "https://www.skatteetaten.no/en/rates/", - Network accessline 96
"social": "https://www.nav.no", - Network accessline 98
"DK": { "authority": "Skattestyrelsen", "income_tax": "https://skat.dk/en-us/individuals/tax-cards-and-tax-assessment-notices", - Network accessline 99
"authority": "Skattestyrelsen", "income_tax": "https://skat.dk/en-us/individuals/tax-cards-and-tax-assessment-notices", "social": "https://www.borger.dk", - Network accessline 100
"income_tax": "https://skat.dk/en-us/individuals/tax-cards-and-tax-assessment-notices", - Network accessline 101
"social": "https://www.borger.dk", - Network accessline 213
- Social security: {src_social} Cross-check: - OECD country tax notes: https://stats.oecd.org (Table I.1–I.7) - Network accessline 214
Cross-check: - OECD country tax notes: https://stats.oecd.org (Table I.1–I.7) - PwC Worldwide Tax Summaries: https://taxsummaries.pwc.com/{locale_name.lower().replace(' ', '-')} - Network accessline 215
- OECD country tax notes: https://stats.oecd.org (Table I.1–I.7) - Network accessline 216
- PwC Worldwide Tax Summaries: https://taxsummaries.pwc.com/{locale_name.lower().replace(' ', '-')}
scripts/scenario_engine.py
- Executable scriptline 1
Executable file
scripts/scenario_store.py
- Executable scriptline 1
Executable file
scripts/session_alerts.py
- Executable scriptline 1
Executable file
scripts/session_hygiene.py
- Executable scriptline 1
Executable file
scripts/session_memory.py
- Executable scriptline 1
Executable file
scripts/snapshot_scheduler.py
- Executable scriptline 1
Executable file
scripts/sovereignty_check.py
- Executable scriptline 1
Executable file - Network accessline 37
OLLAMA_URL = "http://localhost:11434/api/generate" - Network accessline 79
def _ask_ollama(model: str, prompt: str, timeout: int = 120) -> str: payload = json.dumps({"model": model, "prompt": prompt, "stream": False}).encode() req = urllib.request.Request( - Network accessline 80
payload = json.dumps({"model": model, "prompt": prompt, "stream": False}).encode() req = urllib.request.Request( OLLAMA_URL, data=payload, headers={"Content-Type": "application/json"} - Network accessline 81
req = urllib.request.Request( - Network accessline 82
OLLAMA_URL, data=payload, headers={"Content-Type": "application/json"} ) with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 83
) with urllib.request.urlopen(req, timeout=timeout) as resp: data = json.loads(resp.read()) - Network accessline 84
with urllib.request.urlopen(req, timeout=timeout) as resp:
scripts/subscription_actions.py
- Executable scriptline 1
Executable file
scripts/subscription_detector.py
- Executable scriptline 1
Executable file
scripts/tax_brief.py
- Executable scriptline 1
Executable file
scripts/tax_engine.py
- Executable scriptline 1
Executable file
scripts/tax_optimizer.py
- Executable scriptline 1
Executable file
scripts/tax_scenarios.py
- Executable scriptline 1
Executable file
scripts/threshold_alerts.py
- Executable scriptline 1
Executable file
scripts/timeline_engine.py
- Executable scriptline 1
Executable file
scripts/transaction_logger.py
- Executable scriptline 1
Executable file
scripts/transaction_normalizer.py
- Executable scriptline 1
Executable file
scripts/transfer_matcher.py
- Executable scriptline 1
Executable file
scripts/validate_locale.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/viz.py
- Executable scriptline 1
Executable file
scripts/weekly_digest.py
- Executable scriptline 1
Executable file
scripts/whatif_engine.py
- Executable scriptline 1
Executable file
scripts/workspace_builder.py
- Executable scriptline 1
Executable file
skill.py
- Executable scriptline 1
Executable file - Network accessline 222
plist_content = f"""<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> - Network accessline 223
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> - Network accessline 224
"http://www.apple.com/DTDs/PropertyList-1.0.dtd"> - Network accessline 317
plist_content = f"""<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> - Network accessline 318
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> - Network accessline 319
"http://www.apple.com/DTDs/PropertyList-1.0.dtd"> - Dangerous shell operationline 407
print(f" Remove it first if you want to link this clone: rm '{target}'") - Network accessline 499
Full docs: https://github.com/googlarz/finance-assistant"""
tests/__init__.py
- Executable scriptline 1
Executable file
tests/conftest.py
- Executable scriptline 1
Executable file
tests/test_account_manager.py
- Executable scriptline 1
Executable file
tests/test_accountability_engine.py
- Executable scriptline 1
Executable file
tests/test_annual_summary.py
- Executable scriptline 1
Executable file
tests/test_audit_log.py
- Executable scriptline 1
Executable file
tests/test_backup.py
- Executable scriptline 1
Executable file
tests/test_bank_sync.py
- Executable scriptline 1
Executable file - Access to secretsline 81
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 121
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Network accessline 168
_setup_token(finance_dir) with pytest.raises(ValueError, match="not allowed"): bank_sync.create_requisition("BANK_ID", redirect_uri="https://evil.com/callback") - Network accessline 170
bank_sync.create_requisition("BANK_ID", redirect_uri="https://evil.com/callback") - Network accessline 173
"""create_requisition must accept https://localhost.""" - Network accessline 179
try: bank_sync.create_requisition("BANK_ID", redirect_uri="https://localhost") - Network accessline 180
bank_sync.create_requisition("BANK_ID", redirect_uri="https://localhost") - Network accessline 189
_setup_token(finance_dir) bank_sync.requests.get.return_value = _mock_response([ {"id": "SPARKASSE_DE", "name": "Sparkasse", "bic": "BELADEBE", "logo": "https://example.com/logo.png"}, - Network accessline 190
bank_sync.requests.get.return_value = _mock_response([ {"id": "SPARKASSE_DE", "name": "Sparkasse", "bic": "BELADEBE", "logo": "https://example.com/logo.png"}, {"id": "ING_DE", "name": "ING", "bic": "INGDDEFF", "logo" - Network accessline 191
{"id": "SPARKASSE_DE", "name": "Sparkasse", "bic": "BELADEBE", "logo": "https://example.com/logo.png"},
tests/test_benchmarks.py
- Executable scriptline 1
Executable file
tests/test_budget_engine.py
- Executable scriptline 1
Executable file
tests/test_call_signatures.py
- Executable scriptline 1
Executable file
tests/test_cashflow_forecast.py
- Executable scriptline 1
Executable file
tests/test_chart_builder.py
tests/test_comparison_engine.py
- Executable scriptline 1
Executable file
tests/test_currency.py
- Executable scriptline 1
Executable file
tests/test_data_coach.py
- Executable scriptline 1
Executable file
tests/test_data_safety.py
- Executable scriptline 1
Executable file
tests/test_db.py
- Executable scriptline 1
Executable file
tests/test_debt_optimizer.py
- Executable scriptline 1
Executable file
tests/test_demo_data.py
- Executable scriptline 1
Executable file
tests/test_doctor.py
- Executable scriptline 1
Executable file
tests/test_finance_storage.py
- Executable scriptline 1
Executable file
tests/test_financial_journal.py
- Executable scriptline 1
Executable file
tests/test_goal_tracker.py
- Executable scriptline 1
Executable file
tests/test_health_nudge.py
- Executable scriptline 1
Executable file
tests/test_household.py
- Executable scriptline 1
Executable file
tests/test_import_system.py
- Executable scriptline 1
Executable file
tests/test_importers.py
- Executable scriptline 1
Executable file
tests/test_insight_engine.py
- Executable scriptline 1
Executable file
tests/test_insurance_analyzer.py
- Executable scriptline 1
Executable file
tests/test_investment_tracker.py
- Executable scriptline 1
Executable file
tests/test_issues_9_10_11.py
- Executable scriptline 1
Executable file
tests/test_journeys.py
- Executable scriptline 1
Executable file
tests/test_life_events.py
- Executable scriptline 1
Executable file
tests/test_llm_import.py
- Executable scriptline 1
Executable file
tests/test_locale_de.py
- Executable scriptline 1
Executable file
tests/test_locale_telemetry.py
- Executable scriptline 1
Executable file
tests/test_mcp_server.py
- Executable scriptline 1
Executable file
tests/test_monitor_cap.py
- Executable scriptline 1
Executable file
tests/test_monte_carlo.py
- Executable scriptline 1
Executable file
tests/test_net_worth_engine.py
- Executable scriptline 1
Executable file
tests/test_onboarding.py
- Executable scriptline 1
Executable file
tests/test_overdraft_detector.py
- Executable scriptline 1
Executable file
tests/test_price_sync.py
- Executable scriptline 1
Executable file - Network accessline 50
def test_fetch_price_returns_price_and_currency(isolated_finance_dir): mock_resp = _make_yahoo_response(price=182.45, currency="USD") with patch("urllib.request.urlopen", return_value=mock_resp): - Network accessline 51
mock_resp = _make_yahoo_response(price=182.45, currency="USD") with patch("urllib.request.urlopen", return_value=mock_resp): price, currency = fetch_price("AAPL") - Network accessline 52
with patch("urllib.request.urlopen", return_value=mock_resp): - Network accessline 77
with patch("price_sync._load_portfolio", return_value=portfolio), \ patch("price_sync._save_portfolio") as mock_save, \ patch("urllib.request.urlopen", return_value=mock_resp): - Network accessline 78
patch("price_sync._save_portfolio") as mock_save, \ patch("urllib.request.urlopen", return_value=mock_resp): result = sync_prices() - Network accessline 79
patch("urllib.request.urlopen", return_value=mock_resp): - Network accessline 112
with patch("price_sync._load_portfolio", return_value=portfolio), \ patch("price_sync._save_portfolio"), \ patch("urllib.request.urlopen") as mock_urlopen: - Network accessline 113
patch("price_sync._save_portfolio"), \ patch("urllib.request.urlopen") as mock_urlopen: result = sync_prices() - Network accessline 114
patch("urllib.request.urlopen") as mock_urlopen: - Network accessline 142
with patch("price_sync._load_portfolio", return_value=portfolio), \ patch("price_sync._save_portfolio"), \ patch("urllib.request.urlopen") as mock_urlopen: - Network accessline 143
patch("price_sync._save_portfolio"), \ patch("urllib.request.urlopen") as mock_urlopen: result = sync_prices(force=False) - Network accessline 144
patch("urllib.request.urlopen") as mock_urlopen: - Network accessline 168
with patch("price_sync._load_portfolio", return_value=portfolio), \ patch("price_sync._save_portfolio"), \ patch("urllib.request.urlopen", return_value=mock_resp): - Network accessline 169
patch("price_sync._save_portfolio"), \ patch("urllib.request.urlopen", return_value=mock_resp): result = sync_prices(force=True) - Network accessline 170
patch("urllib.request.urlopen", return_value=mock_resp): - Network accessline 194
def test_fetch_price_routes_crypto_to_coingecko(isolated_finance_dir): mock_resp = _make_coingecko_response("bitcoin", 50000.0, "eur") with patch("urllib.request.urlopen", return_value=mock_resp) as mock_open: - Network accessline 195
mock_resp = _make_coingecko_response("bitcoin", 50000.0, "eur") with patch("urllib.request.urlopen", return_value=mock_resp) as mock_open: price, currency = fetch_price("BTC", asset_class="crypto", vs_currency="EUR") - Network accessline 196
with patch("urllib.request.urlopen", return_value=mock_resp) as mock_open: - Network accessline 206
def test_fetch_price_uses_explicit_coingecko_id(isolated_finance_dir): mock_resp = _make_coingecko_response("uniswap", 8.50, "eur") with patch("urllib.request.urlopen", return_value=mock_resp) as mock_open: - Network accessline 207
mock_resp = _make_coingecko_response("uniswap", 8.50, "eur") with patch("urllib.request.urlopen", return_value=mock_resp) as mock_open: price, currency = fetch_price( - Network accessline 208
with patch("urllib.request.urlopen", return_value=mock_resp) as mock_open: - Network accessline 227
with patch("price_sync._load_portfolio", return_value=portfolio), \ patch("price_sync._save_portfolio") as mock_save, \ patch("urllib.request.urlopen", return_value=mock_resp): - Network accessline 228
patch("price_sync._save_portfolio") as mock_save, \ patch("urllib.request.urlopen", return_value=mock_resp): result = sync_prices() - Network accessline 229
patch("urllib.request.urlopen", return_value=mock_resp):
tests/test_profile_manager.py
- Executable scriptline 1
Executable file
tests/test_receipt_scanner.py
- Executable scriptline 1
Executable file
tests/test_recurring_engine.py
- Executable scriptline 1
Executable file
tests/test_scenario_engine.py
- Executable scriptline 1
Executable file
tests/test_scenario_store.py
- Executable scriptline 1
Executable file
tests/test_session_alerts.py
- Executable scriptline 1
Executable file
tests/test_session_memory.py
- Executable scriptline 1
Executable file
tests/test_sovereignty_check.py
- Executable scriptline 1
Executable file
tests/test_subscription_actions.py
- Executable scriptline 1
Executable file
tests/test_subscription_detector.py
- Executable scriptline 1
Executable file
tests/test_tax_brief.py
- Executable scriptline 1
Executable file
tests/test_tax_engine.py
- Executable scriptline 1
Executable file
tests/test_tax_optimizer.py
- Executable scriptline 1
Executable file
tests/test_tax_properties.py
- Executable scriptline 1
Executable file
tests/test_tax_scenarios.py
- Executable scriptline 1
Executable file
tests/test_threshold_alerts.py
- Executable scriptline 1
Executable file
tests/test_timeline_engine.py
- Executable scriptline 1
Executable file
tests/test_transaction_logger.py
- Executable scriptline 1
Executable file
tests/test_transfer_matcher.py
- Executable scriptline 1
Executable file
tests/test_v410_all_accounts.py
- Executable scriptline 1
Executable file
tests/test_v410_hygiene.py
- Executable scriptline 1
Executable file
tests/test_v410_investments.py
- Executable scriptline 1
Executable file
tests/test_viz.py
- Executable scriptline 1
Executable file
tests/test_voice_lint.py
- Executable scriptline 1
Executable file
tests/test_whatif_engine.py
- Executable scriptline 1
Executable file
tests/test_workspace_builder.py
- Executable scriptline 1
Executable file
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 25 facts
- Contacts cdn.jsdelivr.net, which SKILL.md, the README and the plugin manifest do not mentionscripts/chart_builder.py:23High confidence
- Contacts api.frankfurter.app, which SKILL.md, the README and the plugin manifest do not mentionscripts/currency.py:61High confidence
- Contacts query1.finance.yahoo.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/price_sync.py:24High confidence
- Contacts api.coingecko.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/price_sync.py:29High confidence
- Contacts www.bmf.gv.at, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:55High confidence
- Contacts www.gesundheitskasse.at, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:56High confidence
- Contacts www.estv.admin.ch, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:60High confidence
- Contacts www.ahv-iv.ch, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:61High confidence
- Contacts www.canada.ca, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:65High confidence
- Contacts www.ato.gov.au, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:70High confidence
- Contacts sede.agenciatributaria.gob.es, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:75High confidence
- Contacts www.seg-social.es, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:76High confidence
- Contacts www.agenziaentrate.gov.it, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:80High confidence
- Contacts www.inps.it, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:81High confidence
- Contacts www.portaldasfinancas.gov.pt, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:85High confidence
- Contacts www.seg-social.pt, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:86High confidence
- Contacts www.skatteverket.se, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:90High confidence
- Contacts www.forsakringskassan.se, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:91High confidence
- Contacts www.skatteetaten.no, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:95High confidence
- Contacts www.nav.no, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:96High confidence
- Contacts skat.dk, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:100High confidence
- Contacts www.borger.dk, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:101High confidence
- Contacts stats.oecd.org, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:215High confidence
- Contacts taxsummaries.pwc.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/scaffold_locale.py:216High confidence
- Contacts www.apple.com, which SKILL.md, the README and the plugin manifest do not mentionskill.py:224High confidence
Signal confidence: 393 facts
- Network access in prose of documentation.github/SECURITY.md:22Low confidence
- Network access in prose of documentationCHANGELOG.md:267Low confidence
- Network access in prose of documentationCHANGELOG.md:274Low confidence
- Network access in prose of documentationCHANGELOG.md:276Low confidence
- Network access in prose of documentationCHANGELOG.md:290Low confidence
- Network access in prose of documentationCHANGELOG.md:291Low confidence
- Network access in prose of documentationCHANGELOG.md:292Low confidence
- Network access in prose of documentationCHANGELOG.md:293Low confidence
- Network access in prose of documentationCHANGELOG.md:303Low confidence
- Network access in prose of documentationCHANGELOG.md:304Low confidence
- Network access in prose of documentationCHANGELOG.md:305Low confidence
- Network access in prose of documentationCHANGELOG.md:314Low confidence
- Network access in prose of documentationCHANGELOG.md:316Low confidence
- Network access in prose of documentationCHANGELOG.md:318Low confidence
- Network access in prose of documentationCHANGELOG.md:319Low confidence
- Network access in prose of documentationCHANGELOG.md:320Low confidence
- Network access in prose of documentationCHANGELOG.md:321Low confidence
- Network access in code of documentationCONTRIBUTING.md:19Low confidence
- Network access in code of documentationCONTRIBUTING.md:77Low confidence
- Network access in code of documentationCONTRIBUTING.md:78Low confidence
- Network access in code of documentationCONTRIBUTING.md:79Low confidence
- Network access in prose of documentationREADME.md:3Low confidence
- Network access in prose of documentationREADME.md:4Low confidence
- Network access in prose of documentationREADME.md:5Low confidence
- Network access in prose of documentationREADME.md:6Low confidence
- Network access in prose of documentationREADME.md:7Low confidence
- Network access in prose of documentationREADME.md:8Low confidence
- Network access in prose of documentationREADME.md:12Low confidence
- Network access in prose of documentationREADME.md:16Low confidence
- Dangerous shell operation in code of documentationREADME.md:98Low confidence
- Network access in code of documentationREADME.md:98Low confidence
- Network access in code of documentationREADME.md:104Low confidence
- Network access in prose of documentationREADME.md:184Low confidence
- Network access in prose of documentationREADME.md:196Low confidence
- Network access in prose of documentationREADME.md:210Low confidence
- Network access in prose of documentationREADME.md:242Low confidence
- Network access in prose of documentationREADME.md:243Low confidence
- Network access in prose of documentationREADME.md:244Low confidence
- Network access in prose of documentationREADME.md:245Low confidence
- Instruction override signal in code of the SKILL.mdSKILL.md:466Low confidence
- Instruction override signal in code of the SKILL.mdSKILL.md:493Low confidence
- Network access in prose of documentationdocs/ARCHITECTURE.md:187Low confidence
- Network access in prose of documentationdocs/ARCHITECTURE.md:189Low confidence
- Network access in prose of documentationdocs/ARCHITECTURE.md:195Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valuedocs/SECURITY.md:124Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valuedocs/launch/CHECKLIST.md:32Low confidence
- Network access in prose of documentationdocs/launch/awesome-claude-code-entry.md:3Low confidence
- Network access in code of documentationdocs/launch/awesome-claude-code-entry.md:8Low confidence
- Network access in code of documentationdocs/launch/awesome-claude-code-entry.md:18Low confidence
- Network access in prose of documentationdocs/launch/hn-show.md:22Low confidence
and 343 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Path .claude/settings.json | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.