A desktop retirement and investment planner. UK-first, built so other regions can be added later. Every number in a plan is a fact you stated, a decision you made, or an assumption the app defaulted — always inspectable, never silently guessed. All data stays local; nothing is transmitted.
(All screenshots show example data, not anyone's real finances.)
What it models today (single person, UK):
- Wrappers — workplace DC, SIPP, S&S ISA, LISA, GIA and cash, with UK contribution relief mechanics and dividend/savings taxation.
- Defined benefit pensions — deferred entitlements or active CARE-style accrual, with revaluation, early/late factors and commutation; state pension from your official DWP forecast, including deferral.
- Tax — rUK and Scottish income tax from verified 2026/27 data files; pension allowances (AA/taper/MPAA, lump-sum allowance).
- Projection — deterministic or Monte Carlo runs from the app: success rate, probability of ruin, ending-pot percentiles, and 10th/median/90th bands on the charts, reproducible from a seed. With a de-risking glide path, tax-aware decumulation with optional go-go/slow-go/no-go retirement spending multipliers, and annuity purchases entered in the facts form. (The engine also models alternative withdrawal strategies — fixed %, guardrails, natural yield — and tax-free-cash strategies; the app currently runs the fixed-real defaults, with no strategy picker in the UI yet.)
- "When can I retire?" — a solver for the earliest retirement age that sustains a target income (a replacement rate you choose, 66% of employment income by default), met deterministically or at a Monte Carlo success target.
- Historical backtesting — replays the plan over every rolling window of world market history since 1900 (global equities in sterling terms, UK gilts and cash, deflated by UK inflation): the share of historical starting years the plan survives, the worst starting year, and the range of outcomes as chart bands — sequence-of-returns risk that independent Monte Carlo draws miss.
- Scenarios — named what-ifs over your decisions and assumptions, with a side-by-side comparison; plans saved as a local JSON file.
Facts entry — everything on this screen is either a fact you state or a choice you make; anything estimated lives in the assumptions inspector instead:
Stated vs assumed — the provenance view: the facts you stated, the choices in effect, and every assumption the run used with its value, default/overridden status, source, and date:
Glidepath is a personal modelling tool for exploring retirement scenarios. It is not financial advice and is not regulated; its outputs depend on assumptions that will not match reality. Do not make financial decisions based solely on this tool.
Requires only uv:
git clone https://github.com/williajm/glidepath.git
cd glidepath
uv run glidepathThe first run creates a virtual environment and installs the locked
dependencies automatically, then launches the desktop app. Accept the
disclaimer and a fresh install
opens with an example plan already projected, so every tab has
something to show — replace its values with your own facts, or clear
the form and start blank. Charts label each bar with the tax year and
your age and switch between today's money and nominal; Help → "How to
use glidepath" walks through every tab. Save your plan from the File
menu as a .glidepath.json file you own, stored wherever you choose;
the next launch reopens your last plan automatically.
Development additionally requires GNU Make, which drives every workflow command:
make sync # create the platform venv from the lockfile (fails if the lock has drifted)
make hooks # install the pre-commit hooks (required before committing)One-time per machine: set UV_PROJECT_ENVIRONMENT user-wide (.venv-win
on Windows, .venv-wsl in WSL) so bare uv commands and the git hooks use
the same venv as make. See CLAUDE.md. (Skipping this only matters for a
shared Windows/WSL checkout — for trying the app, uv's default .venv is
fine.)
make check # all merge gates: ruff, format, mypy --strict, pytest (>=90% cov), dep age
make fix # auto-fix lint issues and reformat
make test # tests with coverage
make deps # the ONLY way to add/upgrade dependencies (7-day cooldown lock)
make audit # pip-audit the lockfile for known CVEsDependencies are never added with plain uv add/uv lock: run make deps
so the 7-day supply-chain cooldown is applied. CI runs every make check
gate plus make audit and the SonarCloud quality gate on each PR — so a
clean make check locally does not quite guarantee a green pipeline. See
CLAUDE.md for the full policies.
Releases are vX.Y.Z tags on main; each GitHub Release carries its
notes from CHANGELOG.md. There are no packaged builds
yet — run from source as above.
The code is MIT-licensed (see LICENSE). One data file is not: the
historical return series
(src/glidepath/regions/uk/data/returns_history.toml) is derived from
the JST Macrohistory Database
(Jordà, Schularick & Taylor; return series per Jordà, Knoll, Kuvshinov,
Schularick & Taylor 2019) and is distributed under
CC BY-NC-SA 4.0 —
attribution required, non-commercial use only, share-alike. The package
metadata declares MIT AND CC-BY-NC-SA-4.0 accordingly; LICENSE-DATA
and the file's own header carry the full notice, and
scripts/build_returns_history.py regenerates the file from the
upstream dataset.



