Why stare at your laptop when you can go make yourself a coffee and have your computer/agent let you know when it's done compiling that monstrous 4GB monorepo?
- Works out-of-the-box - no need to go through any external service (other than your chat apps, of course)
- Coding agent integration – get notifications when Cursor, Codex, or Claude Code finishes its work or needs your approval
- Desktop notification
- Discord notification through Discord webhooks
- Slack notification through Slack workflow webhooks
- Custom webhook notification to any HTTP endpoint with configurable payloads and headers
- [Planned] Mobile app notification through our mobile app
Do open an issue if you're interested in a notification channel being implemented.
Through go install (easiest if you have Go 1.25+ installed):
go install github.com/lba-studio/n-cli@latestIf you don't have Go installed: download the latest release for your machine here: Releases
{version} refers to the current version of n-cli.
| MacOS Apple Silicon | MacOS Intel | Windows Intel 64-bit |
|---|---|---|
| n-cli-{version}-darwin-arm64.tar.gz | n-cli-{version}-darwin-amd64.tar.gz | n-cli-{version}-windows-amd64.tar.gz |
*Open an issue / PR if this table is wrong, thank you!
n-cli --help
# send "My message here" to your configured destinations. if you haven't configured n-cli, we'll setup a config for you
n-cli send My message here
n-cli s My message here
# example - make build takes 20 minutes to complete
make build; n-cli s "Build is done, stop making coffee"
# alternatively, run your shell command through n-cli
n-cli run make build
# make sure to use `--` if you'd like to pass in flags
n-cli r -- make build --whatever-args-i-have-here
# pro tip: you can set an alias to make the whole command shorter
alias n="n-cli s"
make build; n Build is done;
# integrations with LLM agents
n-cli setup cursor # set up Cursor hooks so you get notified when the agent finishes or session ends
n-cli setup codex # set up Codex hooks so you get notified when the agent finishes or needs approval
n-cli setup claude-code # set up Claude Code hooks so you get notified when the agent finishes or needs approval
n-cli setup codex --ignored-events=PermissionRequest # skip notifications for selected hook events
# useful commands
n-cli init # optional: initializes & configures n-cli without running anything
n-cli where config # where is your config?
n-cli version # get versionGet notifications when the Cursor Agent stops or when the session ends.
n-cli setup cursor # registers n-cli hook cursor in ~/.cursor/hooks.json
n-cli setup cursor --ignored-events=sessionEndKnown Cursor hook events registered by n-cli: stop, sessionEnd.
Get notifications when Codex finishes a turn (Stop) or is waiting for your approval (PermissionRequest).
n-cli setup codex # registers n-cli hook codex in ~/.codex/hooks.json
n-cli setup codex --ignored-events=PermissionRequestAfter setup, restart Codex and review/trust the hooks with /hooks if prompted. Ensure n-cli stays on your PATH in the shell environment Codex uses.
Known Codex hook events registered by n-cli: Stop, PermissionRequest.
Get notifications when the Claude Code agent finishes (Stop) or needs your approval (Notification with permission_prompt).
n-cli setup claude-code # registers n-cli hook claude-code in ~/.claude/settings.json
n-cli setup claude-code --ignored-events=NotificationAfter setup, restart Claude Code and review/trust the hooks with /hooks if prompted. Ensure n-cli stays on your PATH in the shell environment Claude Code uses.
Known Claude Code hook events registered by n-cli: Stop, Notification.
--ignored-events accepts comma-separated event names. Event matching is exact and case-sensitive against hook_event_name, and unknown future event names are allowed.
Default config is at ~/.n-cli/config.yaml
system: # optional - controls desktop/system notifications
disabled: true # if true, n-cli won't send system notifications
discord: # if missing, n-cli won't use Discord as a notification channel
# https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks
webhookUrl: https://discord.com/api/webhooks/{yourwebhookurlhere} # required
messageFormat: "<@1234> {{message}}" # optional
slack: # if missing, n-cli won't use Slack as a notification channel
# you can create one by following the steps here https://slack.com/intl/en-gb/help/articles/360041352714-Create-workflows-that-start-with-a-webhook
# must have "message" as a variable. sample payload to the webhook: { "message": "{{message}}" }
webhookUrl: https://hooks.slack.com/triggers/ABCDEFG123/123456789/whateverstringishere # required
messageFormat: "{{message}}" # optional
customs: # if missing, n-cli won't use custom webhooks as a notification channel
- name: pagerduty # optional - custom label shown in notification output (default: "custom[0]", "custom[1]", etc.)
targetUrl: https://api.example.com/webhook # required - the webhook URL to call
payloadTemplate: '{"text": "{{message}}", "priority": "high"}' # required - template with {{message}} placeholder
method: POST # optional - HTTP method (default: POST), case-insensitive
headers: # optional - custom HTTP headers
Authorization: Bearer your-token-here
X-Custom-Header: custom-value
- name: monitoring
targetUrl: https://n-cli.sh/my_cool_topic_here
payloadTemplate: 'Alert: {{message}}'
hooks: # optional - per-agent hook notification preferences
codex:
setup: true
ignored_events:
- PermissionRequest
claude_code:
setup: true
ignored_events:
- Notification
cursor:
setup: true
ignored_events:
- stop