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.

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

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>/
51GitHub stars
1star in 7 days
1skill in this repository
5commits in 30 days

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

Oct 25, 2026Nov 2, 202651

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 tokens

Always available to the agent

SKILL.md

10,933 tokens

When the skill is activated

Reference documents

68,293 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. 1. Mission and Boundaries
  2. 2. Voice and Tone — this is the most important section
  3. 3. Non-Negotiable Rules
  4. 3a. Evidence and Data Policy
  5. 4. Start of Session
  6. 4a. Scheduled Tasks
  7. 4b. The "hi" check-in
  8. 5. Core Turn Loop
  9. 6. Mode Router
  10. MCP Server (read-only)
  11. CLI Usage
  12. 7. Tool Contract
  13. Visualizations

Scripts executed separately

  • install.sh
  • scripts/account_manager.py
  • scripts/accountability_engine.py
  • scripts/adviser_handoff.py
  • scripts/alert_telemetry.py
  • scripts/amount_parse.py
  • scripts/annual_summary.py
  • scripts/audit_log.py
  • scripts/backup.py
  • scripts/bank_sync.py
  • scripts/benchmarks.py
  • scripts/broker_importer.py
  • scripts/budget_engine.py
  • scripts/capital_gains.py
  • scripts/cashflow_forecast.py
  • scripts/category_learner.py
  • scripts/chart_builder.py
  • scripts/comparison_engine.py
  • scripts/cowork_tasks.py
  • scripts/csv_importer.py
  • scripts/currency.py
  • scripts/data_coach.py
  • scripts/data_safety.py
  • scripts/db.py
  • scripts/db_migrate.py
  • scripts/debt_optimizer.py
  • scripts/demo_data.py
  • scripts/doctor.py
  • scripts/document_sorter.py
  • scripts/finance_storage.py
  • scripts/financial_journal.py
  • scripts/financial_monitor.py
  • scripts/generate_report.py
  • scripts/goal_tracker.py
  • scripts/hooks/auto_ingest.py
  • scripts/household.py
  • scripts/import_router.py
  • scripts/inbox_scanner.py
  • scripts/insight_engine.py
  • scripts/insurance_analyzer.py
  • scripts/investment_returns.py
  • scripts/investment_tracker.py
  • scripts/life_events.py
  • scripts/llm_import.py
  • scripts/locale_loader.py
  • scripts/locale_registry.py
  • scripts/locale_telemetry.py
  • scripts/mcp_server.py
  • scripts/monte_carlo.py
  • scripts/mt940_importer.py
  • scripts/net_worth_engine.py
  • scripts/ofx_importer.py
  • scripts/onboarding.py
  • scripts/output_builder.py
  • scripts/overdraft_detector.py
  • scripts/pdf_importer.py
  • scripts/price_sync.py
  • scripts/profile_manager.py
  • scripts/receipt_scanner.py
  • scripts/reconciliation.py
  • scripts/recurring_engine.py
  • scripts/report_renderer.py
  • scripts/scaffold_locale.py
  • scripts/scenario_engine.py
  • scripts/scenario_store.py
  • scripts/session_alerts.py
  • scripts/session_hygiene.py
  • scripts/session_memory.py
  • scripts/snapshot_scheduler.py
  • scripts/sovereignty_check.py
  • scripts/subscription_actions.py
  • scripts/subscription_detector.py
  • scripts/tax_brief.py
  • scripts/tax_engine.py
  • scripts/tax_optimizer.py
  • scripts/tax_scenarios.py
  • scripts/threshold_alerts.py
  • scripts/timeline_engine.py
  • scripts/transaction_logger.py
  • scripts/transaction_normalizer.py
  • scripts/transfer_matcher.py
  • scripts/validate_locale.py
  • scripts/viz.py
  • scripts/weekly_digest.py
  • scripts/whatif_engine.py
  • scripts/workspace_builder.py
  • skill.py
  • tests/__init__.py
  • tests/conftest.py
  • tests/test_account_manager.py
  • tests/test_accountability_engine.py
  • tests/test_annual_summary.py
  • tests/test_audit_log.py
  • tests/test_backup.py
  • tests/test_bank_sync.py
  • tests/test_benchmarks.py
  • tests/test_budget_engine.py
  • tests/test_call_signatures.py
  • tests/test_cashflow_forecast.py
  • tests/test_chart_builder.py
  • tests/test_comparison_engine.py
  • tests/test_currency.py
  • tests/test_data_coach.py
  • tests/test_data_safety.py
  • tests/test_db.py
  • tests/test_debt_optimizer.py
  • tests/test_demo_data.py
  • tests/test_doctor.py
  • tests/test_finance_storage.py
  • tests/test_financial_journal.py
  • tests/test_goal_tracker.py
  • tests/test_health_nudge.py
  • tests/test_household.py
  • tests/test_import_system.py
  • tests/test_importers.py
  • tests/test_insight_engine.py
  • tests/test_insurance_analyzer.py
  • tests/test_investment_tracker.py
  • tests/test_issues_9_10_11.py
  • tests/test_journeys.py
  • tests/test_life_events.py
  • tests/test_llm_import.py
  • tests/test_locale_de.py
  • tests/test_locale_telemetry.py
  • tests/test_mcp_server.py
  • tests/test_monitor_cap.py
  • tests/test_monte_carlo.py
  • tests/test_net_worth_engine.py
  • tests/test_onboarding.py
  • tests/test_overdraft_detector.py
  • tests/test_price_sync.py
  • tests/test_profile_manager.py
  • tests/test_receipt_scanner.py
  • tests/test_recurring_engine.py
  • tests/test_scenario_engine.py
  • tests/test_scenario_store.py
  • tests/test_session_alerts.py
  • tests/test_session_memory.py
  • tests/test_sovereignty_check.py
  • tests/test_subscription_actions.py
  • tests/test_subscription_detector.py
  • tests/test_tax_brief.py
  • tests/test_tax_engine.py
  • tests/test_tax_optimizer.py
  • tests/test_tax_properties.py
  • tests/test_tax_scenarios.py
  • tests/test_threshold_alerts.py
  • tests/test_timeline_engine.py
  • tests/test_transaction_logger.py
  • tests/test_transfer_matcher.py
  • tests/test_v410_all_accounts.py
  • tests/test_v410_hygiene.py
  • tests/test_v410_investments.py
  • tests/test_viz.py
  • tests/test_voice_lint.py
  • tests/test_whatif_engine.py
  • tests/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 bytes
  • CHANGELOG.mddoc47,330 bytes
  • CONTRIBUTING.mddoc5,191 bytes
  • LICENSEasset911 bytes
  • README.mddoc15,604 bytes
  • SKILL.mdcore47,464 bytes
  • SKILL.mdcore47,464 bytes
  • SKILL.mdcore47,464 bytes
  • TASKS.mddoc2,510 bytes
  • assets/dashboard-preview.jpgasset928,753 bytes
  • assets/demo.svgasset3,970 bytes
  • assets/finance_dashboard_template.htmlasset108,726 bytes
  • assets/folder_structure_template.mddoc5,676 bytes
  • assets/steuerberater_handoff.mddoc11,030 bytes
  • assets/tax_dashboard_template.htmlasset3,816 bytes
  • docs/ARCHITECTURE.mddoc21,390 bytes
  • docs/MCP.mddoc3,098 bytes
  • docs/SECURITY.mddoc8,675 bytes
  • docs/index.htmlasset23,338 bytes
  • docs/launch/CHECKLIST.mddoc3,972 bytes
  • docs/launch/README.mddoc1,081 bytes
  • docs/launch/awesome-claude-code-entry.mddoc1,225 bytes
  • docs/launch/demo-transcript.mddoc2,982 bytes
  • docs/launch/hn-show.mddoc3,154 bytes
  • docs/launch/linkedin.mddoc1,306 bytes
  • docs/launch/plugin-listing.mddoc2,362 bytes
  • docs/launch/product-hunt.mddoc2,035 bytes
  • docs/launch/reddit-claudeai.mddoc1,738 bytes
  • docs/launch/reddit.mddoc3,703 bytes
  • docs/launch/show-hn.mddoc2,769 bytes
  • docs/launch/x-thread.mddoc1,367 bytes
  • docs/sovereignty.mddoc3,833 bytes
  • install.shruns1,315 bytes
  • projects-template/PROJECT_INSTRUCTIONS.mddoc3,394 bytes
  • projects-template/README.mddoc1,936 bytes
  • pyproject.tomlasset828 bytes
  • references/budgeting-strategies.mddoc1,330 bytes
  • references/debt-strategies.mddoc1,503 bytes
  • references/deduction-rules.mddoc16,606 bytes
  • references/elster-guide.mddoc11,863 bytes
  • references/expat-guide.mddoc9,585 bytes
  • references/financial-blind-spots.mddoc9,990 bytes
  • references/fire-planning.mddoc1,986 bytes
  • references/freelancer-guide.mddoc14,029 bytes
  • references/insurance-checklist.mddoc2,167 bytes
  • references/investment-basics.mddoc1,769 bytes
  • references/law-change-monitoring.mddoc7,955 bytes
  • references/life-events.mddoc18,708 bytes
  • references/scenarios.mddoc18,015 bytes
  • requirements.txtdoc698 bytes
  • scripts/account_manager.pyruns13,182 bytes
  • scripts/accountability_engine.pyruns15,575 bytes
  • scripts/adviser_handoff.pyruns5,907 bytes
  • scripts/alert_telemetry.pyruns8,421 bytes
  • scripts/amount_parse.pyruns1,638 bytes
  • scripts/annual_summary.pyruns18,422 bytes
  • scripts/audit_log.pyruns6,708 bytes
  • scripts/backup.pyruns8,994 bytes
  • scripts/bank_sync.pyruns25,356 bytes
  • scripts/benchmarks.pyruns14,836 bytes
  • scripts/broker_importer.pyruns5,172 bytes
  • scripts/budget_engine.pyruns16,954 bytes
  • scripts/capital_gains.pyruns5,556 bytes
  • scripts/cashflow_forecast.pyruns9,991 bytes
  • scripts/category_learner.pyruns4,975 bytes
  • scripts/chart_builder.pyruns38,561 bytes
  • scripts/comparison_engine.pyruns8,593 bytes
  • scripts/cowork_tasks.pyruns10,866 bytes
  • scripts/csv_importer.pyruns27,849 bytes
  • scripts/currency.pyruns8,869 bytes
  • scripts/data_coach.pyruns17,610 bytes
  • scripts/data_safety.pyruns27,969 bytes
  • scripts/db.pyruns11,677 bytes
  • scripts/db_migrate.pyruns19,165 bytes
  • scripts/debt_optimizer.pyruns10,471 bytes
  • scripts/demo_data.pyruns10,961 bytes
  • scripts/doctor.pyruns5,815 bytes
  • scripts/document_sorter.pyruns23,465 bytes
  • scripts/finance_storage.pyruns13,089 bytes
  • scripts/financial_journal.pyruns8,105 bytes
  • scripts/financial_monitor.pyruns9,198 bytes
  • scripts/generate_report.pyruns16,556 bytes
  • scripts/goal_tracker.pyruns8,339 bytes
  • scripts/hooks/auto_ingest.pyruns10,792 bytes
  • scripts/household.pyruns13,528 bytes
  • scripts/import_router.pyruns17,246 bytes
  • scripts/inbox_scanner.pyruns12,080 bytes
  • scripts/insight_engine.pyruns11,342 bytes
  • scripts/insurance_analyzer.pyruns7,863 bytes
  • scripts/investment_returns.pyruns7,841 bytes
  • scripts/investment_tracker.pyruns16,674 bytes
  • scripts/life_events.pyruns4,174 bytes
  • scripts/llm_import.pyruns9,890 bytes
  • scripts/locale_loader.pyruns3,879 bytes
  • scripts/locale_registry.pyruns2,057 bytes
  • scripts/locale_telemetry.pyruns3,082 bytes
  • scripts/mcp_server.pyruns9,367 bytes
  • scripts/monte_carlo.pyruns26,602 bytes
  • scripts/mt940_importer.pyruns3,922 bytes
  • scripts/net_worth_engine.pyruns12,880 bytes
  • scripts/ofx_importer.pyruns3,742 bytes
  • scripts/onboarding.pyruns52,996 bytes
  • scripts/output_builder.pyruns5,267 bytes
  • scripts/overdraft_detector.pyruns16,942 bytes
  • scripts/pdf_importer.pyruns11,400 bytes
  • scripts/price_sync.pyruns8,492 bytes
  • scripts/profile_manager.pyruns17,277 bytes
  • scripts/receipt_scanner.pyruns11,399 bytes
  • scripts/reconciliation.pyruns3,969 bytes
  • scripts/recurring_engine.pyruns14,199 bytes
  • scripts/report_renderer.pyruns7,965 bytes
  • scripts/scaffold_locale.pyruns17,188 bytes
  • scripts/scenario_engine.pyruns17,586 bytes
  • scripts/scenario_store.pyruns12,688 bytes
  • scripts/session_alerts.pyruns29,920 bytes
  • scripts/session_hygiene.pyruns1,892 bytes
  • scripts/session_memory.pyruns4,027 bytes
  • scripts/snapshot_scheduler.pyruns4,692 bytes
  • scripts/sovereignty_check.pyruns5,969 bytes
  • scripts/subscription_actions.pyruns5,568 bytes
  • scripts/subscription_detector.pyruns9,232 bytes
  • scripts/tax_brief.pyruns10,122 bytes
  • scripts/tax_engine.pyruns14,071 bytes
  • scripts/tax_optimizer.pyruns21,217 bytes
  • scripts/tax_scenarios.pyruns7,637 bytes
  • scripts/threshold_alerts.pyruns5,771 bytes
  • scripts/timeline_engine.pyruns23,779 bytes
  • scripts/transaction_logger.pyruns30,230 bytes
  • scripts/transaction_normalizer.pyruns5,199 bytes
  • scripts/transfer_matcher.pyruns13,334 bytes
  • scripts/validate_locale.pyruns9,696 bytes
  • scripts/viz.pyruns12,682 bytes
  • scripts/weekly_digest.pyruns11,750 bytes
  • scripts/whatif_engine.pyruns10,168 bytes
  • scripts/workspace_builder.pyruns16,070 bytes
  • skill.pyruns32,252 bytes
  • tests/__init__.pyruns0 bytes
  • tests/conftest.pyruns3,266 bytes
  • tests/test_account_manager.pyruns6,228 bytes
  • tests/test_accountability_engine.pyruns18,846 bytes
  • tests/test_annual_summary.pyruns19,693 bytes
  • tests/test_audit_log.pyruns2,918 bytes
  • tests/test_backup.pyruns3,081 bytes
  • tests/test_bank_sync.pyruns22,124 bytes
  • tests/test_benchmarks.pyruns8,730 bytes
  • tests/test_budget_engine.pyruns4,840 bytes
  • tests/test_call_signatures.pyruns4,350 bytes
  • tests/test_cashflow_forecast.pyruns13,785 bytes
  • tests/test_chart_builder.pyruns14,155 bytes
  • tests/test_comparison_engine.pyruns9,847 bytes
  • tests/test_currency.pyruns3,309 bytes
  • tests/test_data_coach.pyruns6,575 bytes
  • tests/test_data_safety.pyruns12,102 bytes
  • tests/test_db.pyruns20,343 bytes
  • tests/test_debt_optimizer.pyruns4,036 bytes
  • tests/test_demo_data.pyruns3,027 bytes
  • tests/test_doctor.pyruns844 bytes
  • tests/test_finance_storage.pyruns3,451 bytes
  • tests/test_financial_journal.pyruns7,470 bytes
  • tests/test_goal_tracker.pyruns3,536 bytes
  • tests/test_health_nudge.pyruns1,004 bytes
  • tests/test_household.pyruns13,280 bytes
  • tests/test_import_system.pyruns32,910 bytes
  • tests/test_importers.pyruns8,894 bytes
  • tests/test_insight_engine.pyruns1,509 bytes
  • tests/test_insurance_analyzer.pyruns1,574 bytes
  • tests/test_investment_tracker.pyruns6,576 bytes
  • tests/test_issues_9_10_11.pyruns5,010 bytes
  • tests/test_journeys.pyruns10,514 bytes
  • tests/test_life_events.pyruns4,135 bytes
  • tests/test_llm_import.pyruns4,764 bytes
  • tests/test_locale_de.pyruns3,395 bytes
  • tests/test_locale_telemetry.pyruns1,355 bytes
  • tests/test_mcp_server.pyruns3,937 bytes
  • tests/test_monitor_cap.pyruns1,361 bytes
  • tests/test_monte_carlo.pyruns11,247 bytes
  • tests/test_net_worth_engine.pyruns7,188 bytes
  • tests/test_onboarding.pyruns27,700 bytes
  • tests/test_overdraft_detector.pyruns14,309 bytes
  • tests/test_price_sync.pyruns9,022 bytes
  • tests/test_profile_manager.pyruns2,565 bytes
  • tests/test_receipt_scanner.pyruns13,349 bytes
  • tests/test_recurring_engine.pyruns3,606 bytes
  • tests/test_scenario_engine.pyruns7,980 bytes
  • tests/test_scenario_store.pyruns8,486 bytes
  • tests/test_session_alerts.pyruns7,280 bytes
  • tests/test_session_memory.pyruns4,710 bytes
  • tests/test_sovereignty_check.pyruns821 bytes
  • tests/test_subscription_actions.pyruns2,785 bytes
  • tests/test_subscription_detector.pyruns3,749 bytes
  • tests/test_tax_brief.pyruns3,421 bytes
  • tests/test_tax_engine.pyruns10,455 bytes
  • tests/test_tax_optimizer.pyruns13,178 bytes
  • tests/test_tax_properties.pyruns5,598 bytes
  • tests/test_tax_scenarios.pyruns2,263 bytes
  • tests/test_threshold_alerts.pyruns6,566 bytes
  • tests/test_timeline_engine.pyruns17,543 bytes
  • tests/test_transaction_logger.pyruns12,475 bytes
  • tests/test_transfer_matcher.pyruns13,268 bytes
  • tests/test_v410_all_accounts.pyruns5,045 bytes
  • tests/test_v410_hygiene.pyruns2,879 bytes
  • tests/test_v410_investments.pyruns1,843 bytes
  • tests/test_viz.pyruns11,053 bytes
  • tests/test_voice_lint.pyruns3,151 bytes
  • tests/test_whatif_engine.pyruns7,675 bytes
  • tests/test_workspace_builder.pyruns1,105 bytes

