bowline
Platforms

macOS

How Bowline runs on macOS: the daemon LaunchAgent, the read-only Menu Bar Status App, native notification policy, accessibility, and clean uninstall.

On macOS, Bowline runs as a background daemon under a user LaunchAgent and surfaces ambient state through the Menu Bar Status App. The menu bar is read-only and trust-only: it shows workspace health and can complete a narrow device-trust approval, but the CLI and TUI stay primary for repair and any broad change. This page covers installing the app and daemon, what the menu bar shows and can't do, when native notifications fire, accessibility, and how to uninstall cleanly.

Install and the daemon LaunchAgent

The one-command installer installs Bowline.app, links the bundled bowline and bowline-daemon binaries into ~/.local/bin, registers the background daemon, and opens the Menu Bar app. On macOS, daemon registration creates a user LaunchAgent at ~/Library/LaunchAgents/io.bowline.daemon.plist that runs bowline-daemon for your account, so your workspace keeps syncing across logins without a manual start.

  1. Install Bowline with Installation.
  2. Confirm with bowline daemon status and bowline status.
  3. Run bowline login to authorize the machine.

If you install with Homebrew or --cli-only, run bowline daemon install once after the binaries are on your PATH.

Manage the daemon with these commands.

CommandWhat it does
bowline daemon installCreates io.bowline.daemon.plist and starts the daemon
bowline daemon restartRestarts the daemon without touching sync state or project files
bowline daemon statusReports the daemon's running state
bowline daemon uninstallRemoves the generated LaunchAgent; leaves ~/Code intact

The Menu Bar Status App

The Menu Bar Status App is a small status icon with a read-only dropdown. It observes the same event-backed status as bowline status, so it never invents state of its own. It's ambient by design: it reports while you work in your editor, terminal, or normal desktop flow, and it doesn't ask you to manage sync.

The dropdown surfaces these states.

What you seeDetail
Workspace healthThe Workspace Status level: healthy, attention, or limited
Pending device approvalsDevice Approval Requests, each with its short matching code
ConflictsSync Conflict rows, kept passive and visible, never auto-repaired
Degraded stateA Blocking Degraded State when active work can't sync, hydrate, or materialize for 60 continuous seconds
Agent activityActive Agent Leases and followed Review-Ready Agent Leases
Limited capabilitiesAny Capability Limitation, naming what still works
Handoff commandsSafe CLI commands you can copy for repair or inspection

What it can and can't do

The menu bar does three things: it observes status, completes a single narrow device-trust approval after inline confirmation, and copies safe CLI handoff commands to your clipboard. Everything else is a copy-and-run handoff to the CLI or TUI.

It is not a dashboard, control panel, or repair surface. It won't resolve a Sync Conflict, mutate the workspace, or auto-launch an agent repair, and it never steals focus. For conflict repair and broad changes, use the CLI or bowline tui.

Trust-only, read-only

The menu bar's one write action is completing a pending Device Approval Request after you confirm the matching code inline. It is not the primary approval surface: bowline status, bowline tui, and bowline approve always work the same way, including over SSH.

Native notifications

Bowline keeps the menu bar quiet. Native notifications are a convenience, never the only path to act. Every state is durable in bowline status and the dropdown first. Notifications fire only for three action-relevant states.

StateWhen it notifies
Device Approval RequestA signed-in device or agent host is waiting for workspace trust
Blocking Degraded StateActive work has been unable to sync, hydrate, or materialize for 60 continuous seconds
Review-Ready Agent LeaseThe lease was user-started, user-followed, or already in your active review context

Bowline stays silent for normal healthy sync, hydration, indexing, conflict creation, and passive agent progress. Background automation stays passive in status.

If you miss or dismiss a notification, nothing is lost. The same item stays in bowline status and the menu bar dropdown until you act on it.

Accessibility

Bowline uses native macOS affordances throughout the menu bar app, so it works with the assistive technology you already use.

  • VoiceOver labels describe icon-only controls, including the status icon.
  • Every control in the dropdown is keyboard reachable.
  • Status text keeps sufficient contrast for readability.
  • State changes are reduced-motion-friendly.
  • Status indicators use more than color, so you never depend on color alone to read state.

Uninstall and recovery

Use the product path first. bowline daemon uninstall removes the generated user LaunchAgent for bowline-daemon. It does not delete project files under ~/Code.

Bowline generates these macOS artifacts.

  • ~/Library/LaunchAgents/io.bowline.daemon.plist
  • ~/Library/Logs entries written by macOS and the app
  • Bowline state and cache directories under the configured state root

If macOS reports a remaining generated artifact, remove that artifact only, then rerun the product path.

  1. Run bowline daemon status to check the daemon's state.
  2. Run bowline daemon uninstall again.
  3. If the menu bar app still appears at login, remove Bowline from macOS Login Items. That affects only app startup, not the files under ~/Code.

To gather a redacted support bundle before or after uninstalling, run bowline diagnostics collect (add --json for scriptable output).

Important

Source projects are your data. Bowline's cleanup refuses any path inside an accepted project root, so removing the daemon never removes your code.

Next steps

On this page