Observation Deck / Cashflow Compass

Getting Started

Everything you need to go from a blank slate to a full 12-month forecast β€” and understand every number on the way.

1 What is Cashflow Compass?

Cashflow Compass is a personal budgeting and forecasting tool that answers one question: given what you earn and spend today, what does your financial picture look like over the next 36 months?

Unlike a spreadsheet you maintain manually, the app models every recurring transaction β€” your bi-weekly paycheck, monthly rent, annual insurance renewal β€” and projects them forward automatically. You set things up once and the forecast, charts, and insights update in real time.

It also checks that forecast against reality, on your terms. You can record what an account actually holds today and see how far the projection has drifted, and you can open a transaction file you downloaded from your own bank and compare what you planned with what really happened. That is the full extent of its contact with the outside world β€” there is no connection to any institution, and there never will be.

Everything in it is free, permanently. There is no paid tier, no subscription, no locked feature and nothing to buy β€” there's no service behind the app to sell you.

How it works
All data is stored in your browser's LocalStorage, and the app makes no network requests at all β€” no server, no analytics, no third-party service. The two libraries it uses (Chart.js for the charts, SheetJS for the Excel round-trip) ship inside the vendor/ folder rather than loading from a CDN, so the whole thing works offline: open index.html straight from disk, on a plane, with the Wi-Fi off, and everything still runs. You can export the full state to an Excel workbook or JSON file at any time as a portable backup, and re-import it later to pick up exactly where you left off.

What it's great for

  • Seeing whether your monthly net cash flow is positive or negative before it becomes a problem
  • Planning for irregular windfalls β€” like the two extra "3-paycheck months" you get with bi-weekly pay
  • Stress-testing scenarios: what happens if rent goes up 5% at renewal? What if you take the new job? What if you cut dining out?
  • Finding out whether your plan matches your actual spending, and retuning the plan when it doesn't
  • Working out what a credit card really costs you, and which payoff order clears it soonest
  • Building a backup budget you can open in Excel, edit, and re-import

What it doesn't do

  • Connect to any financial institution. Permanent, and the next heading explains why
  • Convert currencies. The currency setting changes formatting only β€” $1,000 becomes €1,000, never today's exchange rate
  • Calculate your tax. You enter tax as an expense like anything else; the app has no idea what you owe
  • Model investment returns. An investment account is a number you typed in that counts toward net worth. It does not grow on its own
  • Amortize a loan. Credit cards accrue interest at their APR, but a mortgage or car loan is modelled as a payment you type in, not as a principal/interest schedule
  • Give financial advice. Every number it shows you is arithmetic on the numbers you entered. It has no opinion about what you should do
  • Sync by itself, or back itself up. Your data is in this browser. Exporting β€” or connecting a file in a synced folder β€” is what moves it and what saves it

What it will never do: link to your bank

Cashflow Compass will never ask for online banking credentials and will never connect to a real account β€” no Plaid, no open banking, no aggregator of any kind. This isn't a feature waiting for a future release; it's a deliberate design choice, and it's why the rest of the app can be as simple as it is.

  • Privacy. Data that never leaves the machine can't be sold, subpoenaed, or spilled in someone else's breach. There is no server here to hold it and no company behind it to hold it for you.
  • Nothing to trust. Bank linking means handing credentials β€” or a long-lived token β€” to a middleman. A planning tool doesn't need that level of access to do its job, so it doesn't ask for it.
  • Nothing to break. Aggregator connections rot: banks change their APIs, tokens expire, an institution drops off the supported list, and the tool that depended on it quietly stops being accurate. Typed-in numbers keep working forever.

Opening a file you downloaded from your own bank is a completely different thing β€” no credentials, no third party, no live connection, nothing transmitted β€” and that is built and described in section 10. You download the file; you open it; the app reads it off your disk. Nobody is contacted at any point.

Finding your way around

The app is six views, switched from the rail on the left (a tab bar along the bottom on a phone) or with the keys 1–6:

  • Overview β€” the headline tiles (cash today, net worth, projected cash with a sparkline, average monthly net, savings rate, the next seven days, and the lowest point or first shortfall), then the six charts and the insight cards. Every tile and every insight card is a link to the section behind it.
  • Plan β€” accounts, categories and transactions: everything the forecast is built from.
  • Forecast β€” the month-by-month grid, balances by account, and the bills calendar.
  • Reality β€” balance check-ins, plan vs actual, and the button that imports a file from your bank.
  • Planning β€” the debt payoff planner, savings goals, and scenarios.
  • Backup β€” plain, encrypted and live-file backups.

The bar across the top holds the controls that apply everywhere: a search box, the Horizon and Currency selectors, the ⬇ Export button, and a Data β–Ύ menu with the imports, the JSON export, the sample data, this guide, and Reset. While a scenario is active a chip beside them names it, with a Base plan button to step back out.

Three habits are worth learning on day one:

  • Adding things β€” every list in Plan has a οΌ‹ Add button in its header that opens a form in a panel from the right. Save or press Esc and the panel goes away. Editing a row opens the same panel filled in.
  • The β‹― menu β€” every row has one, holding Edit, Pause, Duplicate and Delete (or Move, for a category). A transaction's name and amount can also be changed right in the table: double-click the cell, type, press Enter. Tick several rows and a bar appears to pause, resume or delete them together.
  • The command palette β€” press ⌘K (Ctrl K on Windows and Linux) or click the search box. Type a view, a section, an action, or the name of any account, category, transaction or scenario, and press Enter. It is the fastest way to reach anything.

The first time the app opens it shows a three-step checklist on the Overview β€” an account, an income, a recurring expense β€” with a button on each step that opens the right form. It disappears on its own once the plan has the basics.

2 Your First 10 Minutes

Follow these five steps and you'll have a working forecast in under 10 minutes.

1

Add at least one account

Open Plan and press οΌ‹ Add account in the Accounts header (or just press a anywhere). Add a checking account with its current balance and today's date as the "as of" date, then save β€” the panel closes on its own. This is the starting point every projection builds from. Add savings, credit cards, or investments if you want the full net worth picture.

2

Add your income first

Press οΌ‹ Add transaction in the Transactions header (or n) and add your paycheck as an Income transaction. If you're paid bi-weekly, select Bi-weekly β€” the app will automatically model the two "3-paycheck months" per year. Enter the amount as your net take-home pay after taxes, since everything else is post-tax too.

3

Add your fixed expenses

Rent/mortgage, car payment, phone bill, internet, insurance β€” these are the same every month (or year). Add them as Expense transactions under the appropriate category. For rent with a known renewal, set an Annual Escalation % to model the increase automatically.

4

Add your variable expenses

Groceries, gas, dining out, entertainment β€” use your real average monthly spend, not a wishful number. You can always adjust later. These fill in the Variable and Discretionary categories in the forecast grid.

5

Choose your horizon and review

Use the Horizon control in the top bar to pick End of Year, 12, 18, 24, or 36 months. Open the Forecast view for the grid β€” red cells flag months where the balance goes negative β€” and the Overview for the headline tiles and the Insight cards: your savings rate, biggest spending category, and projected end balance. The rail on the left (a tab bar on a phone) switches views; keys 1–6 do the same.

Tip β€” Start with the sample data
Load sample data under the Data β–Ύ menu in the top bar (and on the first-run checklist while the app is empty) sets up two accounts and 13 realistic transactions so you can see the full forecast immediately. Edit or delete any transaction to replace it with your own numbers.

The second ten minutes

Those five steps give you a plan. Sections 9 to 16 are about finding out whether the plan is true, and they're worth coming back to once the basics are entered:

3 Accounts, Transfers & Credit Cards