No excerpt is shown for this license. Read the source on GitHub.

View the complete source on GitHub

Skills 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 shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
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

  • Network accessline 1
    [submodule "locales"] 	path = locales 	url = https://github.com/googlarz/finance-assistant-locales.git
  • Network accessline 3
    url = https://github.com/googlarz/finance-assistant-locales.git

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

  • Network accessline 3
    Copyright (c) 2025 Dawid (https://github.com/googlarz/finance-assistant)
  • Network accessline 20
    Full license text: https://creativecommons.org/licenses/by/4.0/legalcode

README.md

  • Network accessline 3
    [![version](https://img.shields.io/badge/version-4.2.3-blue)](https://github.com/googlarz/finance-assistant/releases)
  • Network accessline 4
    [![tests](https://img.shields.io/badge/tests-1%2C630%20passing-brightgreen)](docs/ARCHITECTURE.md#testing)
  • Network accessline 5
    [![tax cases](https://img.shields.io/badge/tax%20law-39%20official%20cases-success)](#locales--validation)
  • Network accessline 6
    [![locales](https://img.shields.io/badge/locales-DE·UK·US·FR·NL·PL·IE-orange)](#locales--validation)
  • Network accessline 7
    [![local-first](https://img.shields.io/badge/local--first-no%20cloud-black)](docs/SECURITY.md)
  • Network accessline 8
    [![license](https://img.shields.io/badge/license-CC%20BY%204.0-lightgrey)](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

  • Network accessline 19
    git clone --recurse-submodules https://github.com/googlarz/finance-assistant.git ~/.claude/skills/finance-assistant
  • Network accessline 28
    Repo: https://github.com/googlarz/finance-assistant

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

  • Network accessline 11
    https://github.com/googlarz/finance-assistant
  • Access to secretsline 28
    [Credential-related source omitted]

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

  • Network accessline 14
    # https://ollama.com
  • Network accessline 31
    Follow the [claude-code-router README](https://github.com/musistudio/claude-code-router) to configure a provider targeting `http://localhost:11434` (Ollama's default). Then launch Claude Code through the router instead of directly.

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 369
    [Credential-related source omitted]
  • Access to secretsline 389
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 111
    [Credential-related source omitted]

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>&#9888; 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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 64
    [Credential-related source omitted]
  • Possible obfuscationline 472
    salt = _b64.b64decode(content["salt"])

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 69
    [Credential-related source omitted]
  • Access to secretsline 70
    [Credential-related source omitted]
  • Access to secretsline 102
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 89
    [Credential-related source omitted]
  • Access to secretsline 90
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 462
    [Credential-related source omitted]
  • Access to secretsline 479
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 30
    assert "<!DOCTYPE html>" in html     assert "</html>" in html     assert "https://cdn.jsdelivr.net/npm/chart.js" in html
  • Network accessline 32
    assert "https://cdn.jsdelivr.net/npm/chart.js" in html

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
Signal confidence: 393 facts

and 343 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativePath .claude/settings.json.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.