# Daemon

> Manage the Telegram daemon lifecycle — start, stop, restart, check status, tail logs. Use when the user says "start the bot", "stop the daemon", "restart telegram", "daemon status", "show bot logs", or "is the bot running".

- Skill: `k1p1l0/daemon` (Agent Skill)
- Install (CLI): `npx skillmds@latest add k1p1l0/daemon`
- Raw SKILL.md: https://api.skillmd.com/api/skills/k1p1l0/daemon/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: k1p1l0 (https://skillmd.com/u/k1p1l0)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/k1p1l0/daemon

---


# /telegram:daemon — Telegram Daemon Lifecycle Manager

Full lifecycle management for the Telegram bot daemon (launchd + supervisor + Claude).

## Arguments — dispatch on first word

### `start` (default if no args and daemon is not running)

Start the daemon via launchd:

```bash
launchctl load ~/Library/LaunchAgents/com.user.claude-telegram.plist 2>&1
```

If it fails with "already loaded", report that the daemon is already running.
After loading, wait 5 seconds, then run the status check to confirm it started.

### `stop`

Stop the daemon:

```bash
launchctl unload ~/Library/LaunchAgents/com.user.claude-telegram.plist 2>&1
```

Wait 3 seconds, verify all processes are gone:

```bash
ps aux | grep -E "channels.*telegram" | grep -v grep
```

Report success or if orphan processes remain.

### `restart`

Unload then load:

```bash
launchctl unload ~/Library/LaunchAgents/com.user.claude-telegram.plist 2>/dev/null
sleep 2
launchctl load ~/Library/LaunchAgents/com.user.claude-telegram.plist
```

Wait 10 seconds, then run full status check.

### `status` (default if no args and daemon IS running)

Run the full monitor check — same as /telegram:monitor:

1. Process status (supervisor, expect, claude, MCP server, caffeinate)
2. Launchd loaded/not
3. Remote control URL
4. Lock file
5. Last 5 log lines

### `logs`

Tail the last 30 lines of supervisor stderr:

```bash
tail -30 ~/.claude/channels/telegram/data/supervisor-stderr.log
```

### `stdout`

Tail the last 30 lines of daemon's Claude output:

```bash
tail -30 ~/.claude/channels/telegram/data/supervisor-stdout.log
```

### `url`

Just show the remote control URL:

```bash
cat ~/.claude/channels/telegram/data/supervisor-stdout.log | strings | grep "session_" | tail -1
```

### No args

Check if daemon is running. If running → show status. If not running → ask if user wants to start it.

## Important notes

- The `launchctl load/unload` commands may fail with "Input/output error" — this usually means the service is already in the requested state. Handle gracefully.
- After start/restart, always verify the daemon actually started by checking processes.
- The plist path is always: `~/Library/LaunchAgents/com.user.claude-telegram.plist`
- Show the remote control URL after every start/restart so the user can monitor.

