Updating Oort

oort update updates the copies of oort your agents and your shell run, and prints the command for any it cannot update itself. It migrates the memory store and restarts oort serve. Once a day, oort also tells you when a new release is out.

On this page
oort updateoort update asks npm's registry for the latest oortmem release, then runs npm to install it for each copy of oort on your machine that is an npm install and older: the one the Claude Code hooks run, the one you ran, the first on your PATH and the managed copy in ~/.oort/cli.YOUR MACHINElatest releaseinstalls itnpm registryoortmem/latestoort updateon your machineYour copieshooks, PATH,~/.oort/cli

Update

Terminal
oort update

It lists each copy it found and what it will run, then asks once: "Update 2 copies of oort to 0.6.3 and restart oort serve? [y/N]". It ends with the link to the release notes, github.com/oortmem/oort/releases/tag/v0.6.3.

Terminal
# only say what would change
oort update --check
# no question, oort.v1 JSON for scripts
oort update --yes --json
# a given release instead of the latest
oort update --version 0.6.3

With --json, or when there is no terminal to ask in, it refuses without --yes. --check never asks and never installs.

Which copies it updates

You can have more than one oort: an npm global for each Node version, a copy for the Claude Code hooks, a copy from pip. oort update looks at these four:

  • The hooks' copy, the one ~/.claude/settings.json runs.
  • The running copy, the one you ran oort update with.
  • The first on PATH, what oort runs in this shell.
  • The managed copy in ~/.oort/cli, when you have one.

It reads each copy's version from its files and never runs another copy to find out, so --check only reads files and asks npm. A copy whose files do not say is listed as "version unknown".

It runs npm itself only for an npm install older than the release. For the rest it prints the command:

Where it livesWhat oort update does
npm global, also under nvm, fnm, Volta or asdfRuns npm i -g --prefix <prefix> oortmem@<version>.
~/.oort/cliRuns npm i -g --prefix ~/.oort/cli oortmem@<version>.
pnpm globalPrints pnpm add -g oortmem@<version>. It never runs pnpm: run it with the pnpm that installed the copy.
pip or pipxPrints pipx upgrade oortmem or python -m pip install -U oortmem for you to run. It never runs pip.
A clone of the repositoryPrints git pull && pnpm install && pnpm build.
npx, pnpm dlx or a temp directoryNothing, and it says why. A temporary copy is never updated in place.

Every other older copy on your PATH is listed with the command that updates it and the one that removes it. oort update never deletes anything.

It runs the first npm on your PATH by its absolute path, from your home folder, so no project's .npmrc or package.json applies. With no npm, it prints the command instead.

After it installs

  • Checked, not trusted. An install counts only once the copy really is the new release. If the installer exits without error but the copy is unchanged, that copy is a ✗ and oort update exits 1.
  • npm's delay. For a minute or so after a release, npm may not have it yet. oort update tries again for up to 2 minutes, with a line each time.
  • The store. A checked new copy opens your memory store. When the release changes the store's format, it backs up the store first and prints where the backup is.
  • oort serve. If the daemon runs, it is stopped and started again from the new copy.

With no checked copy, neither the store step nor the restart runs, and it says what to run once you have one.

Exit codes

CodeMeaning
0Updated, already up to date, you said no, or --check (read data.upToDate in the JSON).
1An installer failed, an install did not take, or npm's registry could not be reached.
2A --version that is not a version, or --yes missing where it cannot ask.

The update notice

When a newer release is out, oort says so in these places:

  • When a Claude Code or Codex session starts, as a message to you. It is not part of the model's context: the memory the model gets is the same as without it. Codex shows it as a warning in its UI. At most once a day for each new version.
  • After a command you run in a terminal, one dim line: Oort 0.6.4 is available (you have 0.6.3): oort update.
  • In oort doctor, as an updates line, and under oort serve status.

It never appears with --json, when the output goes to a pipe or a file, in CI, or in the MCP server your agent talks to. For scripts, oort update --check --json has the same answer.

What the check sends

  • One request: GET https://registry.npmjs.org/oortmem/latest, with the user agent oort-update-check.
  • No version, no id, no cookies. Nothing about you or your memories.
  • At most once a day. The answer is kept in ~/.oort/update-check.json, and a failed check waits until the next day.
  • A hook never waits for it: when the file is a day old, the hook starts the check in the background.
  • That background check gets only PATH, HOME, OORT_HOME, the opt-outs below, and your proxy and certificate settings. Never an API key. It reads at most 1 MB of the answer.
  • When ~/.oort is a symlink, it is followed only to a folder of yours that others cannot write to. Otherwise the check is skipped, and oort doctor says why.

oort update itself always asks npm when you run it. See also Privacy.

Turn the check off

Any one of these turns off both the check and the notice:

  • OORT_NO_UPDATE_CHECK=1 in your environment.
  • NO_UPDATE_NOTIFIER set to anything.
  • CI set to anything but false or 0. Most CI systems set it.
  • updates.check set to false in ~/.oort/config.json:
~/.oort/config.json
{ "updates": { "check": false } }

Only your home config counts. An updates key in a repository's oort.config.json is ignored, with a warning.

oort serve after an update

oort update restarts the daemon itself. If you update another way, the daemon gives way on its own: the first hook from a newer version stops it and starts one of its own version. An older or equal version never stops it.

A daemon from before 0.6.3 does not do this. Restart it once:

Terminal
oort serve stop && oort serve --detach

Troubleshooting

Two copies of oort

oort doctor warns when the hooks run another version than the oort you typed. This happens when the hooks run one npm global and your shell finds another, often under another Node version. oort update updates both.

"another copy of oort" of the same version

Under hooks, oort doctor can print an info line: the hooks run one copy, and you ran another copy of the same version. That is fine. Nothing to fix.

The hooks break when you switch Node versions

Hooks that run a copy under nvm, fnm, Volta or asdf stop working when that Node version goes away. Give the hooks a copy of their own in ~/.oort/cli:

Terminal
npm i -g --prefix ~/.oort/cli oortmem
~/.oort/cli/bin/oort install claude-code

oort update keeps that copy current. For other problems, see Troubleshooting.