# Methodology — How The Instruments Are Built and Verified

> Every formula, rounding rule and test case behind The Brink Labs instruments, plus exactly what this website does and does not do with your data.

Canonical: https://thebrinklabs.com/methodology/  
Source: The Brink Labs · support@thebrinklabs.com · Last reviewed 2026-09-25

---

Methodology

## Methodology — Checkable, Not Trustworthy.

Every instrument on this site runs entirely in your browser, uses a published formula, and must agree to the cent with a second, independently written implementation before it ships. This page lists the formulas, the rounding rules, the test cases each instrument must pass, and exactly what the website does with your data: nothing.

Ten instruments · Thirty published test cases · Last reviewed 25 Sep 2026

01 — This Website

## What This Website Does, And Does Not Do.

- **No cookies.** None are set, by us or by anyone else.
- **One stored key.** `bl-theme`, holding `light` or `dark`, written only when you use the theme switch. The instruments store nothing at all.
- **No analytics, advertising or session recording.** No third-party script, font or image is loaded; every file comes from thebrinklabs.com.
- **No network request carries your figures.** Every calculation runs in your browser, and there is no endpoint that could receive what you type.
- **One campaign tag.** Links to Google Play carry a campaign tag naming the page the link sits on. It identifies the page, not you.
- **Ordinary request logs.** Cloudflare, our host, sees what any web server sees: the page requested, when, and the network details every browser sends. It never sees what you type into an instrument.
- **Enforced, not promised.** The Content-Security-Policy lets the browser run only this site’s own script files and one hashed start-up snippet, and allows connections to no other origin.

Check it yourself: open your browser’s developer tools, choose the Network tab, and type into any instrument. No request appears.

02 — Verification

## How An Instrument Is Verified.

- **Two implementations.** Each instrument’s arithmetic is written once in the page’s JavaScript and again, independently, from the written specification in plain Python.
- **Parity to the cent.** Both run the same published test cases and must agree to the cent, or to 0.01 years for durations.
- **Edge cases are cases.** Zero, negative and empty inputs and twelve-digit values are in the set, not an afterthought.
- **A failing case blocks release.** Nothing ships because it is close.

03 — Rounding

## Rounding, Stated Once.

- Where a schedule is built, money is held in whole cents, never in floating-point fractions of a cent.
- Rounding is half-up to the cent: 0.005 becomes 0.01.
- The final payment of a schedule absorbs any rounding residue, so the balance ends at exactly zero.
- Durations are shown to two decimals in years, or rounded up to whole months where they count deposits.
- Percentages are shown to one decimal.

04 — Formulas

## Every Formula, With Its Test Cases.

Three published cases per instrument. The new instruments’ cases come from the reference implementation; the others are the figures each page boots on, recomputed from its shipped code.

