A remote control for your AI coding agents
yeci-notify pushes approvals and task updates from your coding agents straight to your phone. Allow, reject, or steer from Telegram โ without touching the terminal. One static binary, zero dependencies, runs on any Linux or macOS box.
$ curl -fsSL https://notify.yeci.org/install.sh | bash
Installs a single binary to ~/.local/bin. Nothing runs and nothing is configured until you activate it.
Why yeci-notify
When you run an agent for a long time โ foreground, tmux, nohup, or over SSH โ it stalls the moment it needs your approval, and you have no way to know. yeci-notify closes that loop.
Notify
Get pinged the instant an agent needs a permission or finishes a task. No matter how it runs.
Approve
Allow, reject, or reply with feedback from a Telegram button. A denial with a note changes what the agent does next.
Remote steer
Inject instructions into a live session from your phone. Needs tmux; degrades gracefully when it is absent.
Install
The install script detects your OS and architecture and drops one static binary into ~/.local/bin. Linux and macOS, amd64 and arm64.
# One-line install curl -fsSL https://notify.yeci.org/install.sh | bash # Custom install directory YECI_BIN_DIR=/usr/local/bin curl -fsSL https://notify.yeci.org/install.sh | bash
Each release ships four static binaries built with CGO_ENABLED=0, verified against checksums.txt.
Quick start
One command activates everything. It is fully idempotent โ re-run it any time to update.
yeci-notify init
- Validate your Bot Token (from @BotFather) and capture your chat_id.
- Detect installed agents and wire up their hooks โ deep-merged, never overwriting your existing config.
- Pick a launcher: systemd / launchd / shell lazy-start / manual, based on your environment.
- Send a test notification to confirm the loop.
yeci-notify remove returns everything to factory state and restores every file it touched.
Capabilities
The product mainline (top three rows) holds unconditionally, for every user and every way of running an agent. tmux is only an optional enhancement.
| Feature | Requires | Without it |
|---|---|---|
| Done / idle / error notifications | โ | Always available |
| Claude / Gemini approval loop (buttons + reply) | โ | Always available |
| Codex done / approval notification | โ | Always available |
| Codex approval remote decision | tmux | Falls back to notify-only; decide at the terminal |
/send session injection | tmux | Bot replies "session not injectable" |
/ls session list | tmux | Lists only sessions seen in the event stream |
Telegram bot commands
| Command | What it does |
|---|---|
/ls | List sessions and each one's most recent event |
/send <session> <text> | Inject text into a tmux pane |
/pending | List pending approvals and re-render their buttons |
/mute [duration] ยท /unmute | Temporarily silence notifications (approvals unaffected) |
/status | Runtime status summary |
Security
- config.toml is forced to 0600. The token supports
${ENV_VAR}expansion, so it need never hit disk. - The token never appears in hook configs, logs, Telegram messages, or any distributed artifact.
- A single chat_id allowlist is a hard check โ non-matching updates are dropped and never answered.
- Outbound long-polling only. No public port, webhook, or HTTPS certificate required.
- Dangerous commands (
rm -rf /,git push --force, โฆ) render a reject-only prompt by default โ high-risk actions keep the friction of returning to the terminal. - Your bot token is a remote for your dev machine. Guard it accordingly; after
remove, revoke it via @BotFather.