Feature map
Where each feature lives. Every route in runway/server/routes.py is listed with its handler, the web app files that call it, the tests that exercise it and the docs page that describes it. The same data, for tools and agents, is in docs/feature-map.json. make feature-map regenerates both; make check and CI fail when they are out of date, or when a route has no test and isn’t on tools/feature_map_allowlist.txt (a list that only shrinks).
189 routes; 27 have no test yet.
A route counts as tested when a file in tests/ names its handler, or calls its address (with its method, when the test writes one). A web app caller is an api( or apiCall( call with a literal address; one built in a variable isn’t seen.
| Route | Handler | Web app | Tests | Docs |
|---|---|---|---|---|
GET /api/backup |
backups.py:api_backup |
- | test_applock.py, test_backup.py, test_http_pinned.py |
start/deployment |
POST /api/backup/inspect |
backups.py:api_backup_inspect |
lib/components/settings/BackupSection.svelte |
test_backup.py, test_http_pinned.py |
start/deployment |
POST /api/restore |
backups.py:api_restore |
lib/components/settings/BackupSection.svelte |
test_backup.py, test_hardening.py, test_http_pinned.py |
start/deployment |
POST /api/sync |
connections.py:api_sync |
lib/app.svelte.ts, lib/components/settings/PlaidLink.svelte, lib/components/settings/SimpleFinSetup.svelte |
test_api_handlers.py, test_http_pinned.py, test_monitoring.py |
using/settings |
POST /api/sync/auto |
connections.py:api_sync_auto |
lib/app.svelte.ts |
test_http_pinned.py, test_http_server.py |
using/settings |
POST /api/investments/sync |
investments.py:api_investments_sync |
- | test_http_pinned.py |
using/investments |
GET /api/investments/stream |
investments.py:api_quote_stream |
lib/components/investments/live.ts |
test_http_pinned.py, test_investments.py |
using/investments |
GET /api/merchants/{id}/logo |
merchants.py:api_merchant_logo_file |
- | test_brands.py, test_categorize.py, test_hardening.py, test_http_pinned.py, test_merchants.py, test_monitoring.py, test_recurring.py |
using/transactions |
GET /api/carta/capture |
equity.py:api_carta_capture |
- | test_http_pinned.py |
using/net-worth |
GET /api/retail/extension.zip |
retail.py:api_extension_zip |
- | test_http_pinned.py |
using/browser-extension |
GET /api/state |
state.py:api_state |
lib/app.svelte.ts |
test_api_handlers.py, test_api_queries.py, test_api_validation.py, test_applock.py, test_backup.py, test_categorize.py, test_churn_found.py, test_finnhub.py, test_http_pinned.py, test_http_server.py, test_mcp.py, test_monitoring.py, test_security.py, test_server.py |
using/overview |
GET /api/overview |
state.py:api_overview |
lib/prefetch.ts, pages/Transactions.svelte |
test_api_handlers.py, test_api_validation.py, test_applock.py, test_categorize.py, test_forecast_cycles.py, test_http_pinned.py, test_http_server.py |
using/overview |
GET /api/accounts |
accounts.py:api_accounts |
lib/accounts.ts |
test_api_contract.py, test_api_handlers.py, test_api_queries.py, test_http_pinned.py, test_routes.py, test_statements.py |
using/settings |
POST /api/accounts/{id} |
accounts.py:api_account_update |
lib/components/settings/AccountRow.svelte, lib/components/settings/LoanTerms.svelte, lib/components/settings/PlaidLink.svelte, pages/NetWorth.svelte |
test_api_handlers.py, test_api_validation.py, test_mcp.py, test_networth.py |
using/settings |
GET /api/accounts/{id}/logo-options |
accounts.py:api_account_logo_options |
- | test_brands.py |
using/settings |
POST /api/accounts/{id}/logo |
accounts.py:api_account_logo |
- | test_brands.py, test_mcp.py |
using/settings |
POST /api/accounts/{id}/statements |
accounts.py:api_statement_add |
lib/components/settings/CardStatement.svelte |
test_statements.py |
using/settings |
POST /api/accounts/{id}/statements/{id}/remove |
accounts.py:api_statement_remove |
lib/components/settings/CardStatement.svelte |
test_routes.py, test_statements.py |
using/settings |
GET /api/accounts/{id}/removal |
accounts.py:api_account_removal |
lib/components/settings/AccountRow.svelte |
test_deleted_accounts.py |
using/settings |
POST /api/accounts/{id}/remove |
accounts.py:api_account_remove |
lib/components/settings/AccountRow.svelte |
test_deleted_accounts.py, test_mcp.py |
using/settings |
GET /api/accounts/deleted |
accounts.py:api_accounts_deleted |
lib/components/settings/AccountsSection.svelte |
test_deleted_accounts.py, test_routes.py |
using/settings |
POST /api/accounts/{id}/restore |
accounts.py:api_account_restore |
lib/components/settings/AccountsSection.svelte |
test_deleted_accounts.py, test_mcp.py |
using/settings |
GET /api/transactions |
transactions.py:api_transactions |
lib/components/overview/ThisMonth.svelte, lib/components/recurring/RecurringItem.svelte, lib/components/transactions/txList.svelte.ts |
test_api_contract.py, test_api_handlers.py, test_api_validation.py, test_applock.py, test_categorize.py, test_merchants.py, test_retail.py, test_routes.py, test_search.py, test_security.py, test_server_errors.py, test_splits.py, test_tx_edits.py |
using/transactions |
POST /api/transactions |
transactions.py:api_tx_create |
lib/components/transactions/TxAdd.svelte |
test_api_contract.py, test_api_validation.py, test_mcp.py, test_routes.py, test_server_errors.py, test_tx_edits.py |
using/transactions |
POST /api/transactions/bulk |
transactions.py:api_tx_bulk |
lib/components/transactions/ReviewGroups.svelte, lib/components/transactions/TxTable.svelte, lib/components/transactions/restore.ts, lib/components/transactions/review.svelte.ts |
test_api_validation.py, test_bulk.py, test_categorize.py, test_mcp.py, test_retail.py, test_routes.py, test_rules.py, test_splits.py, test_tx_edits.py |
using/transactions |
POST /api/transactions/bulk-delete |
transactions.py:api_tx_bulk_delete |
lib/components/transactions/TxTable.svelte |
test_api_contract.py, test_forecast_deleted.py, test_mcp.py, test_tx_edits.py |
using/transactions |
POST /api/transactions/import |
transactions.py:api_tx_import |
- | test_mcp.py, test_tx_edits.py |
using/transactions |
POST /api/transactions/{id}/category |
transactions.py:api_tx_category |
lib/components/transactions/remember.svelte.ts, pages/Transactions.svelte |
test_api_validation.py, test_bulk.py, test_monitoring.py, test_retail.py, test_splits.py |
using/transactions |
POST /api/transactions/{id}/accept |
transactions.py:api_tx_accept |
pages/Transactions.svelte |
test_rules.py |
using/transactions |
POST /api/transactions/{id}/split |
transactions.py:api_tx_split |
lib/components/transactions/SplitEditor.svelte |
none (allowed) | using/transactions |
POST /api/transactions/{id}/name |
transactions.py:api_tx_brand_name |
lib/components/transactions/TxDetail.svelte |
test_categorize.py |
using/transactions |
POST /api/transactions/{id}/recurring |
recurring.py:api_tx_recurring |
lib/components/recurring/LinkPicker.svelte, lib/components/transactions/RecurringPicker.svelte |
test_api_validation.py, test_categories_recurring_pinned.py, test_recurring.py |
using/transactions |
POST /api/transactions/{id} |
transactions.py:api_tx_update |
lib/components/transactions/TxDetail.svelte |
test_tx_edits.py |
using/transactions |
DELETE /api/transactions/{id} |
transactions.py:api_tx_delete |
lib/components/transactions/TxAdd.svelte, lib/components/transactions/TxDelete.svelte |
test_api_contract.py, test_forecast_deleted.py, test_tx_edits.py |
using/transactions |
POST /api/overrides |
state.py:api_override_set |
lib/components/MissedAlert.svelte, lib/components/overview/CardsTable.svelte, lib/components/overview/EventsList.svelte, lib/components/recurring/RecurringItem.svelte |
test_api_handlers.py, test_api_validation.py, test_recurring.py |
using/overview |
DELETE /api/overrides |
state.py:api_override_delete |
lib/components/MissedAlert.svelte, lib/components/overview/CardsTable.svelte, lib/components/overview/EventsList.svelte, lib/components/recurring/RecurringItem.svelte |
test_api_handlers.py, test_mcp.py, test_recurring.py |
using/overview |
GET /api/push |
notifications.py:api_push |
lib/components/settings/NotificationsSection.svelte |
test_api_handlers.py, test_mcp.py, test_notify.py |
using/settings |
POST /api/push/subscribe |
notifications.py:api_push_subscribe |
lib/components/settings/NotificationsSection.svelte |
none (allowed) | using/settings |
POST /api/push/unsubscribe |
notifications.py:api_push_unsubscribe |
lib/components/settings/NotificationsSection.svelte |
test_notify.py |
using/settings |
POST /api/push/prefs |
notifications.py:api_push_prefs |
lib/components/settings/NotificationsSection.svelte |
test_notify.py |
using/settings |
POST /api/push/test |
notifications.py:api_push_test |
lib/components/settings/NotificationsSection.svelte |
test_mcp.py, test_notify.py, test_routes.py |
using/settings |
GET /api/lock |
lock.py:api_lock |
lib/components/settings/AppLockCard.svelte |
test_api_contract.py, test_applock.py, test_mcp.py |
contributing/development, reference/architecture |
POST /api/lock/challenge |
lock.py:api_lock_challenge |
lib/components/settings/AppLockCard.svelte, lib/lock.svelte.ts |
test_api_contract.py, test_applock.py |
start/deployment |
POST /api/lock/register |
lock.py:api_lock_register |
lib/components/settings/AppLockCard.svelte |
test_api_contract.py, test_applock.py, test_mcp.py |
start/deployment |
POST /api/lock/unlock |
lock.py:api_lock_unlock |
lib/lock.svelte.ts |
test_api_contract.py, test_applock.py, test_mcp.py |
start/deployment |
POST /api/lock/engage |
lock.py:api_lock_engage |
lib/lock.svelte.ts |
test_api_contract.py, test_applock.py, test_mcp.py |
start/deployment |
POST /api/lock/settings |
lock.py:api_lock_settings |
lib/components/settings/AppLockCard.svelte |
test_api_contract.py, test_applock.py |
start/deployment |
POST /api/lock/key-share |
lock.py:api_lock_key_share |
lib/deviceCache.ts |
test_api_contract.py, test_applock.py |
contributing/development, reference/architecture |
DELETE /api/lock |
lock.py:api_lock_off |
lib/components/settings/AppLockCard.svelte |
test_api_contract.py, test_applock.py, test_mcp.py |
contributing/development, reference/architecture |
GET /api/budget |
budget.py:api_budget |
lib/components/budget/BudgetView.svelte, lib/components/overview/ThisMonth.svelte |
test_api_contract.py, test_api_handlers.py, test_budget_months.py, test_categorize.py, test_forecast_schedule.py, test_http_server.py, test_routes.py, test_splits.py |
using/budget |
POST /api/budget |
budget.py:api_budget_set |
lib/components/budget/BudgetRow.svelte, lib/components/budget/BudgetSuggest.svelte, lib/components/budget/BudgetView.svelte |
test_api_contract.py, test_api_handlers.py, test_api_validation.py, test_budget_months.py, test_categorize.py, test_http_server.py, test_routes.py |
using/budget |
GET /api/budget/suggestions |
budget_suggest.py:api_budget_suggestions |
lib/components/budget/BudgetSuggest.svelte |
test_api_contract.py, test_budget_suggest.py |
using/budget |
POST /api/ai/suggest |
transactions.py:api_ai_suggest |
lib/components/transactions/AiSuggest.svelte |
none (allowed) | using/transactions |
POST /api/ai/apply |
transactions.py:api_ai_apply |
lib/components/transactions/AiSuggest.svelte |
test_api_handlers.py, test_api_validation.py, test_bulk.py, test_mcp.py, test_networth.py, test_rules.py |
using/transactions |
GET /api/ai/log |
transactions.py:api_ai_log |
lib/components/transactions/AiLog.svelte, lib/components/transactions/AiLogTable.svelte |
test_api_handlers.py |
using/transactions |
GET /api/categories |
categories.py:api_categories |
lib/categories.svelte.ts |
test_bulk.py, test_categories_recurring_pinned.py, test_http_pinned.py, test_security.py, test_server.py, test_server_errors.py |
using/transactions |
POST /api/categories |
categories.py:api_category_add |
lib/components/settings/CategoryRow.svelte, lib/components/settings/categories.ts |
test_api_validation.py, test_applock.py, test_http_server.py, test_server.py, test_server_errors.py |
using/transactions |
POST /api/categories/rename |
categories.py:api_category_rename |
lib/components/settings/CategoryRow.svelte |
test_api_validation.py |
using/transactions |
POST /api/categories/remove |
categories.py:api_category_remove |
lib/components/settings/CategoryRow.svelte |
test_api_validation.py, test_http_server.py, test_mcp.py |
using/transactions |
POST /api/categories/move |
categories.py:api_category_move |
lib/components/settings/CategoryRow.svelte |
test_api_validation.py |
using/transactions |
POST /api/categories/look |
categories.py:api_category_look |
lib/components/settings/CategoryRow.svelte, lib/components/settings/LookPicker.svelte |
test_mcp_protocol.py |
using/transactions |
POST /api/categories/pay-with |
categories.py:api_category_pay_with |
lib/components/settings/CategoryRow.svelte |
test_categories_recurring_pinned.py |
using/transactions |
GET /api/cashflow |
reports.py:api_cashflow |
lib/components/reports/Cashflow.svelte |
test_categorize.py, test_http_server.py, test_routes.py, test_splits.py |
using/overview |
GET /api/month_pace |
reports.py:api_month_pace |
lib/components/overview/ThisMonth.svelte |
none (allowed) | using/overview |
GET /api/reports/spending |
reports.py:api_report_spending |
lib/components/reports/Trends.svelte |
test_routes.py |
using/reports |
GET /api/reports/income |
reports.py:api_report_income |
lib/components/reports/Income.svelte |
test_api_validation.py |
using/reports |
GET /api/reports/merchants |
reports.py:api_report_merchants |
lib/components/reports/Merchants.svelte |
test_reports.py |
using/reports |
GET /api/reports/merchant |
reports.py:api_report_merchant |
lib/components/reports/MerchantDetail.svelte |
test_routes.py |
using/reports |
GET /api/reports/breakdown |
reports.py:api_report_breakdown |
lib/components/reports/Breakdown.svelte |
test_api_validation.py |
using/reports |
GET /api/reports/transactions |
reports.py:api_report_transactions |
lib/components/reports/Breakdown.svelte |
none (allowed) | using/reports |
GET /api/rules |
categories.py:api_rules |
pages/Settings.svelte |
test_categories_recurring_pinned.py, test_http_server.py, test_mcp_protocol.py |
using/transactions |
POST /api/rules |
categories.py:api_rule_add |
lib/components/settings/RuleEditor.svelte, lib/components/settings/RulesSection.svelte |
test_api_validation.py, test_http_server.py, test_splits.py |
using/transactions |
POST /api/rules/preview |
categories.py:api_rule_preview |
lib/components/settings/RuleEditor.svelte, lib/components/settings/ruleApply.svelte.ts |
none (allowed) | using/transactions |
DELETE /api/rules/{id} |
categories.py:api_rule_delete |
lib/components/settings/RulesSection.svelte |
test_api_validation.py, test_categories_recurring_pinned.py, test_mcp.py |
using/transactions |
POST /api/rules/{id} |
categories.py:api_rule_update |
lib/components/settings/RuleEditor.svelte |
test_http_server.py, test_mcp.py |
using/transactions |
POST /api/rules/{id}/apply |
categories.py:api_rule_apply |
lib/components/settings/ruleApply.svelte.ts |
test_bulk.py, test_http_server.py, test_mcp.py |
using/transactions |
GET /api/recurring |
recurring.py:api_recurring |
lib/components/recurring/RecurringItem.svelte, lib/components/recurring/load.ts |
test_api_queries.py, test_categories_recurring_pinned.py, test_categorize.py, test_recurring.py, test_recurring_suggestions.py |
using/recurring |
POST /api/recurring |
recurring.py:api_recurring_add |
lib/components/recurring/RecurringView.svelte |
test_api_validation.py, test_categories_recurring_pinned.py, test_forecast_schedule.py, test_http_server.py, test_recurring.py, test_recurring_suggestions.py |
using/recurring |
GET /api/recurring/suggestions |
recurring.py:api_recurring_suggestions |
lib/components/recurring/RecurringView.svelte |
test_recurring_suggestions.py |
using/recurring |
POST /api/recurring/suggestions/dismiss |
recurring.py:api_recurring_suggestion_dismiss |
lib/components/recurring/RecurringView.svelte |
test_recurring_suggestions.py |
using/recurring |
GET /api/recurring/suggestions/dismissed |
recurring.py:api_recurring_suggestions_dismissed |
lib/components/recurring/RecurringView.svelte |
test_recurring_suggestions.py |
using/recurring |
POST /api/recurring/suggestions/restore |
recurring.py:api_recurring_suggestion_restore |
lib/components/recurring/RecurringView.svelte |
test_recurring_suggestions.py |
using/recurring |
GET /api/recurring/missed |
recurring.py:api_recurring_missed |
- | none (allowed) | using/recurring |
POST /api/recurring/dismiss |
recurring.py:api_recurring_dismiss |
lib/components/recurring/LinkPicker.svelte |
test_api_validation.py, test_categories_recurring_pinned.py, test_mcp.py |
using/recurring |
POST /api/recurring/preview |
recurring.py:api_recurring_preview |
lib/components/recurring/RecurringPreview.svelte |
test_categories_recurring_pinned.py |
using/recurring |
POST /api/recurring/{id}/match |
recurring.py:api_recurring_add_text |
lib/components/recurring/LinkPicker.svelte, lib/components/transactions/remember.svelte.ts |
test_recurring.py |
using/recurring |
GET /api/recurring/{id}/candidates |
recurring.py:api_recurring_candidates |
lib/components/recurring/LinkPicker.svelte |
test_recurring.py |
using/recurring |
POST /api/recurring/{id}/amount |
recurring.py:api_recurring_amount |
lib/components/overview/EventsList.svelte |
test_recurring.py |
using/recurring |
POST /api/recurring/{id}/skip-missed |
recurring.py:api_recurring_skip_missed |
lib/components/recurring/MissedGroup.svelte |
test_mcp.py, test_recurring.py |
using/recurring |
POST /api/recurring/{id}/end |
recurring.py:api_recurring_end |
lib/components/recurring/MissedGroup.svelte |
test_mcp.py, test_recurring.py |
using/recurring |
POST /api/recurring/{id} |
recurring.py:api_recurring_update |
lib/components/recurring/RecurringItem.svelte |
test_api_validation.py, test_categories_recurring_pinned.py, test_recurring.py |
using/recurring |
DELETE /api/recurring/{id} |
recurring.py:api_recurring_delete |
lib/components/recurring/RecurringItem.svelte, lib/components/recurring/RecurringView.svelte |
test_api_validation.py, test_categories_recurring_pinned.py, test_recurring.py |
using/recurring |
POST /api/connect |
connections.py:api_connect |
lib/components/settings/SimpleFinSetup.svelte |
test_mcp.py |
using/settings |
GET /api/plaid/status |
connections.py:api_plaid_status |
lib/components/investments/InvestmentsView.svelte, lib/components/settings/AccountsSection.svelte, lib/components/settings/PlaidCard.svelte |
test_plaidbank.py |
using/settings |
POST /api/plaid/settings |
connections.py:api_plaid_settings |
lib/components/settings/PlaidKeys.svelte |
none (allowed) | using/settings |
POST /api/plaid/link_token |
connections.py:api_plaid_link_token |
lib/components/settings/plaid.svelte.ts |
test_plaidbank.py |
using/settings |
POST /api/plaid/exchange |
connections.py:api_plaid_exchange |
lib/components/settings/plaid.svelte.ts |
test_investments.py |
using/settings |
POST /api/plaid/items/{id}/sync |
connections.py:api_plaid_item_sync |
lib/components/settings/PlaidItemRow.svelte, lib/components/settings/plaid.svelte.ts |
test_plaidbank.py |
using/settings |
POST /api/plaid/items/{id}/remove |
connections.py:api_plaid_item_remove |
lib/components/settings/PlaidItemRow.svelte |
test_mcp.py |
using/settings |
POST /api/plaid/items/{id}/refresh |
connections.py:api_plaid_item_refresh |
lib/components/settings/PlaidItemRow.svelte |
test_api_contract.py, test_plaidbank.py |
using/settings |
POST /api/plaid/match |
connections.py:api_plaid_match |
lib/components/settings/plaid.svelte.ts |
test_plaidbank.py |
using/settings |
GET /api/plaid/oauth_resume |
connections.py:api_plaid_oauth_resume |
lib/components/settings/plaid.svelte.ts |
test_plaidbank.py |
using/settings |
GET /api/investments |
investments.py:api_investments |
lib/components/investments/InvestmentsView.svelte, lib/components/networth/RetirementView.svelte |
none (allowed) | using/investments |
GET /api/investments/summary |
investments.py:api_investments_summary |
lib/components/overview/InvestmentsCard.svelte |
test_api_contract.py, test_investments.py |
using/investments |
GET /api/investments/holding/{id} |
investments.py:api_investments_holding |
lib/components/investments/HoldingDetail.svelte |
test_api_contract.py, test_investments.py |
using/investments |
GET /api/networth |
networth.py:api_networth |
lib/components/overview/SummaryTiles.svelte, pages/NetWorth.svelte |
test_networth.py |
using/net-worth |
POST /api/assets |
networth.py:api_asset_add |
lib/components/networth/AssetForm.svelte |
none (allowed) | using/net-worth |
POST /api/assets/{id} |
networth.py:api_asset_update |
lib/components/networth/AssetCard.svelte, lib/components/networth/AssetForm.svelte |
test_networth.py |
using/net-worth |
POST /api/assets/{id}/remove |
networth.py:api_asset_remove |
lib/components/networth/AssetCard.svelte |
none (allowed) | using/net-worth |
POST /api/assets/{id}/refresh |
networth.py:api_asset_refresh |
lib/components/networth/AssetCard.svelte |
test_routes.py |
using/net-worth |
POST /api/realie/settings |
networth.py:api_realie_settings |
lib/components/settings/HomeValuesCard.svelte |
test_mcp.py |
using/net-worth |
POST /api/finnhub/settings |
investments.py:api_finnhub_settings |
lib/components/settings/FinnhubCard.svelte |
test_finnhub.py, test_mcp.py |
using/investments |
GET /api/finnhub/status |
investments.py:api_finnhub_status |
lib/components/settings/FinnhubCard.svelte |
test_finnhub.py |
using/investments |
POST /api/logodev/settings |
merchants.py:api_logodev_settings |
lib/components/settings/LogoDevCard.svelte |
test_merchants.py |
using/transactions |
GET /api/logodev/status |
merchants.py:api_logodev_status |
lib/components/settings/LogoDevCard.svelte |
none (allowed) | using/transactions |
GET /api/merchants/logo-options |
merchants.py:api_merchant_logo_options |
- | test_api_validation.py |
using/transactions |
POST /api/merchants/logo |
merchants.py:api_merchant_logo |
- | test_api_validation.py, test_mcp.py |
using/transactions |
GET /api/investments/logo-options |
merchants.py:api_holding_logo_options |
- | test_merchants.py |
using/investments |
POST /api/investments/logo |
merchants.py:api_holding_logo |
- | test_mcp.py, test_merchants.py |
using/investments |
POST /api/logodev/fetch |
merchants.py:api_logodev_fetch |
lib/components/settings/LogoDevCard.svelte |
test_mcp.py |
using/transactions |
GET /api/investments/live |
investments.py:api_live_quotes |
lib/components/investments/live.ts |
test_routes.py |
using/investments |
POST /api/investments/plan |
investments.py:api_plan_save |
lib/components/investments/RetirementPlanner.svelte |
none (allowed) | using/investments |
GET /api/tracked/{id} |
investments.py:api_tracked_get |
lib/components/investments/TrackedEditor.svelte |
test_simplefin_invest.py |
using/investments |
POST /api/tracked/{id} |
investments.py:api_tracked_save |
lib/components/investments/TrackedEditor.svelte |
none (allowed) | using/investments |
POST /api/investments/cost |
investments.py:api_cost_basis |
lib/components/investments/CostBasisEditor.svelte |
test_simplefin_invest.py |
using/investments |
POST /api/settings |
state.py:api_settings |
lib/components/overview/ForecastSettings.svelte, lib/components/overview/SetupChecklist.svelte, lib/components/settings/AccountRow.svelte, lib/components/settings/AiCard.svelte, pages/Overview.svelte |
test_api_handlers.py, test_api_validation.py, test_categorize.py, test_churn_found.py, test_http_pinned.py, test_http_server.py, test_mcp.py, test_security.py |
using/settings |
GET /api/equity |
equity.py:api_equity |
lib/components/networth/EquityView.svelte, lib/components/settings/CartaCard.svelte |
none (allowed) | using/net-worth |
POST /api/equity/companies |
equity.py:api_equity_company_add |
lib/components/networth/EquityView.svelte |
none (allowed) | using/net-worth |
POST /api/equity/companies/{id} |
equity.py:api_equity_company_update |
- | none (allowed) | using/net-worth |
POST /api/equity/companies/{id}/remove |
equity.py:api_equity_company_remove |
- | none (allowed) | using/net-worth |
POST /api/equity/companies/{id}/grants |
equity.py:api_equity_grant_add |
lib/components/networth/EquityView.svelte |
none (allowed) | using/net-worth |
POST /api/equity/grants/{id} |
equity.py:api_equity_grant_update |
lib/components/networth/EquityView.svelte |
none (allowed) | using/net-worth |
POST /api/equity/grants/{id}/remove |
equity.py:api_equity_grant_remove |
- | none (allowed) | using/net-worth |
GET /api/churning |
churning.py:api_churning |
pages/Churning.svelte |
test_churning_api.py, test_mcp.py |
using/churning |
GET /api/churning/best |
churning.py:api_churning_best |
- | test_churning_api.py |
using/churning |
GET /api/churning/found |
churning.py:api_churning_found |
pages/Churning.svelte |
test_churn_found.py |
using/churning |
POST /api/churning/found/{id}/dismiss |
churning.py:api_churn_found_dismiss |
- | test_churn_found.py |
using/churning |
POST /api/churning/found/{id}/undismiss |
churning.py:api_churn_found_undismiss |
- | test_churn_found.py |
using/churning |
POST /api/churning/suggest |
churning.py:api_churn_suggest |
lib/components/churning/cardSuggest.svelte.ts |
test_churn_found.py |
using/churning |
POST /api/churning/cards |
churning.py:api_churn_card_add |
lib/components/churning/CardForm.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/cards/{id} |
churning.py:api_churn_card_update |
lib/components/churning/CardForm.svelte, lib/components/churning/cardSuggest.svelte.ts |
test_churning_api.py |
using/churning |
POST /api/churning/cards/{id}/remove |
churning.py:api_churn_card_remove |
lib/components/churning/CardForm.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/cards/{id}/rates |
churning.py:api_churn_rate |
- | test_churning_api.py |
using/churning |
POST /api/churning/cards/{id}/plan/done |
churning.py:api_churn_plan_done |
- | test_churning_api.py |
using/churning |
POST /api/churning/cards/{id}/plan/undo |
churning.py:api_churn_plan_undo |
- | test_churning_api.py |
using/churning |
POST /api/churning/cards/{id}/benefits |
churning.py:api_churn_benefit_add |
lib/components/churning/BenefitForm.svelte, lib/components/churning/CardBenefits.svelte, lib/components/churning/cardSuggest.svelte.ts |
test_churning_api.py |
using/churning |
POST /api/churning/benefits/{id} |
churning.py:api_churn_benefit_update |
lib/components/churning/BenefitForm.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/benefits/{id}/remove |
churning.py:api_churn_benefit_remove |
lib/components/churning/BenefitForm.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/benefits/{id}/use |
churning.py:api_churn_benefit_use |
- | test_churning_api.py |
using/churning |
POST /api/churning/benefits/{id}/unuse |
churning.py:api_churn_benefit_unuse |
- | test_churning_api.py |
using/churning |
POST /api/churning/currencies |
churning.py:api_churn_currency |
lib/components/churning/Rewards.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/currencies/{id}/remove |
churning.py:api_churn_currency_remove |
lib/components/churning/Rewards.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/balances |
churning.py:api_churn_balance |
lib/components/churning/Rewards.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/tasks |
churning.py:api_churn_task_add |
lib/components/churning/Upcoming.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/tasks/{id} |
churning.py:api_churn_task_update |
- | test_churning_api.py |
using/churning |
POST /api/churning/tasks/{id}/remove |
churning.py:api_churn_task_remove |
- | test_churning_api.py |
using/churning |
POST /api/churning/tasks/{id}/snooze |
churning.py:api_churn_task_snooze |
- | test_churning_api.py |
using/churning |
POST /api/churning/wishlist |
churning.py:api_churn_wish_add |
lib/components/churning/WishForm.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/wishlist/{id} |
churning.py:api_churn_wish_update |
lib/components/churning/Planned.svelte, lib/components/churning/WishForm.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/wishlist/{id}/remove |
churning.py:api_churn_wish_remove |
lib/components/churning/Planned.svelte, lib/components/churning/WishForm.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/wishlist/{id}/applied |
churning.py:api_churn_wish_applied |
lib/components/churning/Planned.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/scores |
churning.py:api_churn_score |
lib/components/churning/Planned.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/bank |
churning.py:api_bank_bonus_add |
lib/components/churning/BankForm.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/bank/{id} |
churning.py:api_bank_bonus_update |
lib/components/churning/BankForm.svelte |
test_churning_api.py |
using/churning |
POST /api/churning/bank/{id}/remove |
churning.py:api_bank_bonus_remove |
lib/components/churning/BankForm.svelte |
test_churning_api.py |
using/churning |
POST /api/carta/settings |
equity.py:api_carta_settings |
lib/components/settings/CartaCard.svelte |
none (allowed) | using/net-worth |
POST /api/carta/connect |
equity.py:api_carta_connect |
lib/components/settings/CartaCard.svelte |
test_mcp.py |
using/net-worth |
POST /api/carta/sync |
equity.py:api_carta_sync |
lib/components/networth/EquityView.svelte, lib/components/settings/CartaCard.svelte |
test_routes.py |
using/net-worth |
POST /api/carta/disconnect |
equity.py:api_carta_disconnect |
lib/components/settings/CartaCard.svelte |
none (allowed) | using/net-worth |
GET /api/retail |
retail.py:api_retail |
lib/components/settings/RetailCard.svelte |
test_retail.py, test_retail_tokens.py |
using/browser-extension |
GET /api/mcp-settings |
mcp.py:api_mcp_settings |
lib/components/settings/McpCard.svelte |
test_mcp.py |
using/mcp |
POST /api/mcp-settings/writes |
mcp.py:api_mcp_writes |
lib/components/settings/McpCard.svelte |
test_api_validation.py, test_mcp.py |
using/mcp |
POST /api/mcp-settings/categorize |
mcp.py:api_mcp_categorize |
lib/components/settings/McpCard.svelte |
test_api_validation.py, test_mcp.py |
using/mcp |
POST /api/mcp-settings/all |
mcp.py:api_mcp_all |
lib/components/settings/McpCard.svelte |
test_api_validation.py, test_mcp.py, test_mcp_protocol.py |
using/mcp |
POST /api/mcp-settings/connections/{id}/revoke |
mcp.py:api_mcp_revoke |
lib/components/settings/McpCard.svelte |
test_api_validation.py, test_mcp.py |
using/mcp |
POST /api/retail/token |
retail.py:api_retail_token |
lib/components/settings/RetailCard.svelte |
test_mcp.py, test_retail_tokens.py |
using/browser-extension |
POST /api/retail/token/remove |
retail.py:api_retail_token_remove |
lib/components/settings/RetailCard.svelte |
test_mcp.py, test_retail_tokens.py |
using/browser-extension |
POST /api/retail/settings |
retail.py:api_retail_settings |
lib/components/settings/RetailCard.svelte |
test_mcp.py |
using/browser-extension |
POST /api/retail/match |
retail.py:api_retail_match |
lib/components/settings/RetailCard.svelte |
test_mcp.py |
using/browser-extension |
GET /api/retail/orders/{id} |
retail.py:api_retail_order |
lib/components/orders/OrderDetail.svelte |
none (allowed) | using/browser-extension |
POST /api/retail/items/{id} |
retail.py:api_retail_item |
lib/components/orders/OrderDetail.svelte |
test_retail.py, test_retail_stores.py |
using/browser-extension |
POST /api/retail/items/{id}/restore |
retail.py:api_retail_item_restore |
- | test_mcp.py, test_retail.py |
using/browser-extension |
POST /api/retail/orders/{id}/suggest |
retail.py:api_retail_suggest |
lib/components/orders/OrderDetail.svelte |
none (allowed) | using/browser-extension |
POST /api/retail/charges/{id}/unlink |
retail.py:api_retail_unlink |
- | test_retail.py |
using/browser-extension |
POST /api/retail/charges/{id}/link |
retail.py:api_retail_link |
- | none (allowed) | using/browser-extension |
POST /api/retail/charges/{id}/apply |
retail.py:api_retail_apply |
- | test_retail.py |
using/browser-extension |
POST /api/retail/charges/{id}/restore |
retail.py:api_retail_charge_restore |
- | test_retail.py |
using/browser-extension |
GET /api/retail/charges/{id}/candidates |
retail.py:api_retail_candidates |
- | none (allowed) | using/browser-extension |
POST /api/recategorize |
transactions.py:api_recategorize |
- | test_api_handlers.py, test_mcp.py |
using/transactions |