Fresh start detected

Run the setup wizard to add your starting balances, monthly target, and starter budgets.

{{ demoWorkspaceActive ? 'Demo workspace active' : 'Want a fully populated walkthrough?' }}

{{ demoWorkspaceActive ? 'You are viewing realistic demo transactions, budgets, goals, bills, and receipt gallery data. Reset it anytime or switch to your own setup.' : 'Load a realistic 3-month finance dataset instantly, or skip straight to your own starter setup.' }}

{{ toast.message }}
โœจ
AI Insight
Analyzing spending patterns...
{{ aiInsight }}
Income ({{ currentMonth }})
{{ monthlyDelta.income.direction === 'up' ? 'โ†‘' : monthlyDelta.income.direction === 'down' ? 'โ†“' : 'โ†’' }} {{ Math.abs(monthlyDelta.income.delta).toFixed(1) }}%
{{ formatCurrency(monthlyIncome) }}
Expenses ({{ currentMonth }})
{{ monthlyDelta.expenses.direction === 'up' ? 'โ†‘' : monthlyDelta.expenses.direction === 'down' ? 'โ†“' : 'โ†’' }} {{ Math.abs(monthlyDelta.expenses.delta).toFixed(1) }}%
{{ formatCurrency(monthlyExpenses) }}
Net Worth
{{ formatSignedPercent(((netWorthHistory[netWorthHistory.length - 1]?.value || 0) - (netWorthHistory[netWorthHistory.length - 2]?.value || 0)) / Math.max(Math.abs(netWorthHistory[netWorthHistory.length - 2]?.value || 1), 1) * 100, 1) }}
{{ formatCurrency(netWorth) }}
Savings Rate
{{ formatSignedPercent(savingsRateTrend.delta, 1) }}
{{ formatPercent(savingsRateTrend.currentRate, 1) }}
{{ formatCurrency(savingsRateTrend.currentSavings) }} net saved

โšก Spending Velocity

{{ formatCurrency(spendingVelocity.projectedSpend) }}

On pace to spend {{ formatCurrency(spendingVelocity.projectedSpend) }} this month.

{{ spendingVelocity.state === 'over' ? 'Over budget pace by' : spendingVelocity.state === 'under' ? 'Under budget pace by' : 'Almost exactly on budget pace at' }} {{ formatCurrency(Math.abs(spendingVelocity.variance)) }}.

Days elapsed {{ formatPercent(budgetBurnDown.daysElapsedPct, 0) }}
Budget consumed {{ formatPercent(budgetBurnDown.budgetConsumedPct, 0) }}

๐Ÿ’ธ Cash Flow Forecast

{{ formatCurrency(cashFlowForecast.projectedNet) }}

Projected month-end balance: {{ formatCurrency(cashFlowForecast.predictedEndBalance) }}

Projected income {{ formatCurrency(cashFlowForecast.projectedIncome) }}
Projected outflow {{ formatCurrency(cashFlowForecast.projectedExpenses) }}

Income trend {{ formatSignedPercent(incomeTrend.change, 1) }} month-over-month.

๐Ÿ” Recurring Projection

{{ recurringExpenseProjection.count }} items

Recurring expenses project to {{ formatCurrency(recurringExpenseProjection.monthlyProjected) }} / month.

{{ formatCurrency(recurringExpenseProjection.next30DaysProjected) }} due in the next 30 days.

{{ item.description }} {{ formatCurrency(item.amount) }}

๐Ÿ†š Comparison Summary

{{ comparisonSummary.comparisonLabel }}
{{ row.label }}
{{ formatCurrency(row.current) }} {{ formatSignedPercent(row.change, 1) }}

YoY reference: {{ comparisonSummary.yoyLabel }}

Accounts

๐Ÿฆ

No starter accounts yet

Use the setup wizard to add your opening balances.

Top Spending ({{ currentMonth }})

{{ cat.emoji }} {{ cat.name }} {{ cat.insightBadge }}
{{ formatCurrency(cat.total) }}
Budget {{ formatPercent(cat.budgetUsage, 0) }} used

๐Ÿ’ฐ Income Projection