Accounts hold the balances the forecast builds from. Each account carries its own starting balance and the date that balance was true, and the forecast tracks them separately β€” every transaction is assigned to an account, so money leaves and lands where it really would.

That per-account tracking is what makes the projection useful rather than merely tidy. A single combined balance can look healthy all year while the checking account it's mostly made of goes to zero in March. Because each account is projected on its own you can see that coming: the Balances by Account section walks each account forward month by month alongside the combined totals.

Two different totals come out of that. Net worth is everything you own minus what you owe. Liquid cash is only the money you could actually spend this week β€” and it's the liquid figure the red-balance warnings watch, so a healthy brokerage account can't paper over a checking account that runs dry.

Account typeHow the balance is treated
CheckingSpendable cash β€” counts toward both net worth and liquid cash. The primary account for most forecasts
SavingsSpendable cash β€” good for modeling an emergency fund or sinking fund
Credit CardA liability: subtracted from net worth and never counted as cash. Enter the balance you owe as a positive number, and set the card's APR and minimum payment (see below)
InvestmentCounts toward net worth so you see the full picture, but not toward liquid cash β€” a brokerage balance isn't this month's rent
CashSpendable cash β€” for money on hand you want to include

The "As of" date

This tells the app when that balance was accurate β€” use today's date if you just checked the account. It isn't decoration. The forecast anchors itself to the latest as-of date across your accounts and only counts money from that date forward, so a bill you already paid before then isn't charged to you a second time: it's already reflected in the balance you typed in. That's what lets you set the app up mid-month without your rent, paid on the 1st, being replayed on top of a balance recorded on the 20th.

Tip β€” Keep the as-of dates honest
When you refresh a balance, update its as-of date at the same time. If the balance is new but the date is old, the forecast will re-apply everything that has happened since β€” and your projection will drift low. Balance check-ins are the tidier way to do this: record what the account really holds, see the drift, and re-anchor in one step.

Transfers β€” moving money between accounts

Add as many accounts as you like; the forecast keeps a running balance for each one plus the combined totals. To move money between them, add a transaction with the kind set to Transfer and pick both ends: the account it comes from and the account it goes to.

A transfer is neither income nor an expense, so it never changes your net cash flow or your net worth β€” it changes only where the money sits. A $500 monthly transfer from checking to savings shows your checking balance growing more slowly and your savings balance climbing, which is exactly what happens in real life.

Credit cards β€” the one part worth reading twice

Cards behave the way real cards do, and that catches almost everyone out at first. Two sentences carry the whole idea:

  • An expense charged to a card raises the card's balance. Record it as an ordinary expense with the card as its account. No cash leaves your checking, because in real life none has yet β€” you owe more instead.
  • A payment to a card is a transfer, from the cash account you pay out of to the card. That's the moment cash actually leaves checking and the card balance comes down.

Worked example

You have $3,000 in checking and a Visa with $1,200 owed at 22% APR. Your net worth is $3,000 βˆ’ $1,200 = $1,800. Now play out a month:

What happensHow you record itCheckingVisa owedNet worth
Starting pointβ€”$3,000$1,200$1,800
$400 of groceries, paid with the VisaExpense, account = Visa$3,000$1,600$1,400
A month's interest at 22% APR on $1,600automatic, from the card's APR$3,000$1,629$1,371
You pay the card $500 from checkingTransfer, Checking β†’ Visa$2,500$1,129$1,371

Read the last two columns together and the model explains itself:

  • The groceries cost you $400 the moment you swiped. Net worth fell by $400 even though your cash didn't move β€” which is exactly what happened in reality. The bill was real; you just hadn't settled it yet.
  • The payment cost you nothing. Net worth is the same on both sides of it: $1,371 before, $1,371 after. You moved $500 out of checking and $500 off a debt you already owed, and the two cancel. Liquid cash fell, because that part is real β€” but you did not become poorer by paying your bill.
  • The interest is the only thing the card added. $29 of net worth that simply evaporated, which is the honest cost of carrying the balance.

So a card payment is a transfer, not an expense. If you record the groceries and log the $500 payment as an expense, you have charged yourself for the same groceries twice, and your forecast is $500 a month gloomier than your life.

Watch out β€” Pick one lane per card and stay in it

Detailed: record purchases against the card and pay it down with transfers. The card balance moves, interest is modelled, and the payoff planner works. Use this if you carry a balance.

Simple: don't record card purchases at all β€” just model the monthly payment as an expense in a Debt category. Quick to set up, but the card balance never moves and no interest is modelled. Fine if you clear the card in full every month.

What you must not do is both. That double-counts every purchase.

APR and minimum payment

  • APR β€” set it and the balance accrues interest month by month instead of sitting frozen, so carrying a balance costs you something in the forecast the way it does in life. Interest is charged on the outstanding balance each month at APR Γ· 12: 22% on $1,600 is about $29.
  • Minimum payment β€” the smallest payment the issuer accepts. It's what makes the difference visible between a payment that's genuinely reducing the balance and one that's mostly covering interest.

With both recorded on each card, the Debt Payoff Planner can project when every card clears, what the interest costs, and how much a different payoff order would save you.

4 Categories

Every transaction belongs to a category, and every category belongs to a kind. The category is the label you read; the kind is what the app reasons with β€” it decides which group a row lands in on the forecast grid, and it separates committed costs from the ones you actually control.

The app ships with 19 default categories covering the usual shape of a household budget: Salary and Other Income; Housing, Utilities, Home Internet, Phone Bill, Insurance and Subscriptions; Electric, Groceries and Gas / Transport; Dining, Entertainment and Shopping; Savings and Retirement; Debt Payment; Taxes; and a Savings Goal to start you off on the Goal kind. Keep the ones that fit, rename the ones that don't, add your own.

The eight kinds

KindWhat belongs in it
IncomeMoney coming in β€” salary, freelance work, rent received, dividends
FixedCommitted costs that don't move month to month β€” rent, insurance, phone, subscriptions
VariableRecurring but fluctuating β€” groceries, fuel, electricity
DiscretionaryLifestyle spending you could cut this month if you had to β€” dining, entertainment, shopping
SavingsMoney you're deliberately setting aside β€” emergency fund, retirement contributions
DebtLoan and credit card payments
TaxEstimated payments, self-employment tax, anything owed to the revenue service
GoalA specific target you're funding β€” a car deposit, a wedding, a trip. A Savings Goal category ships as a starting point; rename it or add your own per goal. Goal categories can carry a target amount and a target date, which is what turns them into tracked goals with an ETA

Adding, editing, and deleting

οΌ‹ Add category in the section header opens a small form in a side panel: a name, a kind, and a color. Add a category and it's immediately available in the transaction form. Choose Edit from the β‹― menu on any row to open it in the same panel and change it β€” the edit applies everywhere that category is used, including its color in every chart.

Delete, in the same β‹― menu, removes a category. If any transactions are using it, the confirmation asks where to move them and reassigns them as part of the delete β€” nothing is ever quietly orphaned, and you don't have to go and re-file them by hand first. (The one case it refuses is deleting your last remaining category while transactions still need one; add a replacement first.) Deletes are undoable β€” see Settings & Housekeeping.

Colors

The color you pick is the color that category gets in the Spend by Category doughnut, the Category Trend stack, and the Income Sources chart, and it's the dot beside the category name in the transaction list. Defaults are drawn from the Observation Deck palette and are already bright enough to read against the dark cards; if you add your own, pick something with similar punch.

Sorting the list

Click the Name or Kind column header to sort the table A→Z; click the same header again to flip to Z→A. The arrow in the header shows which column is driving the sort and in which direction. This is display only — it changes nothing about your data or the forecast.

