Skip to content

Uninstall

Quit any open BMO session before you remove the install. The uninstall script prints every path first. Nothing is deleted until you pass --apply.

From a source checkout:

Terminal window
bash scripts/uninstall_bmo.sh
bash scripts/uninstall_bmo.sh --apply

On macOS, Uninstall BMO.command in the repository root runs that same script. Opening it from Finder previews the plan and waits for Return. The script runs on macOS and Linux. On Windows, quit BMO and remove the directories printed by bmo dirs, including the LOCALAPPDATA\bmo data directory.

The default plan removes the current user’s install:

PathWhat it holds
~/.config/bmo/Global config (bmo.toml, or an existing bmo.json). XDG_CONFIG_HOME/bmo is included when that variable is set.
~/.local/share/bmo/Global data: scheduler state, autopilot files, and logs. XDG_DATA_HOME/bmo is included when that variable is set.
~/.bmo/Plugins, user recipes, commands, agents, and chatgpt_session.json.
$GOBIN/bmo, $GOBIN/bmo-embeddingInstalled binaries when GOBIN is set. Otherwise the script uses go env for GOBIN and GOPATH, then ~/go/bin.
~/.local/bin/bmo, ~/.local/bin/bmo-embeddingBinaries installed on PATH outside GOBIN.
/usr/local/bin/bmo, /usr/local/bin/bmo-embeddingThe same binary names when this user owns the file.
${TMPDIR:-/tmp}/bmo/panics/Panic logs written when the global data directory is unavailable.

BMO_GLOBAL_CONFIG and BMO_GLOBAL_DATA are included when they are set. A custom directory is removed when its name is bmo or it already contains BMO state such as bmo.toml, bmo.db, cred.key, credentials.enc, autopilot/, or logs/. Provider credentials stored as cred.key and credentials.enc live in the runtime data directory and are removed with that directory.

Recorded services are signaled from pid files under each removed data directory: autopilot/autopilot.pid, autopilot/scheduler.pid, daemon.pid, and services/{http,gateway,mcp}.pid. A process is signaled when this user owns it, its command is bmo or bmo-embedding, and either its executable is one of the binaries above or one of those pid files names it.

On macOS the same plan boots out and removes user LaunchAgents in ~/Library/LaunchAgents when the label starts with dev.bmo. or dev.instagrim.bmo, or when the program is bmo, bmo-embedding, or bmo-publication. That includes the operator LaunchAgent dev.bmo.recovery-jetstream when it is installed for this user. Other LaunchAgents stay in place.

Login Items named bmo, bmo-embedding, or bmo-publication are removed. The match is case-insensitive, so BMO is included. Other Login Items stay in place. Listing them uses System Events; if Automation permission is not granted, the script reports that and continues.

BMO does not register a macOS system extension, and the script does not change System Settings extensions.

The publication helper is the root LaunchDaemon dev.instagrim.bmo-publication at /Library/LaunchDaemons/dev.instagrim.bmo-publication.plist, with its binary at /Library/PrivilegedHelperTools/bmo-publication. The default plan leaves both in place. Pass --include-system-services to boot it out and remove those two files. That flag uses noninteractive sudo. The _bmopublisher account and /private/var/db/bmo-publication stay in place.

The same plan stops and removes this user’s systemd units under ~/.config/systemd/user (or XDG_CONFIG_HOME/systemd/user when that variable is set) when that directory is present. A unit is included when its name is bmo, bmo-embedding, bmo-publication, a template instance of those names, dev.bmo.*, or dev.instagrim.bmo*, or when a service ExecStart runs one of those programs. XDG autostart entries in ~/.config/autostart are removed when Name or Exec is one of those programs. Other units and desktop files stay in place.

The Linux publication helper is the systemd unit bmo-publication.service at /etc/systemd/system/bmo-publication.service, with its binary at /usr/local/libexec/bmo-publication, its drop-ins in bmo-publication.service.d, and its installation record at /etc/bmo/publication-installation (including a .pending record). The default plan leaves them in place. --include-system-services disables the unit and removes those files. That flag uses noninteractive sudo. Publisher data under /var/lib/bmo/publication stays in place.

BMO does not install a user crontab, an OpenRC script, or a D-Bus session service. Those stay in place. --include-system-launchd is the same switch as --include-system-services.

Session databases and logs follow options.data_directory. The default is the nearest .bmo/ directory. Name each project whose .bmo/ directory should be removed:

Terminal window
bash scripts/uninstall_bmo.sh --project /absolute/path/to/repo --apply

Repeat --project for every checkout. That directory can also hold project recipes, skills, and commands. Copy out anything you still need before --apply. Project bmo.toml and the rest of the checkout stay in place. .bmo/ directories you do not name stay in place.

A maintainer go install of this module leaves it in the Go module cache. Add --include-module-cache to remove github.com/instagrim-dev/bmo under GOPATH/pkg/mod and the matching download cache. Other modules stay in place.

Terminal window
bash scripts/uninstall_bmo.sh --include-module-cache --apply

The script leaves these for you to remove when you still want them:

  • Provider API keys and tokens exported in your shell or saved in a password manager.
  • Shell PATH lines, completion snippets, and user crontab lines you added for bmo.
  • A bmo binary whose parent directory is not named bin, such as a build in a checkout.
  • Root-owned protected controller databases.
  • Go build caches. On macOS, Clean Go Caches.command clears inactive Go build caches, and Clean BMO Temp.command inventories BMO trees under /private/var/tmp.

A symlink at a planned path is refused for directories. A symlink in a bin directory is removed, and the file it points at stays in place.

Terminal window
bash scripts/uninstall_bmo.sh
command -v bmo || true

The second dry run should list no remaining directories or binaries. command -v bmo prints nothing when the install binary is off PATH.