From aa781a2885db3b90bf5b3b8699c7e0a112290c7b Mon Sep 17 00:00:00 2001 From: Lucas Winther Date: Wed, 2 Sep 2026 02:18:26 +0200 Subject: [PATCH] docs: capture durable product truth in PRODUCT.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Written via the impeccable init flow. Records what future work must not reinvent: a permanently single-user tool for one person managing their own money, offline-only with no account, and five product principles including two the owner added directly — changing an allocation must never destroy history, and splitting a purchase across posts must stay easy. Evidence on Hand deliberately records absences: no customers, testimonials, usage data or integrations exist, and the only real content is the owner's own budget data, which never leaves their browser. Future surfaces must not manufacture them. Co-Authored-By: Claude Opus 5 (1M context) --- PRODUCT.md | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 PRODUCT.md diff --git a/PRODUCT.md b/PRODUCT.md new file mode 100644 index 0000000..8161adf --- /dev/null +++ b/PRODUCT.md @@ -0,0 +1,111 @@ +# Product + + + +## Platform + +web + +## Users + +One person: the owner of the money, managing their own budget. They are leaving +a spreadsheet, so they already know their own categories, already think in +months, and value speed of entry over guidance. They tolerate rough edges in +exchange for the tool doing exactly what they mean. + +Confirmed permanently single-user. One person, one browser, one dataset. There +are no accounts, no second role, and no shared or household use planned. + +## Product Purpose + +Envelope budgeting for a single person, replacing a spreadsheet. + +Money is divided each month into named envelopes ("posts"). Unspent allocation +carries into the next month; overspending carries forward as debt. The app +answers two questions at a glance: how much is left in this envelope, and did I +overspend. + +Success is that the owner stops maintaining a spreadsheet, and that a month's +purchases can be entered fast enough not to be a chore. + +## Positioning + +Two things a general budgeting app does not do: + +- **Envelope rollover is the whole model, not a feature.** Every figure derives + from one left-fold across months, so a balance is always the honest + consequence of every prior month. +- **The data never leaves the browser and never needs an account.** IndexedDB is + the only store. That is a deliberate product position, not a missing backend. + +## Operating Context + +The owner records spending after the fact, often in batches — a grocery trip is +twenty lines entered in one sitting, not twenty separate visits. Income arrives +monthly and varies, so it is entered per month rather than assumed. + +Purchases frequently belong to more than one envelope (food bought at a social +event), and larger purchases are spread across several months deliberately +rather than absorbed by one. + +Money is handled in DKK, USD and EUR, with DKK as the base. + +## Capabilities and Constraints + +Confirmed and in place: + +- Posts (envelopes) with monthly allocation, created and archived by the owner. + Posts are archived, never deleted, because purchases reference them. +- Allocation is either a fixed amount or a percentage of that month's income. +- A purchase can be split across several posts, by percentage or by fixed + amounts, and can also be spread across future months as a payment plan. The + two compose. +- Per-month income, entered directly, varying month to month. +- Multi-currency (DKK/USD/EUR) against a user-maintained exchange-rate table, + with an optional on-demand fetch that fails soft and is never required. +- JSON export/import and ODS (spreadsheet) export, both generated in the + browser. +- Offline-capable installable PWA. Currently deploys as one static artifact to + both GitHub Pages (under a subpath) and a self-hosted Docker image. + +Terminology: an envelope is called a **post**. A **finance plan** is a purchase +spread across months. An **override** is a one-month exception to a post's +allocation. + +Undecided: nothing outstanding at the product level. + +## Brand Commitments + +The product is called **Budget 2.0**. No logo, wordmark, or brand assets exist, +and none have been commissioned. + +## Evidence on Hand + +None, and none may be invented. This is a personal tool: there are no +customers, testimonials, case studies, usage statistics, press, pricing, or +third-party integrations. Any future surface must not manufacture them. + +The only real content is the owner's own budget data, which never leaves their +browser and is therefore never available as example material. Illustrative data +must be visibly synthetic. + +## Product Principles + +1. **Over-budget is always allowed.** The app reports the truth and never + blocks, clamps, or hides overspending. A negative balance is a normal value. +2. **Changing an allocation must never destroy history.** Adjusting what a post + gets going forward leaves what it got before intact and still visible. +3. **Splitting a purchase across posts must stay easy.** It is a routine act, + not an advanced feature, and must not be buried behind extra steps. +4. **The data stays portable and in the owner's hands.** Export is always + available and always complete; nothing traps a budget inside the app. +5. **Entry speed is a feature.** Recording a month of spending is the most + repeated act in the product, and friction there is the reason spreadsheets + get abandoned. + +## Accessibility & Inclusion + +No condition-specific requirement was established by the owner. The existing +implementation holds itself to WCAG AA contrast, visible keyboard focus, and +respecting reduced-motion preferences; keyboard-first entry is a stated goal of +the fast-entry flow rather than only an accessibility accommodation.