Note β€” How the subscription card finds things
The Annual Subscription Cost insight counts the built-in Subscriptions category, any Fixed category you name after subscriptions (Work Subscriptions gets picked up automatically), and any transaction you simply tag subscription. That last route is the useful one: a streaming service you'd rather file under Entertainment still lands in the total if you tag it.

5 Transactions & Frequencies

Transactions are the heart of the app. Each one represents a real recurring (or one-time) cash flow β€” a paycheck, a subscription, a car insurance renewal β€” and is either income, an expense, or a transfer between two of your accounts (see Accounts). The app supports nine frequency types so you can model virtually any real-world payment schedule.

One-time
Hits on a single date. Good for car repairs, a large purchase, a tax payment, or a bonus.
Weekly
Every 7 days from the start date. ~52 occurrences per year.
Bi-weekly ⭐
Every 14 days β€” exactly 26 paychecks per year. Correctly models the 2 "3-paycheck months" most people don't plan for.
Semi-monthly
Twice a month, 24 times a year β€” common for salaried roles. The two days come from your start date: start on the 1st for the 1st and 15th, start on the 15th for the 15th and month end, or any other day for that day and a fortnight later (clamped in short months).
Monthly
Same day each month. The most common frequency β€” rent, utilities, subscriptions, loan payments.
Quarterly
Every 3 months. Good for estimated taxes, quarterly dividends, or HOA fees.
Semi-annual
Twice a year. Some insurance policies and property tax bills land this way.
Annual
Once a year. Car insurance, Amazon Prime, domain renewals, annual memberships.
Custom
Every N days, weeks, or months. For anything that doesn't fit a standard cadence.

Bi-weekly and the 3-paycheck month

Most salaried workers paid bi-weekly notice that two months a year have three pay deposits instead of two. With 26 paychecks spread over 12 months, two months end up with an "extra" paycheck β€” a significant windfall if you plan for it. Cashflow Compass detects these months automatically and flags them in the Insights panel so you can decide in advance what to do with the extra cash.

Tip β€” Enter net (take-home) pay
Enter your paycheck amount as what lands in your bank account after all pre-tax deductions (401k, health insurance, federal and state withholding). Since all expenses in the app are post-tax, mixing gross income with post-tax expenses will make the forecast look falsely negative.

Annual escalation %

For transactions that grow over time β€” rent renewals, cost-of-living raises, utility creep β€” set an escalation percentage. The amount steps up by that % on each anniversary of the start date, compounding: a 5% escalation on a $900 rent makes it $945 in year 2, $992 in year 3, and so on.

Pause / resume

Choose Pause from the β‹― menu on any transaction to suspend it without deleting it, and Resume from the same menu to bring it back. To pause several at once, tick their checkboxes and use the bar that appears above the table. This is useful for gym memberships you've cancelled (but plan to restart), freelance income that stopped, or seasonal expenses that are off right now.

Tags and notes

Tags let you group transactions that cut across categories β€” for example, work-reimbursable, kid, or shared. Notes are free-text reminders attached to a transaction ("Lease renews in August", "Cancel before trial ends").

End date

Set an end date on any transaction to stop it from appearing in the forecast after a certain point. Perfect for a fixed-term loan payoff, a sublease, or a promotional subscription price that expires.

Editing: the panel, the table, and the bulk bar

There are three ways to change a transaction, and which one you reach for depends on how much is changing:

  • The panel β€” choose Edit from the row's β‹― menu (or pick the transaction from the command palette). The full form opens from the right with every field filled in; save or press Esc to close it.
  • In the table β€” double-click the Name or Amount cell (or focus it and press Enter), type the new value, and press Enter. Esc abandons it. Good for the quick "rent went up to $950" edit that doesn't deserve a form.
  • The bulk bar β€” tick the checkbox on any rows (the one in the header ticks everything the filters are showing) and a bar appears offering Pause, Resume and Delete for all of them at once.

Every one of these is a single undo step, so a slip is one click to reverse. Duplicate, also in the β‹― menu, makes a copy named "(copy)" for quick variants.

Finding things: search, filters, and sorting

A real budget gets to fifty or sixty transactions quickly. Three controls sit above the list to keep it navigable (and / jumps straight to the search box from anywhere):

  • Search β€” type anything and the list narrows as you go. It matches on the transaction name, its tags, and its notes, so searching kid finds everything tagged for the kids and searching renews finds the notes you left yourself about renewal dates.
  • Kind filter β€” show only income, only expenses, or only transfers.
  • Category filter β€” narrow to a single category. Combine it with the search box; the filters stack rather than replace each other.

Four column headers are clickable and sort the visible list: Name, Amount, Start, and Annualized. The first click sorts ascending, a second click on the same header flips to descending, and the arrow in the header tells you which is active. Sorting applies to whatever the filters have left on screen, so you can filter to Discretionary, sort by Annualized descending, and see your most expensive habit at the top.

The Next column shows when each transaction lands next β€” the quickest way to sanity-check that a start date and frequency are doing what you meant.

Tip β€” The Annualized column is the honest one
Annualized is what each transaction actually costs over the next twelve months, so a $14 monthly subscription ($168) and a $150 annual one line up on the same scale. Sort by it descending once a quarter β€” the ranking is rarely what you expect.

6 The Forecast Grid

The forecast grid is a month-by-month projection table. Rows are your transactions grouped by category kind; columns are the months in your chosen horizon.

Row groupWhat it contains
IncomeAll income transactions β€” paychecks, side income, rental income
FixedPredictable, recurring expenses. This group orders itself β€” see How the Fixed group sorts itself below
VariableExpenses that recur but fluctuate β€” groceries, gas, utilities
DiscretionaryLifestyle spending β€” dining out, entertainment, travel
SavingsSavings contributions and sinking funds β€” vacation fund, emergency fund top-up
DebtLoan and credit card payments
TaxEstimated tax payments and tax-related expenses
GoalAnything you're funding toward a specific target β€” a deposit, a wedding, a trip

Groups appear in that order, and a group with nothing in it is skipped entirely. If a transaction's category has gone missing, its row lands in a final Other group at the bottom rather than disappearing.

How the Fixed group sorts itself

Fixed costs are the ones you look at most, so the app orders them for you rather than leaving them in entry order. Rows are sorted into three frequency buckets, and the buckets always appear in this order:

  1. Weekly, bi-weekly, semi-monthly, monthly, and quarterly β€” anything that hits at least a few times a year
  2. Semi-annual and annual β€” the big periodic bills
  3. One-time and custom β€” everything else

Within each bucket, rows are ordered by the amount you typed on the transaction, largest first. That's the raw per-occurrence amount β€” not the annual total, and not adjusted for escalation β€” so a $1,200 annual insurance premium sorts below a $12 monthly subscription, because they're in different buckets. Periodic bills stay grouped together instead of being scattered through the list by size.

Summary rows

Below all the transactions, five summary rows appear for every month:

  • Total Income β€” all income for that month
  • Total Expenses β€” all outflows combined
  • Net Cash Flow β€” income minus expenses (green = positive, red = negative)
  • End-of-Month Cash β€” running spendable balance; turns red if it goes negative. This is the row that answers "will I actually make it through the month"
  • Net Worth β€” everything you own minus everything you owe, including investments and card debt. It can be climbing while cash is falling, which is exactly why both rows are here
Watch out
A red End-of-Month Cash figure means you'd run out of spendable money that month β€” you'd need to dip into credit or sell something to cover it. Look for the transaction causing the spike (often an annual expense) and either plan a buffer or adjust the timing.

Choosing your horizon

The global horizon dropdown in the top-right changes the forecast length for the grid and all charts simultaneously. Options are End of Year (remaining months in the current calendar year), 12, 18, 24, and 36 months. Each chart can also be set to its own independent horizon β€” see the Charts section.

