I spent a while building a personal-finance app around one idea: a price isn't really dollars, it's hours of your life. A $1,200 phone is "3 weeks of work." The dollars are an abstraction; the time is not.
The interesting part wasn't the UI — it was figuring out what the source of truth should be.
## The naive model
My first version stored everything in hours. Save $50 → store "2.5 hours saved." Clean and simple — until the user's salary changes. Suddenly all their history is wrong: those 2.5 hours were
computed against an old hourly rate.
Do you freeze the old value? Re-compute it? Both feel arbitrary, and both create migration pain every time the income profile changes.
## Flipping it: money as the invariant
The fix was to invert the model: money is the only thing stored as truth. Hours and days are never persisted — they're projections of a money amount through your current income
profile.
hoursForMoney(money, profile) = money / hourlyIncome(profile)
lifeDaysForMoney(money, profile) = money / netMonthly(profile) * 30
Your salary doubles? Your past savings now represent half as many hours — automatically. The framing shifts from "how many hours this was worth" to "your savings equal X hours of your life
right now."
## Why this paid off
This killed a whole class of edge cases:
- Editing or deleting a record just changes the money total. Every derived view — goals, achievements, streaks — recomputes reactively, because none of them store hours.
- One conversion function, one source of truth. No "4 copies of the hourly-rate formula slowly drifting apart" (which is exactly the bug I started with).
- No migrations when the profile changes — there's nothing derived to migrate.
The whole system became easier to reason about once I accepted that time is a view, not data.
## The open question
The behavioral one I still can't answer: does seeing "3 weeks of your life" actually change what people buy, or is it a novelty that wears off after a month? I have anecdotes, not data —
curious if anyone here has tried framing spending this way.
(The idea ships as a free Android app — Price of Time on Google Play — but the model above is the part I think is worth discussing.)
Top comments (0)