Security for terminal --tags
How terminal --tags handles your data, where it stores profiles, how updates are delivered, and what happens if your subscription lapses.
Permissions we request and why
Mac: Accessibility is required so terminal --tags can draw floating colored tag overlays on top of other apps' windows and observe window positions. No other elevated permission is requested.
Windows: No elevated permissions. terminal --tags runs as a standard user.
Profile storage
Profiles (name, command, working directory, environment) are stored in a plaintext JSON file in your user data directory:
- Mac:
~/Library/Application Support/TerminalTags/profiles.json - Windows:
%APPDATA%\TerminalTags\profiles.json
Secrets: Environment values you add to a profile are written to that plaintext file alongside the profile command. We recommend you do not paste API keys directly; instead fetch them from your OS keychain inside your profile command — for example security find-generic-password on Mac or cmdkey on Windows.
A future release will move profile secrets to Keychain (Mac) and DPAPI (Windows) automatically.
Updates
Mac: Sparkle 2.x with EdDSA update signature verification. The appcast feed is hosted at https://bravely.dev/terminaltags/appcast-mac.xml.
Windows: Velopack with signed releases via Azure Trusted Signing. The update feed is hosted at https://bravely.dev/terminaltags/velopack/.
Telemetry
PostHog collects anonymous product events: app launch, hotkey usage, and paywall view. We never transmit profile names, command strings, working directories, or environment values.
Paddle is used for license verification only.
What happens when a subscription lapses
- Free tier tagging continues to work forever.
- The profile launcher stops launching new agents.
- Already-running agents keep running.
- Your profile list remains readable and exportable.
CLI profile registration
Bulk-imported profiles never become launchable without your explicit approval in the app. When you (or an agent) run terminaltags profile import <path>, the CLI parses the JSON, validates each entry, and writes one file per profile to a staging directory with user-only (0600) permissions:
- Mac:
~/Library/Application Support/TerminalTags/staging/
Nothing in that directory can be launched by the tray menu. The next time Terminal Tags runs (or when it receives a staging notification while already running) it opens a Review pending profiles modal that shows each staged profile as a card: name, the command as a read-only monospace string, working directory, environment variable count, and color. You approve or reject each one individually, or use Approve All / Reject All.
If an environment value looks like a secret — e.g. starts with sk-, pk_, ghp_, or has a name containing SECRET / TOKEN / KEY / PASSWORD — the card shows a warning marker. Approval is never blocked; the warning exists so you see the risk before confirming.
Rejecting deletes the staging file without ever activating the profile. Closing the modal with Review Later leaves files in place for next launch. There is no keyboard shortcut that approves every profile without interaction; the modal cannot be auto-dismissed.
Status: Shipped in Terminal Tags 1.0.2. The older terminaltags profile add command still writes directly to the active profile list since it requires an explicit flag per profile; future releases will route it through the same staging gate.
Reporting security issues
Email security@bravely.dev. PGP fingerprint or plain text are both fine.