This article explains the Filip note panel at the bottom of Finances › Overview: which instrument it tracks, where its numbers come from, how each note clause the panel cites (§2.3, §3.2, §4.1, §4.2) is applied in the tracker, why two early payments sit outside the schedule, and the one command to run after signing. It documents the console's arithmetic; the note itself is the contract.
The instrument and the source of truth
The panel tracks the Secured Promissory Note — Investor Buyout (v2, Bloom project j469vmm659e0q) between Black Fodder Coffee and Filip Wolfart. Its header shows the rate currently in force and the loan year (n of 5).
Every number comes from one place: scripts/filip-note-tracker.py. The dashboard backend calls its json command and renders the result; the panel derives nothing in JavaScript except the progress bar, so it cannot drift from the schedule the note incorporates. The refresh icon recalculates from the ledger. Storage is Supabase (filip_note_config, filip_note_rates, filip_note_payments, migrated 2026-08-31), with a local-JSON fallback at data/filip-note-ledger.json only when Supabase credentials are unreachable.
| Fixed term | Value |
|---|---|
| Principal | $274,447.21 |
| Installments | Due the 1st of each month; first 2026-10-01; maturity 2031-09-01 (§3.3) |
| September 2026 interest | $1,715.30, separate from principal (§3.3) |
| Rate | WSJ Prime, floor 4.50%, no ceiling; 7.50% for loan year 1 (§2.1/§2.2) |
| Loan year | Counted from anniversaries of the Date of Note, capped at 5 |
§2.3 — annual rate reset
The rate resets on each anniversary of the Date of Note, and the installment is recalculated at each reset to amortize the remaining balance over the remaining term, seasonally weighted per §3.2. In the tracker, the base installment is solved so that the balance reaches zero at maturity, using each month's own rate segment, so a schedule that spans a future reset stays honest. The Seasonal schedule section is labelled "current tiers" because it shows the base in force now, not the last value after every future reset.
At each anniversary the step is:
python3 scripts/filip-note-tracker.py set-rate --date YYYY-MM-DD --rate PCTpython3 scripts/filip-note-tracker.py scheduleto regenerate the remaining Exhibit A (CSV indata/)- Send the regenerated Exhibit A to Filip with the §9.2 annual statement
Interest accrues monthly on the due date at balance × rate ÷ 12, on the actual unpaid principal (§2.4). Each payment applies to accrued interest first, then principal (§3.4).
§3.2 — seasonal weights
Installments are weighted to the café and catering revenue cycle. The weights average to 1.0 across each year, so the term and maturity are unchanged; only the shape of the year changes.
| Months | Weight | Panel row |
|---|---|---|
| Jun – Sep | × 1.5 | high tier |
| May, Oct – Dec | × 1.0 | base tier |
| Jan – Apr | × 0.5 | low tier |
A scheduled payment is base × the month's weight. The final installment is the full remaining balance plus that month's interest.
§4.1 — extra principal
Partial prepayments are always penalty-free, are applied to principal on their own date, and leave every due date unchanged. In the tracker a prepayment lowers the balance used at the next interest accrual, and the base installment is recomputed at the next §2.3 anniversary reset — so extra principal lowers future installments; it does not shorten the term. The only way the projected payoff date moves earlier is the balance reaching zero before maturity.
The + Log payment form offers two types: Extra principal (§4.1) and Scheduled installment. The CLI accepts more:
filip-note-tracker.py add-payment --date YYYY-MM-DD --amount N --type installment|prepayment|upfront|september_interest|payoff|other [--memo TEXT]
filip-note-tracker.py sync-mercury pulls outgoing Mercury transfers to Filip Wolfart (from 2026-09-01) and classifies each by amount: $70,000 → upfront, $1,715.30 → September interest, an amount within $0.02 of that month's scheduled installment → installment, anything else → extra principal. An auto-classified extra principal is flagged for review and carries the confirm badge in Payment history until its intent is confirmed. An installment recorded within 20 days of a due date is matched to that due date. A past due date with no matching installment shows as scheduled and raises the warning "no installment recorded for … — record it (add-payment/sync-mercury) or investigate", which the panel displays as a banner.
§4.2 / §4.3 — payoff minimum interest
On a full payoff or refinancing only — never on a partial prepayment (§4.3) — a minimum interest percentage of the balance at payoff applies, by loan year:
| Loan year | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| Minimum interest | 5% | 4% | 3% | 2% | 1% |
The Payoff today KPI is outstanding principal × (1 + that year's percentage), before any accrued current-month interest. filip-note-tracker.py payoff-quote prints the same figure for the §9.2 quote.
Why the $70,000 and the $5,582.79 are "not amortized"
The $70,000 Upfront and the $5,582.79 pre-note credit (Q1–Q4 2025 PPA distributions, dated 2026-02-20, credited in Recital 3) reduced the buyout balance before the $274,447.21 principal was fixed (Recitals 3–6). They are recorded so the payment history is complete, and they carry the not amortized badge because they are excluded from the amortization: only installment, prepayment and payoff entries move the balance. Paid to date counts only amortizing payments up to today.
Reading the KPIs
| KPI | Definition |
|---|---|
| Outstanding principal | Balance after the last row dated on or before today; "of … original" is the fixed principal. |
| Next payment | First scheduled row after today, with days until due; turns amber within 7 days. |
| Paid to date | Principal paid + interest paid, history only. |
| Payoff today | §4.2 quote as above. |
| Progress bar | (original − balance) ÷ original, clamped to 0–100%. |
| Installments | Made of total, counting installment rows only; "payoff" is the projected date, contract maturity 2031-09-01. |
At signing — set the Date of Note
Until the note is signed, the anniversary and loan-year math use a placeholder date of 2026-08-15 (the earliest targeted signing date), and the panel shows the banner Not signed yet — dates are placeholders. Loan-year-1 arithmetic is unaffected by the exact day. After signing, run once:
python3 scripts/filip-note-tracker.py set-date-of-note --date YYYY-MM-DD
It records the Date of Note and aligns the initial 7.50% rate's effective date to it. The banner clears on the next refresh. Every later anniversary, and therefore every §2.3 reset and loan-year boundary, is computed from this date (day of month capped at 28).