7 Charts

Six charts visualize your forecast from different angles. Every chart has its own horizon dropdown β€” you can keep most on the global setting and override one or two for a deeper look without affecting the rest of the page.

πŸ“Š Monthly Income vs Expenses

Side-by-side bars for each month's total income and total expenses, with a net cash-flow line overlay. The quickest way to spot months where spending overtakes income.

Look for: bars where expenses exceed income height
πŸ“ˆ Running Balance

Area chart of your projected account balance month by month. Shows the trajectory of your financial position β€” are you building a cushion or drawing one down? Once you've imported enough real history, it can also draw confidence bands around the line.

Look for: dips toward or below zero
🍩 Spend by Category

Doughnut chart breaking down total expenses by category over the horizon. Instantly answers "where is my money going?" in percentage terms.

Look for: categories that surprise you by their share
πŸ“‰ Category Trend

Stacked area chart showing how each category's spend evolves over time. Useful for seeing the effect of annual escalations and seasonal expenses building up.

Look for: categories growing faster than income
πŸ† Top 10 Costs

Horizontal bar chart of the 10 individual expense lines that cost you the most over the chosen horizon. These are totals for the window, not annualized figures, so the ranking moves when you change the horizon: a $5,000 one-time car repair tops a 12-month view, but over 36 months a $200 monthly bill ($7,200) passes it. Hover any bar for the exact amount.

Look for: items you'd forgotten about or underestimated
πŸ’° Income Sources

Doughnut breakdown of income by category β€” useful if you have multiple income streams (salary, freelance, rental, dividends) and want to see your income diversification at a glance.

Look for: heavy reliance on a single source
Tip β€” Per-chart horizons
Set the Running Balance chart to 36 months to see the long arc, while keeping the Income vs Expenses chart on 12 months for month-to-month detail. Each chart remembers its override independently.

8 Insight Cards

The Insights panel reads your forecast and writes the findings in plain language. Cards update instantly when you change a transaction or the horizon.

Cards appear only where your data supports them. An empty budget produces no cards at all β€” the panel simply invites you to add something. From there most cards are conditional: no income stream means no savings rate, no subscriptions means no subscription card, no spending at all means no biggest-category card. A few always report once you have data, and say so plainly when there's nothing to flag ("0 days", "None forecast") β€” an all-clear is information too.

1

Savings Rate

The percentage of your income you actually keep over the horizon. Money you move into savings, toward a goal, or onto debt principal counts as kept, not spent β€” otherwise the card would penalise you for the exact behaviour it's measuring. A rate of 20%+ is healthy; below 10% means most of your income is committed before it arrives; negative means expenses exceed income on average.

2

Biggest Category

The single expense category that consumes the largest share of your total spending over the horizon, shown as a percentage. Housing dominating at 40%+ is normal in high-cost areas; if Dining Out is your biggest category, that's a cue worth noticing.

3

Fixed vs Variable

What share of your everyday spending is committed β€” the Fixed group: rent, insurance, phone, subscriptions β€” measured against everything flexible (Variable plus Discretionary). A high fixed share isn't automatically bad, but it tells you how much room you'd have if income dropped: you can skip a dinner out, not a lease payment. Past roughly three-quarters fixed, the card starts warning you.

4

Annual Subscription Cost

The annualized total of your subscriptions, with the monthly equivalent beneath. It picks up the built-in Subscriptions category, any Fixed category you've named after subscriptions, and anything you've simply tagged subscription β€” so a streaming service filed under Entertainment still gets counted if you tag it. Subscription creep is real; this makes the full annual number visible in one place.

5

Emergency Fund

Your liquid cash measured against four tiers instead of one blanket target: a $1,000 starter buffer, then six weeks of take-home pay, then three months of expenses, then six. The card tells you which tier you're past and exactly how much is left to reach the next one, because "build a bigger buffer" means something very different at three weeks of runway than at five months. It's also shown at zero and below β€” that's precisely when it matters most.

6

Days in the Red

A count of forecast days where your liquid cash goes negative, plus the lowest point reached. Note that this looks at spendable cash, not net worth β€” an overdrawn checking account is a real problem even if a brokerage balance keeps your net worth healthy. Zero is the target.

7

First Shortfall

The exact date your liquid cash is first projected to drop below zero, and how many days away that is. The red-day count tells you how bad; this tells you how long you have. It's the most actionable number in the panel β€” go to that date in the forecast grid and look at what lands just before it. When nothing goes negative, the card says so.

8

Tightest Week

The worst seven-day stretch in the horizon by net cash flow, with its exact dates β€” effectively "keep at least this much in reserve". Monthly totals hide this completely: a month can finish comfortably positive and still contain a week where the rent has gone out and the paycheck hasn't come in. This is the card that catches near-misses.

9

Best Month and Worst Month

Two cards, naming the strongest and weakest months in the horizon by net cash flow, each with the income and expenses behind it. The worst month is usually where an annual bill lands; seeing the pair together is what tells you whether a shortfall is a real trend or one lumpy renewal you can plan around. They need a horizon of at least two months to mean anything, so a one-month view omits them.

10

3-Paycheck Months

For bi-weekly income streams, shows which calendar months will have three pay deposits instead of two. This happens twice a year and represents a meaningful windfall β€” equal to one full extra paycheck. The card flags the specific months so you can plan ahead: extra savings, debt paydown, or a budgeted splurge.

11

If you cut [category] by 20%

A quick what-if: reduce one category by a fifth, and here's what it's worth over the full horizon. It deliberately targets your biggest discretionary category β€” falling back to the biggest variable one, and only then to the largest outright β€” because "spend 20% less on rent" isn't advice. This is the highest-leverage change you could actually make.

12

Projected Cash

Where your liquid cash lands in the final month of the chosen horizon, plus the change from where you are today. Green means you finish ahead; yellow means you end below where you started. This is the single number that summarizes whether your current trajectory is sustainable.

Tip β€” Read the panel as a checklist
Work top to bottom once a month. Savings rate and fixed-vs-variable tell you the shape of your budget; days in the red, first shortfall, and tightest week tell you whether it survives contact with the calendar. If the second group is clean and the first is healthy, you're done β€” close the tab.

9 Balance Check-ins

A forecast built from a balance you typed in three weeks ago has a hole in it. Life happened in between: a refund arrived, a bill was larger than you remembered, you forgot to enter the vet bill. The projection is still running off the old number and quietly getting further from the truth.

A check-in closes that gap in about ten seconds. In the Monthly Check-in section, pick an account, type what it holds right now, confirm the date, and press Log check-in. That's the whole interaction β€” no import, no file, no connection.

What the drift number tells you

The panel then leads with the number it exists for: the drift. It shows what the forecast said you'd have on that date, what you actually had, and the gap between them β€” as money and as a percentage of the projection β€” with a per-account table underneath giving the same three figures for each account you've checked in.

What you seeWhat it usually means
Drift near zeroYour plan matches your life. Nothing to do β€” this is the result you're after
Actual consistently below forecastSomething real is missing from the plan, or an amount is too low. Spending that never got entered is the usual culprit
Actual consistently above forecastYou're planning for spending that isn't happening, or income you forgot to record. Pleasant, but it still makes the forecast wrong
A single large one-off gapOne event, not a pattern β€” a bonus, a big repair, a bill that landed in a different month than planned

Drift is a measurement, not a verdict. It doesn't say you overspent; it says the model and the world disagree, and points at where.

Re-anchoring the forecast

A check-in measures the gap; it doesn't silently rewrite your accounts. When the drift is real rather than a rounding wobble, close it yourself in two fields: open the account in the Accounts panel, set its starting balance to what you observed, and set its as-of date to the day you observed it. Everything from that date forward is then projected from a number you have actually looked at, rather than one you typed in weeks ago and have been compounding ever since.