{{ formatPercent(incomeProjection.percentToTarget, 0) }} of target
Actual This Month {{ formatCurrency(incomeProjection.actualThisMonth) }}
Recurring Income {{ formatCurrency(incomeProjection.recurringMonthly) }}
Total Projected {{ formatCurrency(incomeProjection.total) }}
Monthly Target {{ formatCurrency(incomeProjection.target) }}
{{ formatCurrency(incomeProjection.remainingToTarget) }} needed to reach target

โฐ Bills Due Soon

{{ dueAlerts.overdue.length }} overdue
๐Ÿ”ด
{{ bill.description }}
OVERDUE ยท {{ formatCurrency(bill.amount) }}
๐ŸŸก
{{ bill.description }}
Due {{ formatDate(bill.dueDate) }} ยท {{ formatCurrency(bill.amount) }}
{{ formatCurrency(dueAlerts.totalDueSoon) }} total due in next 7 days โ€ข {{ formatCurrency(dueAlerts.totalOverdue) }} overdue
{{ txn.description }}
{{ formatDate(txn.date) }}
{{ txn.type === 'expense' ? '-' : '+' }}{{ formatCurrency(Math.abs(txn.amount)) }}

Date Range

โ†’

Type

Account

Category

Tags

{{ filteredTransactions.length }} result{{ filteredTransactions.length !== 1 ? 's' : '' }}
๐Ÿ“ญ

No transactions found

Try adjusting your filters

โŸณ
Refreshing...
๐Ÿ‘† Swipe left to delete, right for menu
โ†• Pull down from the top to refresh
{{ formatDate(group.date) }}
{{ txn.description }}
{{ categories.find(c => c.id === txn.category)?.emoji }} {{ categories.find(c => c.id === txn.category)?.name }} โ€ข {{ accounts.find(a => a.id === txn.account)?.name }}
๐Ÿท๏ธ {{ tag }}
{{ txn.type === 'expense' ? '-' : '+' }}{{ formatCurrency(Math.abs(txn.amount)) }}
{{ currentMonth }}
๐Ÿ’ก
Smart Budget Suggestions
Based on your last 3 months of spending (average + 20% buffer)
{{ budget.emoji }} {{ budget.name }} {{ formatCurrency(budget.spent) }} / {{ formatCurrency(budget.limit) }}
Suggested: {{ formatCurrency(suggestedBudgets[budget.categoryId]) }}
โœ“ {{ formatCurrency(budget.limit - suggestedBudgets[budget.categoryId]) }} above suggestion โ†“ {{ formatCurrency(suggestedBudgets[budget.categoryId] - budget.limit) }} below suggestion
{{ egoal.name }} {{ formatCurrency(egoal.current) }} / {{ formatCurrency(egoal.target) }}
{{ Math.round(egoal.progress) }}%
{{ milestone.percent }}%

Target: {{ formatDate(egoal.targetDate) }}

Monthly: {{ formatCurrency(egoal.monthlyContribution) }}

โœ“ On track - {{ Math.round(egoal.projectedDaysToGoal) }} days to goal โš  Behind - {{ Math.round(egoal.projectedDaysToGoal) }} days projected

๐Ÿ”ฅ {{ egoal.streak }} week streak

๐Ÿง  Financial Intelligence

Phase 8 layer
Income Growth
{{ formatSignedPercent(incomeTrend.change, 1) }}
{{ formatCurrency(incomeTrend.currentIncome) }} this month
Savings Rate
{{ formatPercent(savingsRateTrend.currentRate, 1) }}
6 month trend
Recurring Load
{{ formatCurrency(recurringExpenseProjection.monthlyProjected) }}
{{ recurringExpenseProjection.count }} scheduled expenses
Forecast Net Cash
{{ formatCurrency(cashFlowForecast.projectedNet) }}
Projected month-end balance {{ formatCurrency(cashFlowForecast.predictedEndBalance) }}

๐Ÿฆ Net Worth Trend

Derived from account balances + transaction history
{{ point.labelLong }} {{ formatCurrency(point.value) }}

๐Ÿ”ฅ Budget Burn-down

{{ formatSignedPercent(budgetBurnDown.variancePct, 1) }}
Time used
{{ formatPercent(budgetBurnDown.daysElapsedPct, 0) }}
Budget used
{{ formatPercent(budgetBurnDown.budgetConsumedPct, 0) }}

{{ budgetBurnDown.state === 'over' ? 'Budget consumption is running ahead of the calendar.' : budgetBurnDown.state === 'under' ? 'Spending is trailing calendar pace.' : 'Budget use is tracking closely to elapsed days.' }}