[**01** Zero-Based Budget](https://thebrinklabs.com/methodology/#zero-based-budget)

[**02** 50/30/20 Budget](https://thebrinklabs.com/methodology/#50-30-20-budget)

[**03** True Hourly Wage](https://thebrinklabs.com/methodology/#true-hourly-wage)

[**04** Subscription Audit](https://thebrinklabs.com/methodology/#subscription-audit)

[**05** Emergency Fund](https://thebrinklabs.com/methodology/#emergency-fund)

[**06** Savings Goal](https://thebrinklabs.com/methodology/#savings-goal)

[**07** Loan & EMI](https://thebrinklabs.com/methodology/#loan-amortization)

[**08** Debt Payoff](https://thebrinklabs.com/methodology/#debt-payoff)

[**09** Rule of 72](https://thebrinklabs.com/methodology/#rule-of-72)

[**10** Net Worth](https://thebrinklabs.com/methodology/#net-worth)

Instrument 01 · Plan

### [Zero-Based Budget Calculator](https://thebrinklabs.com/tools/zero-based-budget/)

```text
To Assign = Income − Σ Assigned
Category balance = Assigned − Spent (a negative balance must be covered from another category or from To Assign)
```

- Income is take-home pay that has actually arrived, not salary before tax.
- One month at a time; next month starts from next month's income.
- Savings and extra debt payments are categories like any other.

| Test case | Expected result |
| --- | --- |
| Take-home 5,000 on the 50/30/20 preset | Needs 2,500 · wants 1,500 · extras 1,000 · To Assign 0.00 across 10 envelopes |
| Take-home 3,333.33 on the same preset | Assigned exactly 3,333.33: the remainder lands on the last envelope, so To Assign is 0.00 to the cent |
| Take-home 4,200 on the Balanced 60/20/20 preset | Needs 2,520 · wants 840 · extras 840 |

Instrument 02 · Plan

### [50/30/20 Budget Calculator](https://thebrinklabs.com/tools/50-30-20-budget/)

```text
Target_b = Income × p_b ÷ 100, with p_needs + p_wants + p_savings = 100
Share_b = Actual_b ÷ Income × 100
Gap_b = Actual_b − Target_b
Unallocated = Income − Σ Actual_b
```

- Income is after tax. Pre-tax retirement contributions are already outside take-home pay.
- Minimum debt payments are needs; anything above the minimum belongs in the 20%.
- Needs are costs you would still pay after losing your job; wants are everything you could pause.

| Test case | Expected result |
| --- | --- |
| Income 4,000 at 50/30/20; actual 2,300 / 1,100 / 600 | Targets 2,000 / 1,200 / 800 · shares 57.5% / 27.5% / 15.0% · gaps +300 / −100 / −200 · unallocated 0 |
| Income 5,250 at 60/20/20; no actual figures | Targets 3,150 / 1,050 / 1,050 |
| Income 4,000 at 50/30/25 | Refused: the ratios total 105%, so no targets are shown |

Instrument 03 · Plan

### [True Hourly Wage Calculator](https://thebrinklabs.com/tools/true-hourly-wage/)

```text
True rate = (Take-home pay − Work-only costs) ÷ (Paid hours + Commute hours + Unpaid hours)
Price in hours = Price ÷ True rate
```

- All figures cover the same period (a week or a month).
- Only costs that exist because you work are subtracted.
- Salary converts at 2,080 paid hours a year (40 × 52) unless you enter your real hours.

| Test case | Expected result |
| --- | --- |
| Take-home 3,600 a month; 40 paid hours, 4 unpaid and 5 commuting a week; 340 a month of work-only costs | Stated 20.77 an hour · true 15.35 an hour · 26% lower (the page boots on this) |
| The same, pricing a 19.99 monthly charge | 1.3 hours of work every month |
| Take-home 3,000 a month; 40 paid hours a week; no unpaid hours or costs | Stated and true both 17.31 an hour · gap 0% |

Instrument 04 · Protect

### [Subscription Bleed Audit](https://thebrinklabs.com/tools/subscription-audit/)

```text
Monthly = price normalised (yearly ÷ 12, quarterly ÷ 3, weekly × 4.333)
Cost per use = Monthly ÷ uses per month
Opportunity cost = each payment invested at the start of its month at rate r, the payment rising by g each year (annuity-due with escalation)
```

- Uses per month are your honest estimate.
- Price rises and investment return are rates you choose; neither is a forecast.
- Taxes and exchange fees on foreign subscriptions are not modelled.

| Test case | Expected result |
| --- | --- |
| 10 a month for 10 years, prices rising 5% a year, 0% return | 1,509.35 paid, against 1,200 at a flat price |
| 97 a month (1,164 a year) for 10 years, 4% yearly rises, 7% return | 13,975 paid · 19,601 had the same money been invested |
| 14.99 a month, used weekly (4.333 times a month) | 3.46 per use |

Instrument 05 · Protect

### [Emergency Fund Calculator](https://thebrinklabs.com/tools/emergency-fund/)

```text
Runway (months) = Savings ÷ Essential monthly costs
Target_k = k × Essential monthly costs
Months to target = (Target − Savings) ÷ Monthly contribution
```

- Only essential costs count — what you would still pay after losing your income.
- Savings means money you can reach within days without penalty.
- No interest is added; the runway is deliberately conservative.

| Test case | Expected result |
| --- | --- |
| Savings 4,200; essentials 2,150 a month | Runway 1.95 months (shown rounded as 2) · 8,700 short of six months (the page boots on this) |
| The same, adding 350 a month | Six months of essentials (12,900) reached in 25 months |
| Savings 9,000; essentials 3,000; adding 500 a month | Runway 3.0 months · six months (18,000) reached in 18 months |

Instrument 06 · Protect

### [Savings Goal Calculator](https://thebrinklabs.com/tools/savings-goal/)

```text
i = (1 + APY)^(1/12) − 1 (monthly rate from APY)
Monthly = (Target − Saved × (1 + i)^n) × i ÷ ((1 + i)^n − 1); when i = 0: (Target − Saved) ÷ n
Months, given a monthly amount P: n = ln((Target × i + P) ÷ (Saved × i + P)) ÷ ln(1 + i), rounded up; when i = 0: (Target − Saved) ÷ P, rounded up
```

- Deposits are made at the end of each month.
- Interest compounds monthly at the rate implied by the APY you enter.
- Tax on interest is not modelled.

| Test case | Expected result |
| --- | --- |
| Target 3,000; saved 600; 12 months; 0% APY | 200.00 a month |
| Target 3,000; saved 600; 12 months; 4% APY | 194.46 a month |
| Target 800; saved 200; 0 months | Due now, with a shortfall of 600 |

Instrument 07 · Borrow

### [Loan Amortization & EMI Calculator](https://thebrinklabs.com/tools/loan-amortization/)

```text
i = annual rate ÷ 12
Payment = P × i ÷ (1 − (1 + i)^−n); when i = 0: P ÷ n
Each month: interest = balance × i; principal = payment + extra − interest; balance −= principal
```

- Fixed rate for the whole term; interest calculated monthly on the outstanding balance.
- The rate entered is the nominal annual rate, not an APR that includes fees.
- Extra payments go entirely to principal and shorten the term; the payment stays the same.

| Test case | Expected result |
| --- | --- |
| 20,000 at 7% for 60 months | 396.02 a month · 60 payments · 3,761.48 interest · 23,761.48 paid |
| The same with 100 extra a month | 396.02 a month · 47 payments · 2,867.74 interest · 22,867.74 paid |
| 10,000 at 0% for 24 months | 416.67 a month · 24 payments · 0.00 interest · 10,000.00 paid (the last payment is 416.59) |

Instrument 08 · Borrow

### [Debt Payoff Calculator](https://thebrinklabs.com/tools/debt-payoff/)

```text
Monthly interest = balance × APR ÷ 12
Pay every minimum; send all extra to the target debt (highest APR for avalanche, smallest balance for snowball)
When a debt clears, its minimum rolls into the next target
```

- Interest is charged monthly at APR ÷ 12; card issuers usually charge daily, so real figures differ slightly.
- Rates and minimums stay fixed.
- No new borrowing during the plan.

| Test case | Expected result |
| --- | --- |
| Card 6,200 at 24.9% (minimum 155), store card 900 at 18.9% (30), car loan 8,600 at 6.9% (245); 200 extra a month | Avalanche 30 months, 2,758.47 interest · snowball 30 months, 2,850.89 interest (the page boots on this) |
| The same debts with no extra payment | Avalanche 52 months, 6,553.26 interest |
| One card: 1,000 at 24% APR, minimum 50, no extra | Clear in 26 months, 289.88 interest |

Instrument 09 · Grow

### [Rule of 72 Calculator](https://thebrinklabs.com/tools/rule-of-72/)

```text
Rule of 72: t ≈ 72 ÷ r (r in per cent)
Exact, yearly compounding: t = ln 2 ÷ ln(1 + r ÷ 100)
Exact, monthly compounding: t = ln 2 ÷ (12 × ln(1 + r ÷ 1200))
Continuous compounding: t = 69.3 ÷ r
```

- The rate is constant for the whole period.
- No additions or withdrawals — pure compounding of one amount.
- Growth rates are inputs you choose, not forecasts; nothing here is investment advice.

| Test case | Expected result |
| --- | --- |
| 8%, compounded yearly | Rule 9.00 years · exact 9.01 · error −0.01 years (−0.1%) · closest rule: 72 |
| 24%, compounded monthly | Rule 3.00 years · exact 2.92 · error +0.08 years (+2.8%) · closest rule: 70 |
| 1%, compounded yearly | Rule 72.00 years · exact 69.66 · error +2.34 years (+3.4%) · closest rule: 70 |

Instrument 10 · Grow

### [Net Worth Calculator](https://thebrinklabs.com/tools/net-worth/)

```text
Net worth = Σ Assets − Σ Liabilities
Liquid net worth = cash and instant-access savings − short-term debt
Debt-to-asset ratio = Σ Liabilities ÷ Σ Assets
Trajectory, monthly: NW ← NW + max(NW, 0) × i + S, i = (1 + g)^(1/12) − 1
```

- Assets at resale value today; debts at the outstanding balance.
- Growth applies to a positive position only, at one blended rate — a deliberate simplification stated on the page.
- The monthly amount is what you add to net worth: savings plus debt principal repaid.

| Test case | Expected result |
| --- | --- |
| Start 53,000; +500 a month; 5% growth; 10 years | 163,513.00 |
| Start −20,000; +800 a month; 5% growth; 5 years | 30,029.10 |
| Start 0; +0 a month; 5% growth; 10 years | 0.00 |

05 — Limits

## What We Do Not Model.

- **Tax** — on income, on interest, or on gains.
- **Fees** beyond the ones you enter yourself.
- **Jurisdiction rules** — minimum-payment formulas, deposit protection limits, local lending law.
- **Variable or promotional rates.** Every rate is held constant for the whole period.

Each of these would need a data feed that goes stale, or a jurisdiction the page cannot know. An instrument that is quietly wrong for half its readers is worse than one that tells you what it leaves out.

06 — Corrections

## Corrections.

Found an error? Email [support@thebrinklabs.com](mailto:support@thebrinklabs.com) with the instrument, the inputs and what you expected. Confirmed errors are fixed and logged here with the date.

No corrections yet.

Last reviewed 25 Sep 2026.

---

This is the markdown representation of https://thebrinklabs.com/methodology/, published so that AI agents and answer engines can read the page without parsing HTML. The full index of machine-readable resources is at https://thebrinklabs.com/llms.txt