Re-anchoring fixes the level of the forecast, not its shape. If the same drift reappears at the next check-in, the plan itself is missing something β€” that's the point to go looking for the transaction you never entered, or to import a few months of real transactions and let Plan vs Actual tell you which category it lives in.

Tip β€” Check in on a rhythm, not on a whim
Once a week, or on payday, is plenty. Every check-in is kept, so the list becomes a record of whether your plan is getting more accurate or less β€” which is far more useful than any single reading. Only the most recent check-in per account is used to compute the drift, deliberately: averaging an old reading with a fresh one would blunt exactly the signal you're looking for.
Note β€” Check in on credit cards too
For a card, "what it holds" is what you owe, entered as a positive number, exactly as you entered its starting balance. Card drift is usually the most informative kind: it's where unrecorded spending shows up first. In the combined total, a card is counted the way net worth counts it β€” as a debt against the pile, not as money in it β€” so a card and a current account can't quietly cancel each other out to a meaningless zero.

10 Importing Your Bank's File

Nearly every bank lets you download your own transactions β€” usually a button marked Export, Download, or Statement somewhere near the transaction list. Cashflow Compass reads that file. You get your real spending sitting next to your plan, without typing a single line of it in.

Read this first β€” this is not a bank connection

Importing a file is the opposite of linking an account, and the difference is worth being precise about:

  • No credentials. The app never asks for a username, password, PIN, security question or one-time code. There is no login form anywhere in it.
  • No aggregator. No Plaid, no SimpleFIN, no GoCardless, no open banking, no OAuth to any institution, no third-party service of any kind.
  • Nothing is uploaded. The app makes no network requests at all. You pick a file with a file picker; the browser reads it from your disk; the parsing happens in the page. Nothing is sent anywhere, because there is nowhere for it to be sent.
  • Credentials inside the file are thrown away. OFX and QFX downloads often still carry the sign-on block the request was built from β€” USERID, USERPASS, session keys, the lot. The parser strips that whole block before it reads anything, and then keeps only the transaction fields it explicitly recognises: date, amount, payee, id, memo, type. Nothing else survives the parse, so those values are never stored in your data, never written into an export, and never shown on screen.

You downloaded a file, and you opened it. That's all that happened.

Formats it reads

FormatWhere you'll meet it
CSVThe universal fallback β€” nearly every bank offers it. Column layouts vary wildly, which is what the mapping wizard is for
OFX / QFXThe "download for Quicken / Money" option. Structured, and usually carries a unique id per transaction, which makes duplicate detection exact
QIFThe older Quicken format. Still offered by plenty of banks and by most personal-finance software as an export
camt.053The ISO 20022 XML bank statement, common in Europe and for business accounts

The four steps

Importing walks through four screens, and nothing is written to your data until you confirm the last one. You can back out at any point.

StepWhat happens
1 Β· Which account is this?Which of your accounts the file belongs to. If a saved column layout exists for that account, it says so here
2 Β· Does this look like your statement?A preview of the parsed rows. If the file is wrong, or the parse has gone sideways, you find out before anything is added
3 Β· Point the columns at the right fieldsThe mapping step, for CSV. Structured formats say "there is nothing to line up here" and skip straight past it
4 Β· Check what is about to be addedThe review: what's new, what's already recorded, what might be a duplicate, and anything that couldn't be read

Mapping the columns (CSV only)

OFX, QFX, QIF and camt.053 name their own fields β€” the app knows where the date is. CSV doesn't: one bank exports Date, Description, Amount, another Posted, Payee, Debit, Credit, Balance. So step 3 asks you to point at them:

You chooseWhat it does
Date columnWhich column holds the transaction date
Payee / description columnWhich column names the merchant
How the amount is writtenEither one column, already signed (money out negative), or separate money-out and money-in columns β€” the split layout common in UK and European exports
Flip the signTurn on if your bank writes money out as a positive number. Available for the structured formats too, for the occasional bank that does this in OFX
Date formatWhich way round the day and month are β€” see below

The layout is remembered per account. Next month's export from the same bank arrives with the mapping already applied and a note saying so β€” change anything that's different, or just carry on. If the bank changes its format, you remap once and that becomes the saved layout.

Ambiguous dates are asked about, never guessed

A column full of values like 03/04/2026 is genuinely ambiguous: April 3rd to a British bank, March 4th to an American one. Guessing would be both catastrophic and invisible β€” every transaction would land in the wrong month, the comparison against your plan would be quietly nonsense, and nothing on screen would look broken.

So the app asks, and shows its working: it tells you which reading the file's own values support (a day above 12 anywhere in the column settles it), and offers the choice as Day first β€” 03/04/2026 is 3 April 2026 against Month first β€” 03/04/2026 is 4 March 2026. Unambiguous files β€” ISO 2026-04-03, or a column that can only be read one way β€” don't interrupt you. A column with evidence for both readings is flagged as inconsistent, because that's a fact about the file you'd want to know.

Duplicates

Overlapping imports are normal: you download "last 90 days" every month, so two-thirds of every file is already in your records. The review step sorts that out for you, in three piles:

  • New β€” imported. Rows carrying a unique bank id (the FITID in OFX, QFX and QIF) are keyed on it exactly; rows without one, which means most CSVs, get a stable fingerprint built from the date, amount and payee.
  • Already imported β€” recognised and left alone. An import that adds nothing reports as a clean no-op, not a failure.
  • Possible duplicates β€” same amount, within three days of something already recorded. These are your call, with a tickbox each: two identical $40 fuel stops in one week are perfectly normal, and so is the same transaction appearing twice in overlapping exports. The app won't guess which.

Categories, and what it won't invent

New rows arrive with a category suggested from what you've already filed β€” if you've categorised "SAFEWAY" as Groceries before, the next one follows. Anything it can't recognise is left uncategorised rather than guessed at, and the review screen tells you how many of each. The first rows are editable right there before you commit, and everything is editable afterwards.

If the file's currency differs from the one you budget in, you're told β€” and the numbers are imported exactly as written, with no conversion. The app never invents an exchange rate.

Matching actuals to your plan

Imported rows are matched against your planned transactions inside a date window, because reality is never punctual: the rent you planned for the 1st cleared on the 3rd, and it's still the rent. A match records which planned transaction the real one settled, and how many days off it was. Unmatched rows aren't a problem β€” they're often exactly what you want to see, since a real transaction with nothing planned behind it is spending your plan doesn't know about.

You can re-categorise, edit or delete any imported row afterwards. Nothing the parser decides is final.

Note β€” Signs, in one line
Amounts on actual transactions are signed: money out is negative, money in is positive. That's the one convention to know if you enter an actual by hand or use the flip-the-sign switch.
Tip β€” Three months is the useful amount
One month of history tells you about one month. Three or more is where Plan vs Actual starts distinguishing a habit from an accident β€” and three observed months per category is also the threshold confidence bands need before they'll draw.

11 Plan vs Actual

With actuals imported, the app can put the two side by side over the same period and show you where your plan and your life disagree.

  • By category β€” planned versus actual, the gap in money and percent, and how many months of evidence sit behind the comparison. That last number matters: a 40% overrun on one month of data is noise, and the same overrun across six months is a fact about you.
  • By month β€” planned versus actual net for each month, which is where you see whether a bad month was a blip or the start of a trend.
  • Totals β€” the whole period in one line, so you know whether the plan is broadly right with a couple of bad categories, or broadly wrong.

Recalibration prompts

Where a category has been consistently different from its plan, a card appears under Recalibration: "Dining has run $310/mo against a $200 plan across 4 months", tagged with how much evidence sits behind it β€” early days, fair evidence, or strong evidence. Weigh the tag before you act on the number; four months of agreement is an argument, one month is an anecdote.

