Upgrade to a new version#

somnia --version

Released versions are on the releases page and on PyPI as somnia-readersomnia there is an unrelated project and always was. Upgrading means either taking the newer release or pointing pip at a different git ref; the second is how you get a fix that has landed on main but has not been tagged yet.

With the installer#

bash somnia-install.sh --ref 0.6     # a git tag, branch or commit
bash somnia-install.sh --pypi        # the last release from PyPI

It reuses the environment it finds, replaces somnia inside it, and leaves your settings file alone. Add --serve-only if that is what the box is, and the same --venv you installed with if it was not the default.

By hand#

source ~/somnia-venv/bin/activate
python3 -m pip uninstall -y somnia-reader
python3 -m pip install "somnia-reader[ml] @ git+https://github.com/gilesknap/somnia.git@0.6"

Uninstall by the distribution name, somnia-readerpip uninstall somnia finds nothing to remove and exits happily, which looks exactly like success.

The uninstall itself is not superstition either. pip treats a direct URL requirement as satisfied when the name and version already match, so re-running the install command with a new --ref clones the repository, decides there is nothing to do, and leaves you on the old version — with no error to notice. (The installer gets around this by force-reinstalling somnia and nothing else, which is why it does not disturb your two gigabytes of torch.)

Upgrading to a release needs no uninstall, because a plain pip install --upgrade "somnia-reader[ml]" compares versions rather than shrugging at a URL.

The first upgrade across the rename wants both names off first: an environment built before it still has somnia in it, owning the very files the new one is about to write, so say pip uninstall -y somnia somnia-reader. Leave the old name there and the day anyone finally uninstalls it, it takes the working install’s files with it while pip carries on reporting somnia-reader as present. The installer does this for you.

--ref only reaches back as far as the rename. 0.5 and everything older calls itself somnia in its own metadata, and pip will not take a direct URL whose name disagrees with what it builds: has inconsistent name: expected ‘somnia-reader’, but metadata has ‘somnia’. It does not stop there either — it discards the ref you asked for and looks the name up on PyPI instead, so once there is a release it will hand you the newest one and call that success. Install an old version under the name it was published with:

python3 -m pip install "somnia[ml] @ git+https://github.com/gilesknap/somnia.git@0.5"

What survives it#

The database migrates itself. Columns added since your version are added by the next command that opens it. Nothing is dropped and nothing is rewritten, so positions, high-water marks and the index come through unchanged.

The audio is untouched, and so is ~/somnia.env. Nothing in an upgrade re-renders a book or asks you to.

Afterwards#

systemctl --user restart somnia-serve somnia-worker
bash somnia-doctor.sh

Both, not just the page — a worker left on the old code renders with it, and the split exists so restarting one cannot kill a render under the other. A render in flight goes back into the queue and is picked up at the next chapter.

somnia-doctor.sh (in the repo’s scripts/, or curl it as Installation does) is the check worth running, because it looks at the install and the data together. curl -s localhost:8721/api/health answers {"ok": true} once the service is back.

On the phone, the page updates itself. The service worker goes to the network first and falls back to its cache only when the box cannot be reached, so the next reload with the box up is the new page — cache-first would have taken two. Closing the app and opening it again is enough to be sure, and worth doing before a night rather than during one.

Going back#

There is no downgrade path, and no test that says an older somnia is happy with a newer database. Migrations only ever add columns, so in practice older code ignores what it does not know about, but if the upgrade is one you might want to reverse, take a copy of somnia.db first — see Back it up, and move it.

In a container#

docker pull ghcr.io/gilesknap/somnia:0.6

What that image can and cannot do is in Run in a container — today it is not the thing that renders or serves a book.