Fluegel is a small macOS menu bar app that lets automation agents run approved CLI tools through a GUI process that owns macOS privacy permissions.
The first supported use case is Apple Reminders via
rem. A headless agent can ask Fluegel to run
/opt/homebrew/bin/rem, while macOS sees the access as coming from
Fluegel.app, not from the agent's shell, SSH session, terminal emulator, or
temporary helper process.
macOS TCC permissions are tied to the app or binary that requests them. That is good for users, but awkward for local AI agents:
- The agent may run from Codex, SSH, Ghostty, launchd, or another transient process.
- Granting every possible caller Reminders access is brittle and hard to audit.
- Apple Reminders has no official automation-friendly API or CLI.
- Tools like
remwork well, but only from a process that has the right TCC grant.
Fluegel gives that permission a stable home. You grant Reminders once to the menu bar app, then allow only specific full-path commands to use it.
- macOS menu bar app with a simple settings window.
- Reminders permission only.
- Exact full-path command whitelist.
- CLI bridge for status, permission requests, whitelist edits, execution, and audit reads.
- Local user authentication for whitelist changes.
- Append-only audit log for allowed and denied command runs.
swift test
scripts/build-app.shBuild artifacts:
dist/Fluegel.appdist/fluegel
scripts/build-app.sh
mkdir -p ~/Applications
cp -R dist/Fluegel.app ~/Applications/
install -m 755 dist/fluegel /opt/homebrew/bin/fluegel
open ~/Applications/Fluegel.appFor the current clawmac deployment path:
scripts/deploy-clawmac.sh steipete@clawmacStart Fluegel in the GUI session:
open ~/Applications/Fluegel.appRequest Reminders permission:
fluegel permissions request remindersAdd rem to the whitelist. This requires local user authentication on the Mac
running Fluegel:
fluegel allow add --path /opt/homebrew/bin/rem --permission reminders --name remRun rem through Fluegel:
fluegel run -- /opt/homebrew/bin/rem lists --output json
fluegel run -- /opt/homebrew/bin/rem add "Book LHR to SFO flight"
fluegel run -- /opt/homebrew/bin/rem todayfluegel status
fluegel run -- /full/path [args...]
fluegel allow list
fluegel allow add --path /full/path --permission reminders [--name name]
fluegel allow remove --path /full/path
fluegel permissions status reminders
fluegel permissions request reminders
fluegel audit list [--limit n]All executable paths must be absolute. Arguments after the executable are passed through to the whitelisted command.
Open the menu bar app and choose settings. The window has three tabs:
Permissions: shows Reminders status and can request access.Whitelist: adds, updates, or removes full-path command entries.Audit: shows recent allowed and denied runs.
When Reminders access is granted, the Permissions tab shows Granted.
Fluegel is intentionally narrow:
- The bridge listens on a private Unix domain socket in Fluegel's application support directory.
- The CLI must present a local token created by the app.
- Commands are matched by exact executable path.
- Whitelist edits require macOS local authentication.
- Runs are denied when the command is not whitelisted, disabled, or asks for a permission Fluegel does not currently have.
- Every allow/deny decision is written to the audit log with the executable, arguments, requester, permissions, result size, exit code, and reason.
This is a convenience boundary for trusted local automation. It is not a sandbox, not a privilege escalation framework, and not meant to run arbitrary user input.
Fluegel stores its config, token, and socket under:
~/Library/Application Support/Fluegel/
The audit log is written separately under:
~/Library/Logs/Fluegel/audit.jsonl
The current files are implementation details, but they are plain local app data and can be inspected while debugging.
Check that the app is running:
fluegel statusIf the CLI cannot connect, start the app in the logged-in GUI session:
open ~/Applications/Fluegel.appCheck Reminders permission:
fluegel permissions status remindersIf it says notDetermined, request access and approve the macOS prompt:
fluegel permissions request remindersIf a command is denied, inspect the whitelist and audit log:
fluegel allow list
fluegel audit list --limit 10After rebuilding or re-signing the app, macOS may treat it as a new TCC client. Request Reminders access again if the status resets.
Early project. The first practical target is reliable Reminders automation via
rem. Future permissions should stay explicit and narrow, with the same
full-path whitelist and audit-first behavior.