๐Ÿ†š This Month vs Last Month

YoY fallback: {{ comparisonSummary.yoyLabel }}
{{ row.label }}
{{ formatCurrency(row.current) }}
{{ comparisonSummary.comparisonLabel }} ยท {{ formatCurrency(row.previous) }}
{{ formatSignedPercent(row.change, 1) }}

๐Ÿ’ณ Debt Payoff Simulator

Snowball vs avalanche
Snowball
{{ debtPayoffPlans.snowball.months }} mo
Interest {{ formatCurrency(debtPayoffPlans.snowball.totalInterest) }}
Avalanche
{{ debtPayoffPlans.avalanche.months }} mo
Interest {{ formatCurrency(debtPayoffPlans.avalanche.totalInterest) }}
Selected strategy
{{ selectedDebtPayoffPlan.months }} mo
Monthly payment {{ formatCurrency(selectedDebtPayoffPlan.monthlyPayment) }}
Month {{ step.month }} {{ formatCurrency(step.remainingBalance) }}

Payoff order: {{ selectedDebtPayoffPlan.payoffOrder.join(' โ†’ ') || 'No debt accounts' }}

No debt accounts detected. Credit balances below zero will appear here automatically.

๐Ÿ“ˆ Category Trends (Month-over-Month %)

{{ trend.emoji }} {{ trend.name }}
{{ formatCurrency(trend.current) }} {{ trend.percentChange >= 0 ? '+' : '' }}{{ trend.percentChange }}%

๐Ÿช Top Merchants (Frequency)

{{ merchant.name }}
{{ merchant.frequency }}ร—

๐Ÿ“Š Spending Heatmap (By Day of Week)

{{ day }}
{{ formatCurrency(generateSpendingHeatmap()[day]) }}

โš ๏ธ Spending Anomalies (>2ฯƒ from mean)

{{ anomaly.description }}
{{ formatDate(anomaly.date) }}
{{ formatCurrency(anomaly.amount) }}
No unusual spending detected this month

๐Ÿ”ฎ Forecasting

Avg Daily Spend
{{ formatCurrency(calculateForecast().averageDailySpend) }}
{{ calculateForecast().daysElapsed }} days elapsed
Projected Month Income
{{ formatCurrency(calculateForecast().projectedMonthIncome) }}
Income growth {{ formatSignedPercent(incomeTrend.change, 1) }}
Projected Month Total
{{ formatCurrency(calculateForecast().projectedMonthExpenses) }}
{{ calculateForecast().daysInMonth - calculateForecast().daysElapsed }} days left
Predicted End Balance
{{ formatCurrency(calculateForecast().predictedEndBalance) }}
Primary account
๐Ÿ

Start with your real balances

The setup wizard will create your starter accounts, income target, budgets, and first savings goal.

Display

AI & LLM

{{ aiEndpointStatus }}

Stored only in this browser. Not shipped in GitHub Pages.

{{ llmModelStatus }}

{{ llmModelError }}

{{ selectedLlmModel.id }}
{{ capability }}
{{ getModelStatLine(selectedLlmModel) }}

Pick one of the models reported by the endpoint.

{{ visionModelStatus }}

{{ visionModelError }}

{{ selectedVisionModel.id }}
{{ capability }}
{{ getModelStatLine(selectedVisionModel) }}

No explicit vision capability was reported, so the raw model list is being shown.

Device Sync (Phase 6)

Export/import your data as encrypted tokens between devices. No server required.

Setup Wizard

Guided starter setup for opening balances, monthly income target, and first budgets.

Demo Data

Explore the app with realistic demo data (3 months of transactions, budgets, goals, and bills).

Data Management

About

Night Ledger v1.1

100% offline โ€ข PWA enabled โ€ข localStorage + IndexedDB

Bills & Obligations

๐Ÿ“‹

No bills yet

Add a bill to track due dates and payments

๐Ÿ”ด Overdue ({{ dueAlerts.overdue.length }})

{{ formatCurrency(dueAlerts.totalOverdue) }}
{{ bill.description }}
{{ formatCurrency(bill.amount) }}
OVERDUE since {{ formatDate(bill.dueDate) }}

๐ŸŸก Due Soon ({{ dueAlerts.dueSoon.length }})

