Skip to main content
px0 is distributed on PyPI and installed with pipx, so updating is a version check plus a pipx upgrade. px0 update wraps both, along with the parts that are easy to forget: store-schema migrations, restarting a running daemon, and a health check afterwards.

Check without changing anything

--check touches nothing on disk. It reads the published versions from PyPI and compares them against what you have installed. The daemon also checks once a week during its nightly pass and records the answer, which is what px0 doctor reports. That way neither command hits the network on every invocation, and doctor stays usable offline:
Being a release behind is reported, never treated as a failure.

Update

In order, it:
1

Resolves the newest version on your channel

stable by default. See channels below.
2

Upgrades with the mechanism you installed with

It detects pipx or pip and uses that one - pipx upgrade px0, or pip install --upgrade px0.
3

Applies pending store-schema migrations

Each is recorded as a change in the store’s own history. A migration that fails stops the update there, with the store left at the last schema it fully reached. It never half-migrates.
4

Appends the result to update history

In .state/update-history.json. Nothing is written unless the install itself succeeded, so a failed update leaves no misleading breadcrumb.
5

Restarts the daemon if it was running

So the new binary is the one doing the scheduling.
6

Runs a quick doctor pass

And prints the summary, so you find out immediately if something needs attention.

Roll back

This reinstalls the version you were on before the last update - read from update-history.json, not guessed - and pops that entry, so repeated rollbacks walk back through your history one step at a time. With no history it says so and exits rather than doing something arbitrary. One caveat it prints when it applies: schema migrations are forward-only. If the update you are undoing migrated the store, the older binary is now looking at a newer store schema. px0 doctor is what tells you:
The fix is to update forward again.
Roll back to escape a misbehaving release, not as a way to downgrade the store. A store written by a newer px0 cannot be migrated backwards, so treat the rollback as temporary and update forward once the release you were avoiding is fixed.

Channels

Two related settings:

Uninstall

This removes the binary, tears down the scheduler, and then tells you how to delete your store. The scheduler unit goes before the binary does, because a launchd job with KeepAlive - or a systemd service - would otherwise keep trying to run a px0 that is no longer installed. launchd plists and systemd user units are removed for you; a cron entry cannot be edited safely on your behalf, so px0 tells you it is still there. By default, uninstall never deletes the store itself. ~/.px0 is a plain directory of Markdown and TOML - your guidelines, your library, your run history - so removing it is your call, and it is yours to back up or move somewhere else first:
To remove px0 and delete all your store data at the same time:
Pass --yes to skip interactive confirmation:
See The store.

Pinning a version

The installer takes a version, which is the cleanest way to hold a machine at a known release:
PX0_CHANNEL=beta installs pre-releases, and PX0_PREFIX chooses where the binary lands. See Installation.