Skip to main content

glidepath

PyPI CI Quality Gate Coverage OpenSSF Scorecard Python versions uv Ruff Checked with mypy License: MIT + CC BY-NC-SA 4.0 data

williajm.github.io/glidepath

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.

The charts tab: the Monte Carlo fan chart — nested percentile bands deepening toward the median line — beside the success-rate readout and the retirement-age and backtest cards

(All screenshots show example data, not anyone's real finances.)

What it models today (UK, single or couple):

  • 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).
  • Couples — an optional partner, modelled end to end: one pooled household decumulation drawing tax-efficiently across both partners' wrappers with each person taxed individually (mixed rUK/Scottish residency included), the marriage allowance claimed when eligible, optional survivor modelling ("model death at age" — pensions pass as beneficiary drawdown, ISAs via the additional permitted subscription, DB schemes at their survivor fraction), and joint-life annuities paying a 50/66/100% survivor income.
  • Projection — deterministic or Monte Carlo runs from the app: success rate, probability of ruin, ending-pot percentiles, and a probability fan chart on its own tab, 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.

More screenshots

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:

The facts tab: the About you, Household spending, and State pension cards of the entry form, with the example plan's values filled in

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:

The stated-vs-assumed tab: tables of stated facts, choices in effect, assumptions used with sources, and the plan structure

Disclaimer

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.

Install

Glidepath is installed from PyPI with uv, which also fetches the Python it needs — you do not need Python installed first.

  1. Install uv. Windows (PowerShell):

    powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
    

    macOS or Linux:

    curl -LsSf https://astral.sh/uv/install.sh | sh
    

    Close and reopen the terminal, then check uv --version prints a version.

  2. Install glidepath:

    uv tool install glidepath
    
  3. Launch it:

    glidepath
    

If the shell cannot find glidepath afterwards, run uv tool update-shell once and reopen the terminal. Upgrade to a new release later with uv tool upgrade glidepath. (pipx install glidepath works too. Glidepath is a desktop app distributed through PyPI, not a library — importing glidepath modules is not a supported API.)

Or run straight from a checkout:

git clone https://github.com/williajm/glidepath.git
cd glidepath
uv run glidepath

The first run from a checkout 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.

User guide

docs/getting-started.md walks through the app step by step: installing on a machine with nothing on it, what to gather before you start, entering it on the Facts tab, reading the projection, and changing the assumptions behind it — the growth rate, inflation, fees, the planning horizon — on the Stated vs assumed tab.

Developing

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.)

Everyday commands

make check   # all merge gates: ruff, format, mypy --strict, pytest (>=96% 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 CVEs

Dependencies 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

Releases are vX.Y.Z tags on main. Each one is published to PyPI as an sdist and wheel via trusted publishing with PEP 740 attestations, and as a GitHub Release carrying its notes from CHANGELOG.md with the same artifacts attached, each carrying signed build provenance — verify a downloaded file with gh attestation verify <file> -R williajm/glidepath. The signed provenance bundle is attached to each release too (glidepath-X.Y.Z-provenance.intoto.jsonl), so verification also works offline with --bundle. There are no packaged binary builds (installer/exe) yet — install from PyPI as above.

Data licences

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.

Metadata

Release files for glidepath 1.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for glidepath 1.0.2
File Size Uploaded
glidepath-1.0.2.tar.gz 546.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for glidepath 1.0.2
File Interpreter ABI Platform
glidepath-1.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 1.1 MB

Release files / glidepath-1.0.2.tar.gz

Download URL glidepath-1.0.2.tar.gz
Size 546.0 kB
Tags Source
SHA-256 checksum
How to use checksums
ecc540acdfbfda92eae23a5f9b7dcdf2651ccbb2415d229f374acbfc1ee35923
BLAKE2b-256 checksum
How to use checksums
dca1ece449540a975476da2c0fc7acfe4fcf673a5b1eddf821544aa09206ed1f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 29, 2026.

Transparency log

Release files / glidepath-1.0.2-py3-none-any.whl

Download URL glidepath-1.0.2-py3-none-any.whl
Size 594.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5c6b17ba8d8ba538a8b7d21fd97d96e6ddbbdafa7d3d346dd271327e778ef7cd
BLAKE2b-256 checksum
How to use checksums
99f2ca8652017c6a8274c7eb125b934fae4c3a8111e78efc6ddd352ed98b244a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 29, 2026.

Transparency log

Release history Release notifications | RSS feed

1.1.1

2 release files

1.1.0

2 release files

This release

1.0.2 This release

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page