{{ formatCurrency(dueAlerts.totalDueSoon) }}
{{ bill.description }}
{{ formatCurrency(bill.amount) }}
Due {{ formatDate(bill.dueDate) }}

โœ“ Paid ({{ bills.filter(b => b.status === 'paid').length }})

{{ bill.description }}
{{ formatCurrency(bill.amount) }}

๐Ÿ“„ Reports & Export

Generate reports, compare periods, and export your financial data

Monthly Summary Report

Period
{{ formatDate(reportDateRange.from) }} - {{ formatDate(reportDateRange.to) }}
Total Income
{{ formatCurrency(reportMetrics.totalIncome) }}
Total Expenses
{{ formatCurrency(reportMetrics.totalExpenses) }}
Net Cash Flow
{{ formatCurrency(reportMetrics.netCashFlow) }}
Savings Rate
{{ formatPercent(reportMetrics.savingsRate, 1) }}

Category Breakdown

Category
Amount
% of Total
{{ cat.emoji }} {{ cat.name }}
{{ formatCurrency(cat.total) }}
{{ formatPercent(cat.percentage, 1) }}

Tax Report

Mark Transactions for Taxes

Mark expenses that are tax-deductible or income transactions for tax reporting

{{ txn.description }}
{{ formatDate(txn.date) }}
{{ txn.type === 'expense' ? '-' : '+' }}{{ formatCurrency(Math.abs(txn.amount)) }}
Deductible Expenses
{{ formatCurrency(reportMetrics.taxDeductibleExpenses) }}
Taxable Income
{{ formatCurrency(reportMetrics.taxableIncome) }}
Tax-Tagged Transactions
{{ reportMetrics.taxTaggedCount }}

Tax Category Summary

Category
Deductible Amount
Count
{{ cat.emoji }} {{ cat.name }}
{{ formatCurrency(cat.deductible) }}
{{ cat.count }}

Budget Variance Report

Category
Budgeted
Actual
Variance
Status
{{ item.emoji }} {{ item.name }}
{{ formatCurrency(item.budgeted) }}
{{ formatCurrency(item.actual) }}
{{ formatSignedCurrency(item.variance) }}
{{ formatPercent(item.variancePercent, 0) }}

Summary

Total Budgeted
{{ formatCurrency(reportMetrics.totalBudgeted) }}
Total Spent
{{ formatCurrency(reportMetrics.totalActualExpenses) }}
Remaining
{{ formatCurrency(reportMetrics.totalRemaining) }}
Budget Efficiency
{{ formatPercent(reportMetrics.budgetEfficiency, 1) }}

Period Comparison Report

Category
{{ comparisonType === 'monthly' ? 'This Month' : 'This Year' }}
{{ comparisonType === 'monthly' ? 'Last Month' : 'Last Year' }}
Change
% Change
{{ item.emoji }} {{ item.name }}
{{ formatCurrency(item.current) }}
{{ formatCurrency(item.previous) }}
{{ formatSignedCurrency(item.change) }}
{{ formatSignedPercent(item.changePercent, 1) }}

Overall Comparison

{{ comparisonType === 'monthly' ? 'This Month' : 'This Year' }} Income
{{ formatCurrency(reportMetrics.comparisonCurrentIncome) }}
{{ comparisonType === 'monthly' ? 'Last Month' : 'Last Year' }} Income
{{ formatCurrency(reportMetrics.comparisonPreviousIncome) }}
{{ comparisonType === 'monthly' ? 'This Month' : 'This Year' }} Expenses
{{ formatCurrency(reportMetrics.comparisonCurrentExpenses) }}
{{ comparisonType === 'monthly' ? 'Last Month' : 'Last Year' }} Expenses
{{ formatCurrency(reportMetrics.comparisonPreviousExpenses) }}

Export Your Data

๐Ÿ“‹ Executive Summary

High-level financial overview for quick reference

๐Ÿ“Š Full Data Export

Complete JSON export with all transactions and historical data

๐Ÿ“ Category Breakdown

Detailed PDF breakdown of spending by category

๐Ÿ“ˆ CSV Export

Export transactions as CSV for spreadsheet analysis

Export Preview

{{ exportPreviewContent }}
Receipt Viewer
{{ (receiptViewerZoom * 100).toFixed(0) }}%
๐Ÿ“„ Loading receipt...