Press Update the plan and you're shown exactly which planned transactions would change and from what to what, line by line, before anything happens. Accept it and the amounts are rewritten β€” proportionally, if several transactions share the category, so the split you set up is preserved. Ignore it and nothing moves. And it's undoable, like every other destructive action in the app.

If a category has no planned transaction to move, the card says so rather than offering a button that couldn't do anything.

Note β€” This is tuning, not telling you off

Going over on groceries three months running is not a character flaw. It's a signal that the number in your plan is wrong β€” you don't spend $400 on groceries, you spend $520, and you have never once spent $400.

A budget you miss every month isn't a budget, it's a wish, and a forecast built on wishes tells you nothing useful about next March. Correcting the plan to match reality is what makes every other number in the app trustworthy. If you then want to spend less on groceries, that's a decision you make on purpose β€” and the plan is the place you record the decision, not the place you punish yourself for it.

Tip β€” Recalibrate the boring categories, decide about the interesting ones
Utilities, fuel, groceries: just take the suggestion. They cost what they cost, and arguing with the meter reading gains you nothing. Save the deliberation for the categories where the number really is a choice.

12 Confidence Bands

The Running Balance chart can draw a shaded band around the projected line instead of a single confident stroke β€” a plausible range, showing that a forecast twelve months out is a spread, not a promise.

Why the band is usually missing

It won't draw until it has evidence. A category must have at least three observed months of imported actuals before it contributes, and with nothing imported there is no band at all.

That refusal is the feature. Your plan is deterministic arithmetic: $900 of rent, twelve times. There is no uncertainty inside that number, so any spread drawn around it would have to be invented β€” a decoration shaped like statistics. Fake error bars are worse than none, because they make a guess look measured, and a range you can't justify is worse than a line you know is a single scenario.

So the app waits. Import a few months of real transactions and the band appears, built from how much your actual monthly spending in each category has varied β€” the 25th, 50th and 75th percentiles of your own observed history. At that point the range means something: it's your spending, not a formula's idea of it.

Note β€” What the band is, and isn't
It reflects the ordinary variability of your spending β€” how much groceries wobble month to month. It cannot anticipate a new job, a broken boiler, or a category you've only just started spending in. Treat the band as "how much does a normal month vary", not as a worst case. For anything specific and large, build a scenario instead.

13 The Debt Payoff Planner

Give each credit account a balance, an APR and a minimum payment (see Accounts), put whatever you can spare in the Extra per month box, and the Debt Payoff section simulates clearing the cards β€” two ways at once, side by side, with the cheaper of the two marked.

Avalanche
Highest APR first. Every card gets its minimum; everything spare goes at the most expensive debt. Mathematically the cheapest order β€” always.
Snowball
Smallest balance first. Costs a little more in interest, but clears an entire card sooner β€” and for a lot of people that first cleared card is what keeps them going.

Both run the same simulation month by month: interest is added to each balance at its APR Γ· 12, every card receives its minimum, and everything left over β€” including the minimums freed up by cards that have already cleared β€” is thrown at the front of the queue. You get each card's payoff date and interest total, the debt-free date, and the total interest for each strategy.

What the difference actually looks like

Two cards β€” $6,000 at 24.99% with a $150 minimum, and $1,500 at 12% with a $40 minimum β€” and $200 a month spare on top of the $190 of minimums:

StrategyDebt-free inTotal interestFirst card cleared
Avalanche (24.99% card first)24 months$1,778month 22
Snowball (smaller balance first)25 months$2,084month 7

So on these numbers avalanche saves $306 and one month, while snowball gets one of the two cards off your back 15 months sooner. That's the real trade, stated in money and months rather than in slogans β€” and it's small enough here that either answer is defensible, which is precisely the kind of thing you can only know by looking.

Note β€” Arithmetic, not advice
The planner has no opinion about which strategy you should pick, and this app is not a financial adviser. It runs the numbers you entered and shows you what each order costs. Which one you'll actually stick to is a question about you, and it's a legitimate input β€” the cheapest plan you abandon in month three costs more than the pricier one you finish.
Tip β€” Try the extra payment at a few sizes
Put $50 in the extra-payment box, then $100, then $200, and watch the debt-free date move. The first $50 usually does far more than you'd expect, because everything above the minimums attacks principal directly. It's the fastest way to see what a small change is genuinely worth.

14 Goals & Sinking Funds

A goal is something you're saving toward: a deposit, a wedding, a replacement car, three months of runway. A sinking fund is the same machinery pointed at a bill you know is coming β€” the $1,200 annual insurance premium you'd rather meet as $100 a month than as one bad morning in June.

Setting one up

1

Add the goal

In the Savings Goals section, give it a name β€” "House Deposit", "Japan 2027", "Car Insurance Fund" β€” a Target amount, and optionally a By date. That creates a category of the Goal kind for you; you can also make one by hand in the Categories panel, and the shipped Savings Goal category is there to rename if you only need one.

2

Fund it with an ordinary transaction

A $250 monthly transfer from checking to savings, filed under that goal category. Nothing special β€” it's a transaction like any other. Money moved into a goal category counts toward the goal, so the progress figure, the run-rate and the ETA all start moving. What you won't see is a new row in the forecast grid: a transfer changes where your money sits, not how much of it there is, so it adds nothing to a monthly income or expense total.

3

Adjust the target whenever it changes

Each goal's target and date stay editable in place. The target is what makes it a goal rather than a label β€” the percentage, the ETA and the on-track verdict are all measured against it. Leave the date off when there's no real deadline.

What you get back

  • Accumulated β€” how much your plan puts into the goal across the horizon
  • Monthly run-rate β€” the average per month, which is the number to change if the ETA disappoints you
  • Percent of target β€” how far the horizon gets you
  • ETA β€” the month the target is met. If the horizon isn't long enough to reach it, the ETA is projected beyond the horizon at your current rate rather than reported as "never"
  • On track β€” with a target date set, whether the ETA lands before it
Tip β€” Sinking funds turn lumpy bills into flat ones
Any annual bill can become a sinking fund: divide it by twelve, set that as a monthly transfer into a goal category, and set the target to the bill. The goal's progress and ETA track the pot filling up month by month, and your Tightest Week and bills calendar both get calmer, because the money is already set aside when the bill lands.
Note β€” Goals count as money kept
Funding a goal is saving, not spending. The Savings Rate insight counts money going into a goal category as kept, exactly as it does savings and debt principal β€” otherwise the app would mark you down for the behaviour it's asking you to adopt.

15 The Bills Calendar

The Bills Calendar section β€” headed Pay vs bills β€” draws a calendar of the forecast, one square per day, coloured by that day's net: green where money lands, red where it leaves, barely tinted where nothing much happens. Step through the months with the arrows, and click a day to see exactly what falls on it and for how much.

Why a calendar, when you already have monthly totals

Because a month is not experienced as a total. Consider a perfectly ordinary month that ends $300 up β€” a good month by every summary row in the app. Now look at the shape of it: rent, the car payment and the insurance renewal all fall on the 1st and 2nd, and the paycheck doesn't arrive until the 14th. Between those dates you are living on whatever was left over, and the monthly figure said nothing about that.

The calendar is where you see it β€” and where you see the fix, which is usually not "spend less" but "move that direct debit to the 16th". Most banks will change a payment date if you ask.

Tip β€” Read it alongside Tightest Week
The Tightest Week insight names the worst seven-day stretch in the horizon. The calendar shows you what's in that stretch. One tells you there's a problem, the other tells you which bill to move.

16 Scenarios

