Automation and running 24/7
Scheduled jobs that survive restarts, cheap script watchers, delivery to your chat, and running the daemon as a service or in Docker.
Scheduled jobs
smooth-agent cron add morning "daily 07:00" "Summarise the top tech news for me" --deliver telegram
smooth-agent cron add weekly "weekly mon 08:00" "Plan my week from my notes" --skill weekly-review
smooth-agent cron list
smooth-agent cron run morning # run it now
smooth-agent cron pause morning
smooth-agent cron remove morningSchedules: daily 07:00, weekdays 08:30, weekly fri 17:00, every 2h, every 15m, at 2026-11-30 09:00, @daily, or a cron expression (*/15 * * * *). Times use [agent] timezone. Add --repeat N to stop after N runs and --model to use a cheaper model for one job.
The agent can create jobs itself with the cronjob tool: "every morning at 7 send me the BTC price".
Script watchers
A watcher runs a shell command first and only wakes the model when the command prints something, so checking every few minutes costs nothing when nothing changed:
smooth-agent cron add hn "*/15 * * * *" --script "python3 watch_rss.py --name hn --url https://news.ycombinator.com/rss"Watchers need [tools] terminal = true.
Delivery
--deliver telegram sends the result to you (the channel owner); telegram:<chat_id> picks a chat. A failed run arrives marked "⚠️ cron failed". Results also stay in the job queue: smooth-agent jobs.
The daemon
smooth-agent daemon runs the chat channels and the scheduler together. Jobs are leased and retried with backoff, so a crash or restart never runs a job twice or loses it. --no-channels runs only the scheduler.
Run it as a service
smooth-agent service --install # systemd user unit on Linux, launchd agent on macOS
systemctl --user enable --now smooth-agent
loginctl enable-linger $USER # servers: keep running after you log out
journalctl --user -u smooth-agent -f # logsUse --name for a second install on the same machine.
Docker
docker compose up -d # restarts on reboot
docker compose logs -fData lives in ./data (mounted at /data); the container runs as an unprivileged user with a health check.
Last updated: