How far is the job from optional?
Your financial independence ladder in the Omarchy bar — walk-away money, Coast FI, and the date the job stops being compulsory. Everything is priced in days of living, not currency: at €30,000 a year one day costs about €82, so a month's saving buys you a number of future days, and your pot earns a number of its own.
NEXT · COAST FI
52.8% of the time €121k to go · age 41
████████████░░░░░░░░░░░░░░░░
€100k of €221k · 45% of the money
├────┼──────┼───█──────┼──────────────┤
✓ runway · ✓ walk-away · ▸ coast · lean @51 · full @57
days of freedom per month
you buy 12.2
the pot earns 5.1
Most people find the gap between Coast FI and Full FI is the number that changes how they think. Coast FI is the pot that grows to your FI number by your target age with no further contributions — it usually arrives fifteen years before the finish line, and it's the point the pressure comes off.
The panel mid-journey, and the settings page. Both render in whatever theme Omarchy is running — every colour is a theme token, nothing is hardcoded.
Omarchy 4 (quattro) or later. This is a Quickshell bar widget built against
Omarchy's plugin API and its qs.Ui component kit — it will not run on Omarchy 3,
on plain Hyprland, or on any other desktop. There is no standalone mode.
It also needs python3, which Omarchy already ships. Nothing else: no network
access, no accounts, no other dependencies.
omarchy plugin add https://github.com/KevHQ/escape-velocity.git --enableThat stages the repository, validates it, installs it under its manifest id, puts it on the right of your bar, and shows you Omarchy's warning that plugin code runs unsandboxed — which you should read before enabling anything, including this.
| Left click | open the ladder |
| Middle click | recompute now |
enter |
save the balance you typed |
r |
refresh |
esc |
close |
Bind it if you like:
o.bind("SUPER + SHIFT + F", "Escape Velocity", "omarchy-shell escape-velocity toggle")Open the panel and hit Edit. Everything is there — expenses, contribution,
real return, withdrawal rate, ages, and the display options — and each change is
written straight to shell.json, which hot-reloads, so the ladder recomputes
as you type.
Bar shows switches the pill between icon (the glyph alone — the default,
matching Omarchy's other bar widgets), percent, years (to full FI), and
next (progress toward the next unreached rung). Hide amounts blanks every
figure for screen sharing, leaving the progress bars.
Same settings from a script, if you prefer:
omarchy bar set io.github.kevhq.escape-velocity annualExpenses 42000 --json
omarchy bar set io.github.kevhq.escape-velocity barMode "years"Pass --json for anything numeric or boolean, or it lands in shell.json as a
string.
No accounts, no API keys, no network calls, no telemetry. The only state is one JSON file:
~/.local/share/escape-velocity/snapshots.json
Plain, sorted, and yours — back it up or edit it by hand. Privacy mode hides every amount and shows progress only, for screen shares.
The state file is user-writable and the shell that reads this plugin's output is long-lived, so both boundaries are bounded rather than trusted:
| snapshots.json read cap | 1 MiB, rejected unparsed above that |
| retained snapshots | 2,000 (one per day, so about five and a half years) |
| emitted payload | 256 KiB, refused above that |
| diagnostics | truncated before they reach the panel |
Oldest snapshots are pruned on write. Nothing here should ever be reached in normal use — a decade of daily entries is under 200 KB.
omarchy plugin disable io.github.kevhq.escape-velocity
omarchy plugin remove io.github.kevhq.escape-velocity
rm -rf ~/.local/share/escape-velocity # your recorded balancesSettings live on the widget's entry in ~/.config/omarchy/shell.json and go
with the widget. Nothing else is written anywhere: no system files, no
services, no autostart entries.
bin/ev-reset returns the plugin to a fresh install without uninstalling it.
Every figure is computed in bin/ev.py, not in QML, so you can audit it without
a compositor:
python3 bin/ev.py selftest # verifies the projection against hand-checked values
python3 bin/ev.py status # the exact JSON the widget renders
python3 bin/ev.py snapshot 125000The self-test checks that 4% gives 25x, that the monthly rate compounds to the annual one rather than being a twelfth of it, that unreachable targets return "never" instead of a wrong date, and that Coast FI matches the closed-form discount. It found a bad constant while this was being written, which is rather the point.
MIT.
This is a calculator, not financial advice. It does not know about tax, pensions, property, debt, or your actual life.
Why it's built this way — what it deliberately doesn't model, money versus time, and the limits worth knowing: docs/DESIGN.md.