A scenario is a named set of changes layered over your base plan. It doesn't edit your plan β€” it's a lens you look through, and you can take it off again.

Each scenario holds any number of changes, and there are only three kinds:

  • Add a transaction that doesn't exist in the base plan β€” childcare, a second rent, a new subscription
  • Remove one that does β€” the rent on the flat you're leaving
  • Modify one β€” change its amount, its start or end date, its escalation, or pause it
ScenarioTypically holds
New jobModify the salary line upward from a start date; add a commute; remove the freelance income it replaces
BabyAdd childcare from a date; pause the travel fund; modify groceries upward
The moveEnd the current rent in June; add the new, larger one from July; add a one-time moving cost and deposit
Lean monthCut the discretionary lines by half and see how much runway that actually buys

Switching and comparing

The Scenarios section lists your base plan first β€” labelled everything you have entered β€” with each scenario beneath it, and marks which one is active. Activate a scenario and the entire app recalculates through it: the forecast grid, every chart, every insight card. Switch back and everything returns. Your base plan is never modified in place, so there is nothing to undo and nothing to be careful about; a scenario you delete takes only its own changes with it.

Underneath, Base plan vs each scenario is the view to reach for when you're actually deciding. Each row is the whole forecast rebuilt with that scenario's changes applied, so you can read closing cash, net worth and monthly net down the column instead of trying to remember what the numbers looked like a minute ago. Nothing you've entered is altered by looking.

Tip β€” Build the scenario before the conversation
"Can we afford it?" is much easier to answer with two columns on screen. Build the scenario first, look at the comparison, then have the discussion β€” the argument tends to be shorter, and about the right things.
Note β€” Scenarios versus duplicating a transaction
Duplicating and pausing transactions still works for a quick one-line what-if. Reach for a scenario when the change is several transactions that belong together, when you want to keep it around, or when you want to compare it against the base plan rather than replace it.

17 Export, Import & Backup

Your data lives in your browser's LocalStorage β€” it persists between visits on the same browser and device. But LocalStorage can be cleared. Export regularly to keep a portable backup.

Excel (⬇ Export / Data β–Ύ β†’ Import Excel workbook)

The Excel workbook contains five sheets:

SheetContents
AccountsEvery account β€” id, name, type, starting balance, as-of date, plus apr and minPayment for credit cards
CategoriesEvery category β€” id, name, kind, color, plus the target amount and target date on Goal categories
TransactionsEvery transaction with all its fields β€” kind, amount, category, account (and from-account for transfers), frequency, custom interval, start and end dates, escalation, tags, notes, paused state
SettingsSchema version, currency, the global forecast horizon, and one row per per-chart horizon override β€” so a re-import restores the same view you left, not just the same numbers
ForecastA snapshot of the projection: one row per transaction (name, its category, a column per month, and a total), then the income, expense, net cash flow and closing balance summary rows

The first four sheets are what get read back on import. The Forecast sheet is a rendered snapshot for reading and charting in Excel β€” it's written on export and ignored on import, since the app recalculates the projection from your accounts and transactions every time.

Important β€” Replace-all import
Importing a file β€” Excel or JSON β€” completely replaces everything in your browser with the contents of the file. A confirmation dialog warns you first, and the message afterwards offers Undo if you've changed your mind. This is intentional: the file is the source of truth. Nothing in a file is taken on trust either β€” every field is checked, and if anything had to be skipped or repaired (a row with no name, an end date before its start date) you get an "Import notes" summary saying exactly what.

To edit amounts in Excel and re-import: export β†’ open the Transactions sheet β†’ change any amount, frequency, or date β†’ save β†’ import the file back. Every change ripples through the forecast and charts immediately.

A file written by a newer version of the app is refused rather than imported, because loading it here would silently drop the fields this build doesn't know about and then save that loss back over your data. The message tells you which format version the file is and which one this copy understands.

JSON (Data β–Ύ β†’ Export JSON / Import JSON file)

A lighter alternative to Excel β€” a single .json file containing all your state. Useful for quickly transferring data between browsers or devices, or sharing a budget template with someone else. Same replace-all import semantics apply.

JSON is the complete one. The workbook is designed to be readable and editable in Excel, so it carries accounts, categories, transactions and settings. The JSON file carries everything the app knows β€” including your imported actuals, your check-in history and your scenarios. If you're moving to a new machine or keeping one true backup, make it the JSON.

Encrypted export (optional)

The Encrypted export block of the Backup & Portability section writes a JSON export that's scrambled with a passphrase β€” worth doing when the file is headed for a shared computer, a USB stick, or a backup somewhere you don't fully control.

Type the passphrase twice, tick the box confirming you understand it can't be recovered, and press Export encrypted JSON. To open one again, use the ordinary Import JSON file item under Data β–Ύ and pick the encrypted file β€” you're asked for the passphrase at that point.

The scrambling uses the browser's own encryption engine: the passphrase is stretched into a key with PBKDF2-SHA256 (310,000 rounds), and the file is encrypted with AES-GCM. No server, no account, no key held anywhere β€” this is a lock on a file on your disk, applied on your machine.

Important β€” Forget the passphrase and the file is gone. Permanently.

There is no reset link, no recovery code, no security question, no support address and no back door. Nobody can open that file for you β€” not the person who wrote this app, not anyone. That isn't an oversight or a feature nobody has got round to: a back door would defeat the entire point of encrypting it.

Before you encrypt anything, decide where the passphrase is written down β€” a password manager, or paper somewhere you trust. Keep a plain export as well until you're certain the passphrase is safe. If you'd rather not carry that risk at all, don't encrypt: an ordinary export in a folder only you can reach is a perfectly reasonable choice, and it's the default.

Note β€” Two limits worth knowing
Encryption applies to the JSON export only β€” an encrypted .xlsx wouldn't open in Excel, which is the whole point of the workbook. And a connected live file is always written in plain text, since the app has to be able to read and rewrite it continuously. Browsers also withhold their encryption engine from pages opened straight from a folder, so if you're on a file:// address the block will say so; serving the folder over http://localhost enables it.

The export-age indicator

The app keeps track of when you last exported and shows it in the top bar β€” Exported today, Exported 12d ago, or Never exported. If it's been more than a month and you have data worth losing, it says so and offers both export buttons on the spot. It's the one nag in the app, and it's there because a cleared browser takes an un-exported budget with it.

Tip β€” Regular backups
Export to Excel at the end of any session where you've made significant changes. Keep the file in a cloud-synced folder (iCloud, Google Drive, Dropbox) and you'll always have a recoverable copy regardless of browser cache clearing.

18 Live Workbook Mode

Normally the cycle is: work in the app, remember to export, and later import the file back. The Live file block of the Backup & Portability section removes the round trip. Connect the app to a .json or .xlsx file on your computer and every save writes that file as well as the browser. The spreadsheet stops being a snapshot you remember to take and becomes the data itself.

Connecting

  • Connect a file β€” choose a location and name, and the app creates the file and starts writing it. Pick .json for everything, or .xlsx if you want the workbook itself to be the live file.
  • Use an existing file β€” point at a file you already have. Because that file and the browser can disagree, you're asked which way to resolve it first: load the file into the app (replacing what's in the browser) or overwrite the file with what the browser holds. It won't guess.
  • Write now and Load from file force a save or a reload on demand β€” handy after another device has been editing.
  • Reconnect appears when the app remembers your file from a previous session but the browser needs you to re-grant permission. Disconnect stops writing; the file stays exactly as it was last written.

Sync with no server, no account, and no third party

Put that file in a folder your computer already syncs β€” iCloud Drive, Dropbox, OneDrive, Google Drive, Syncthing β€” and you have multi-device sync for free. Your sync client moves the file exactly as it moves your other documents, and every device opens the same one. Nothing about your budget passes through anything belonging to this app, because there is nothing belonging to this app: no service, no account, no server, and nothing of yours on anyone else's computer.

