Bollard

Your launch agents, in the menu bar

Bollard lists every launch agent in ~/Library/LaunchAgents. See at a glance which ones are loaded and which have a process running, and load or unload one with a switch. There is no main window.

macOS 11+ · Intel / Apple silicon · under 1 MB

This menu is all of Bollard (a sketch; the agents are examples). Flip a few switches and watch the count at the top.

Features

At a glance
One row per launch agent: the switch is on when it is loaded into launchd, and a running process shows its pid. Loaded agents come first.
One flip
The menu stays open after loading or unloading and shows the real state when it is done. If it fails, you get what launchctl said.
Always current
The list is read again every time you open the menu, so it never shows stale state.
Knows “disabled”
Agents disabled with launchctl disable are marked. Turning one on re-enables it first, then loads it.
Readable names
Give a cryptic label a name you recognise in settings.json.
Chinese and English
Follows the system language, or pick one in the menu.
Automatic updates
Checks and downloads new versions in the background, verifies them, and waits for you to install.

How it works

Bollard starts nothing and supervises nothing itself. It is a remote control for launchd, which ships with macOS: it reads launchd’s state into a menu and runs one launchctl command when you flip a switch.

What a launch agent is
launchd is the macOS process that starts background services and keeps an eye on them. Each plist in ~/Library/LaunchAgents describes one service; at login launchd goes through the folder and loads them. Bollard only touches this folder, so it never needs an administrator password.
Three layers of state
Whether the plist is in the folder decides if it loads at the next login. Loaded or not is whether launchd knows about it right now, and lasts until you log out. Disabled is a flag stored by launchd: loading is refused while it is set, and it survives a restart.
Where the list comes from
Every time the menu opens: list the plists and read each Label, ask launchctl list which are loaded and their pids, ask launchctl print-disabled which are disabled, and match them by Label. Nothing polls in the background.
Flipping a switch
On runs launchctl bootstrap (after launchctl enable for a disabled agent); off runs launchctl bootout. launchctl’s exit code is unreliable, so success is judged by the state it is actually in afterwards.
On, but no pid
Some agents are the service itself, such as redis: they show a pid, and switching them off stops the service. Others are only a trigger, such as an app’s launch-at-login item: it runs open once to start the app and exits, so it is on with no pid. Switching it off does not quit the app; it just stops it starting at the next login.

Install

Run these two lines in a terminal. Bollard installed this way opens without a prompt.

$ curl -fL https://bollard.tianyw0.xyz/Bollard.zip \
    -o ~/Downloads/Bollard.zip
$ unzip -o ~/Downloads/Bollard.zip -d /Applications

Bollard is ad-hoc signed and not notarized by Apple. If you download it with a browser, macOS blocks the first launch; go to System Settings → Privacy & Security and click Open Anyway.

Unloading an agent lasts until you log out: its plist is still in LaunchAgents, so macOS loads it again at the next login.

Specs

Current version
Loading
System
macOS 11 or later
Chip
Universal for Intel and Apple silicon, one package
Scope
The current user’s ~/Library/LaunchAgents
How it applies
launchctl bootstrap / bootout, no administrator password
Signature
Ad-hoc, not notarized
SHA-256
Loading