Claude Code ยท Codex ยท Gemini CLI

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
  1. Validate your Bot Token (from @BotFather) and capture your chat_id.
  2. Detect installed agents and wire up their hooks โ€” deep-merged, never overwriting your existing config.
  3. Pick a launcher: systemd / launchd / shell lazy-start / manual, based on your environment.
  4. 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.

FeatureRequiresWithout it
Done / idle / error notificationsโ€”Always available
Claude / Gemini approval loop (buttons + reply)โ€”Always available
Codex done / approval notificationโ€”Always available
Codex approval remote decisiontmuxFalls back to notify-only; decide at the terminal
/send session injectiontmuxBot replies "session not injectable"
/ls session listtmuxLists only sessions seen in the event stream

Telegram bot commands

CommandWhat it does
/lsList sessions and each one's most recent event
/send <session> <text>Inject text into a tmux pane
/pendingList pending approvals and re-render their buttons
/mute [duration] ยท /unmuteTemporarily silence notifications (approvals unaffected)
/statusRuntime 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.