Watch out β€” Last write wins
File sync is not merging. If two devices are editing the same file at once, one version wins and the other's edits are lost β€” or your sync client leaves a "conflicted copy" beside the original. Let one device finish syncing before you pick up the next, and if another device has been at it, press Load from file before you start editing.

Where it works

Live mode uses the browser's File System Access API, which exists only in Chromium-based browsers β€” Chrome, Edge, Brave, Opera, Arc β€” and only on a secure origin. Two consequences worth knowing:

  • Firefox and Safari don't implement it at all, so the buttons won't appear there.
  • Opening the app straight from a folder isn't enough. No browser hands a file:// page write access to a file on your disk. Serve the folder over http://localhost (for example python3 -m http.server in the project folder) or use a hosted copy over https.

Whenever it's unavailable, the panel says which of those reasons applies rather than simply hiding. And it isn't a downgrade: the export and import buttons remain the fully-supported path everywhere, with the same data and the same formats. Nothing is locked behind live mode.

What to expect

  • The browser asks permission for that one file. You pick it; the app can touch nothing else. Being asked again in a new session is the browser protecting you, not a fault β€” press Reconnect.
  • Writes are debounced and rate-limited. Changes land in the file a moment after you stop editing, and never more than once a second, so a burst of typing doesn't thrash your disk or your sync client.
  • LocalStorage keeps working too. Connecting a file adds a destination; it doesn't remove the one you had.
  • A live file is written in plain text β€” the app has to reread and rewrite it constantly. If you need the file locked, use an encrypted export instead.
Tip β€” Keep dated exports as well
A live file is a working file: whatever you do is done immediately, mistakes included. Export a plain dated copy every so often and keep it somewhere the live file isn't. Live mode is convenience; that copy is your safety net.

19 Settings & Housekeeping

Everything the app can be configured with lives in the top bar and its Data β–Ύ menu. There is no settings page, no account, and nothing to sign in to.

Currency

The currency dropdown covers USD, EUR, GBP, CAD, AUD, and JPY, and it changes how every number in the app is formatted β€” the symbol, the separators, and the decimal places your locale expects. It does not convert anything: switching from USD to EUR turns $1,234.56 into €1,234.56, not into today's exchange rate. Pick the currency you actually budget in and enter your amounts in that currency.

Forecast horizon

The horizon dropdown next to it sets the length of the forecast for the grid and every chart at once. End of Year is the months remaining in the current calendar year, which shrinks as the year goes on β€” useful in January, less so in December. Individual charts can override it; see the Charts section.

Collapsible sections

Within a view, every section carries a β–Ύ toggle in its header β€” Categories and Transactions, the forecast and the charts, balances, the calendar, check-ins, variance, debt, goals, scenarios and the workbook panel. Collapse the ones you're not working on. Between views, use the rail on the left, the keys 1–6, or the command palette.

Keyboard shortcuts

These work anywhere except while you're typing in a field. Press ? in the app for the same list.

KeyWhat it does
⌘K / Ctrl KOpen the command palette
1–6Switch view: Overview, Plan, Forecast, Reality, Planning, Backup
nNew transaction
aNew account
/Jump to the transaction search box
eExport an Excel workbook
jExport a JSON file
EscClose a panel, menu or dialog, or cancel the edit in progress

Where your data lives

Everything is saved to your browser's LocalStorage, automatically, a moment after each change. That storage is tied to this browser on this device: your budget won't follow you to a different browser, a different machine, or a private window, and clearing site data removes it. Moving between devices is what the JSON export β€” or live workbook mode β€” is for.

That's the complete list of places your data goes: this browser, and any file you explicitly export or connect. There is no account, no server and no cloud copy, so there is nothing to sign into and nothing to delete anywhere else.

Undo

Deleting an account, a category, or a transaction β€” one at a time or several from the bulk bar β€” puts a message in the bottom corner of the screen with an Undo button next to it. So does an edit made in the table, and a bulk pause or resume. One click puts everything back exactly as it was, including any transactions that were reassigned as part of the delete. It's a single level of undo β€” the last destructive action, not a full history β€” so use it while the message is still on screen.

Reset

Reset everything, at the bottom of the Data β–Ύ menu, clears your data after a confirmation dialog. It removes every account and every transaction and returns your settings to their defaults β€” and it restores the 19 default categories, including any you had renamed or deleted. It's a clean slate, not an empty one. Export first if there's anything you'd want back.

Important β€” Export is your only backup
There is no cloud copy of your budget, because there is no cloud. If LocalStorage gets cleared and you have no exported file, the data is gone. Export to Excel or JSON after any session where you changed something that mattered β€” and remember that JSON is the format that carries your actuals, check-ins and scenarios as well.

20 Pro Tips

πŸ“…

Plan around 3-paycheck months

When the Insights panel flags a 3-paycheck month, add a one-time transaction in that month β€” an extra savings deposit, a debt payment, or a planned purchase β€” so the windfall has a destination before it arrives.

πŸ“ˆ

Use escalation on rent and raises

Add an annual escalation % to your rent (5–10% is typical in many markets) and to your paycheck (2–4% COL raise). Over 24–36 months the compounding effect on your forecast becomes very visible.

πŸ”

Duplicate to create variants

Choose Duplicate from the β‹― menu on any transaction to quickly create a copy. Useful for modeling a second job, a spouse's income, or a what-if scenario β€” add it, check the forecast, then delete or pause it.

⏸️

Pause instead of delete

If a subscription is on hold, a project income ended, or a seasonal expense is off, choose Pause from its β‹― menu rather than deleting it. It disappears from the forecast but is there to resume with one click when circumstances change.

🏷️

Tag cross-cutting expenses

Use tags like kid, work, or shared on transactions that don't fit neatly into one category. Tags are searchable in the transaction list, making it easy to filter to just the items that matter for a given conversation.

πŸ”š

Set end dates on temporary expenses

Loan payoffs, introductory subscription prices, a sublease β€” give them an end date so the forecast automatically stops counting them after that point. The impact on your future balance appears immediately.

πŸ“Š

Use 36-month Running Balance

Set the Running Balance chart to 36 months even if your main horizon is 12. The long-arc view reveals whether your savings are genuinely growing or just holding steady, which the short view can obscure.

πŸ“₯

Import three months, then recalibrate once

Download three months of transactions from your bank, import them, and work through the Plan vs Actual suggestions in one sitting. It's the single highest-value hour you can spend in this app: everything downstream β€” insights, bands, scenarios β€” gets more honest at once.

πŸ“

Check in every payday

Attach a balance check-in to something you already do. Payday works well. A run of small drifts is far more informative than one heroic reconciliation every six months.

🎭

Keep a "lean month" scenario on file

Build a scenario with the discretionary lines halved and leave it there. When something goes wrong, you already know exactly how much runway cutting back buys you, and you don't have to work it out in a bad week.

πŸ’³

Test the extra payment before committing it

In the payoff planner, try the extra payment at $50, $100 and $200 before deciding. Seeing the debt-free date jump is a better motivator than any amount of resolve.

πŸ’Ύ

Edit in Excel, re-import

If you prefer editing in a spreadsheet, export to Excel, make bulk changes to amounts, dates, or frequencies in the Transactions sheet, and re-import. All changes ripple through the app instantly. It's the fastest way to do a full budget overhaul.

πŸ”­

Built for the Observation Deck

Cashflow Compass uses the Observation Deck's dark "mission control" theme β€” the same design language as the rest of the fleet. Mono uppercase labels mark anything data-ish, and every number is set in tabular figures so columns line up as values change.