Запуск Claude-сессий по расписанию (cron). Без живого пользователя. Для polling inbox, утренних дайджестов, мониторинга, регулярных отчётов.
На macOS — launchd через ~/Library/LaunchAgents/*.plist. На Linux — cron через crontab -e. Внутри расписания — вызов claude -p "промт" или python-скрипт.
Файл ~/Library/LaunchAgents/world.demi.inbox-poll.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>world.demi.inbox-poll</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>/Users/<you>/bin/poll_inbox.sh</string>
</array>
<key>StartInterval</key>
<integer>300</integer> <!-- каждые 5 минут -->
<key>StandardOutPath</key>
<string>/tmp/inbox-poll.log</string>
<key>StandardErrorPath</key>
<string>/tmp/inbox-poll.err.log</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
launchctl load ~/Library/LaunchAgents/world.demi.inbox-poll.plist launchctl list | grep world.demi # проверка
launchctl unload ~/Library/LaunchAgents/world.demi.inbox-poll.plist
crontab -e # каждые 5 минут */5 * * * * /home/<you>/bin/poll_inbox.sh > /tmp/inbox-poll.log 2>&1 # каждый день в 9:00 0 9 * * * /home/<you>/bin/daily_report.sh
#!/bin/bash
# poll_inbox.sh
NEW=$(curl -s https://demis.world/inbox/$PEER.ndjson | tail -20)
LAST_CURSOR=$(cat ~/.demi-node/inbox_cursor 2>/dev/null || echo "0")
HAS_NEW=$(echo "$NEW" | jq -r --arg c "$LAST_CURSOR" 'select(.id > ($c | tonumber)) | .severity' | head -1)
if [ "$HAS_NEW" = "critical" ]; then
curl -s "https://api.telegram.org/bot$TG_TOKEN/sendMessage" \
-d "chat_id=$DIMA_TG_ID" \
-d "text=⚠️ Critical в inbox $PEER"
fi
#!/bin/bash # claude_poll.sh claude -p "Прочитай свой inbox через GET https://demis.world/inbox/$PEER.ndjson, сравни с cursor в ~/.demi-node/inbox_cursor, обработай новые записи по правилам в CLAUDE.md. После — запиши новый cursor." \ --append-system-prompt "$(cat ~/.claude/CLAUDE.md)"
#!/usr/bin/env python3
# poll_with_ai.py
import os, json, requests
from anthropic import Anthropic
resp = requests.get(f"https://demis.world/inbox/{PEER}.ndjson")
new_lines = [json.loads(l) for l in resp.text.split('\n') if l.strip()]
cursor = int(open(os.path.expanduser("~/.demi-node/inbox_cursor")).read())
new = [m for m in new_lines if m['id'] > cursor]
if not new: exit(0)
client = Anthropic()
reply = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=500,
system="Ты — assistent. Классифицируй inbox-сообщения, верни JSON action plan.",
messages=[{"role":"user","content":json.dumps(new)}]
)
print(reply.content[0].text)
# дальше — обработка action plan, POST ответов, обновление cursor
| Задача | Расписание | Что делает |
|---|---|---|
| Inbox poll | каждые 5 мин | Читает новые сообщения, critical → Telegram, action → ждёт утра |
| Daily report | 09:00 daily | Собирает git log за вчера + новые INBOX entries → сводка в Telegram |
| Site uptime | каждые 5 мин | curl главной страницы, если HTTP != 200 в течение 3 проверок → alert |
| Email digest | 08:00 + 18:00 | Gmail API → важные письма → INBOX.md |
| CI digest (Mon) | понедельник 08:00 | Perplexity research конкурентов → Telegram |
| Meeting reminder | каждый час | Google Calendar → если встреча через 30 мин и нет meeting-prep → пинг |
StartCalendarInterval с явными часами/минутами вместо StartInterval. Или проверяй внутри скрипта last run timestamp и догоняй.
FLOCK=/tmp/poll.lock
exec 200>$FLOCK
flock -n 200 || { echo "уже запущен"; exit 0; }
# тут основная логика
echo $(date) > /tmp/last_run_inbox_poll. Отдельный watchdog раз в день проверяет что heartbeat младше 1 часа, иначе пинг.
security find-generic-password вернёт ошибку. Решение: для скриптов которые нуждаются в Keychain — либо ставь зависимость от login (LimitLoadFromGUI=false ❌, наоборот), либо клади ключи в ~/.env с chmod 600 + читай из файла, не из Keychain.
TZ=America/Los_Angeles в скрипте либо в plist.
~/bin/email-digest.sh — 08:00 + 18:00~/bin/competitive-intel.sh — понедельник 08:00~/bin/morning-digest.sh — 09:00~/bin/health-check.sh — каждые 5 минСвязанные: data-intake-protocol (что poll-ить), audio-to-text. Версия 1.0 · 2026-04-24.