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:
bash scripts/uninstall_bmo.shbash scripts/uninstall_bmo.sh --applyOn 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.
What the script removes
Section titled “What the script removes”The default plan removes the current user’s install:
| Path | What 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-embedding | Installed binaries when GOBIN is set. Otherwise the script uses go env for GOBIN and GOPATH, then ~/go/bin. |
~/.local/bin/bmo, ~/.local/bin/bmo-embedding | Binaries installed on PATH outside GOBIN. |
/usr/local/bin/bmo, /usr/local/bin/bmo-embedding | The 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.
macOS login and launch services
Section titled “macOS login and launch services”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.
Linux autostart and systemd
Section titled “Linux autostart and systemd”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.
Project runtime data
Section titled “Project runtime data”Session databases and logs follow options.data_directory. The default is the
nearest .bmo/ directory. Name each project whose .bmo/ directory should be
removed:
bash scripts/uninstall_bmo.sh --project /absolute/path/to/repo --applyRepeat --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.
Module cache
Section titled “Module cache”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.
bash scripts/uninstall_bmo.sh --include-module-cache --applyLeft in place
Section titled “Left in place”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
PATHlines, completion snippets, and user crontab lines you added forbmo. - A
bmobinary whose parent directory is not namedbin, such as a build in a checkout. - Root-owned protected controller databases.
- Go build caches. On macOS,
Clean Go Caches.commandclears inactive Go build caches, andClean BMO Temp.commandinventories 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.
Confirm it is gone
Section titled “Confirm it is gone”bash scripts/uninstall_bmo.shcommand -v bmo || trueThe second dry run should list no remaining directories or binaries. command -v bmo
prints nothing when the install binary is off PATH.