A macOS menu-bar status light app β a breathing LED that lives in your status bar.
- Breathing LED in the menu bar with a 3D glow effect
- Three colors: π’ Green (calm) β π‘ Yellow (caution) β π΄ Red (alert)
- Each color breathes at a different speed (red = fastest, green = slowest)
- CLI companion (
sgnl) for scripting and automation - LSUIElement β no Dock icon, pure menu-bar app
- macOS 14+ (Sonoma)
Build the app and install it to your system paths:
make build # Build release binary & .app bundle
make run # Build and launch immediately
make install # Copy .app to /Applications and CLI helper to ~/.local/bin
make clean # Remove build artifactsBuild a clean, shareable disk image (.dmg) containing Signal.app and a shortcut to /Applications:
make dmg # Packages the app into .build/Signal.dmgTo install:
- Open the DMG and drag
Signal.appto yourApplicationsfolder. - Launch the application.
- Open the status bar controls and click "Install 'sgnl' CLI Command" to install the
sgnlcommand line tool directly to~/.local/binwithout using terminal scripts.
For instructions on signing the application with an Apple Developer Account, or resolving macOS Gatekeeper warnings ("app is damaged" / "unidentified developer"), please see SIGNING.md.
sgnl red # Switch to red (fastest breathing, ~1.2s cycle)
sgnl yellow # Switch to yellow (medium breathing, ~2.4s cycle)
sgnl green # Switch to green (slowest breathing, ~4.0s cycle)
sgnl help # Show help
sgnl breath off # close effect# Turn red on test failure
if ! make test; then sgnl red; fi
# CI status monitor
sgnl green # deploy succeeded
sgnl red # deploy failedYou can integrate sgnl with Claude Code hooks to turn your status bar light into a physical/visual indicator of Claude's state!
Add the following to your project-level or global .claude/settings.json file:
{
"hooks": {
"SessionStart": [
{
"type": "command",
"command": "sgnl green",
"shell": "bash",
"timeout": 3
}
],
"UserPromptSubmit": [
{
"type": "command",
"command": "sgnl yellow",
"shell": "bash",
"timeout": 3
}
],
"PermissionRequest": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "sgnl red",
"shell": "bash",
"timeout": 3
}
]
}
],
"Stop": [
{
"type": "command",
"command": "sgnl off",
"shell": "bash",
"timeout": 3
}
]
}
}- Green (Idle/Ready): Lights up when you start a session or when Claude stops thinking and waits for your input.
- Yellow (Thinking/Working): Breathes with a caution light whenever you submit a prompt and Claude starts executing tools/thinking.
signal/
βββ Package.swift # SwiftPM manifest
βββ Makefile # Build system
βββ Resources/
β βββ Info.plist # LSUIElement = true
βββ Sources/
βββ Signal/
β βββ main.swift # NSApplication entry point
β βββ AppDelegate.swift # Status item, animation, IPC
βββ sgnl/
βββ main.swift # CLI β DistributedNotification
IPC: The CLI tool posts a DistributedNotification (com.signal-light.colorChange) that the app observes. No sockets, no files β just the macOS notification bus.
- macOS 14.0+ (Sonoma)
- Swift 5.9+
- Xcode Command Line Tools