Persistent condition-based agent daemon. Watches the vault and fires skills autonomously when conditions are met (new files, time elapsed, etc.). Use when user asks to start/stop the background agent, check agent status, view goals, or /nano-loop.
Always-on daemon inspired by Nanobot's radical simplicity. Complements the time-based scheduler with condition-based reactive dispatch — fires skills when vault state changes, not just on a clock.
python3 _scripts/nano_loop.py start # start daemon in background (forks, returns immediately)
python3 _scripts/nano_loop.py stop # stop daemon (SIGTERM + PID cleanup)
python3 _scripts/nano_loop.py status # alive? + last 5 dispatches
python3 _scripts/nano_loop.py once # dry-run: evaluate all goals once, exit (no sleep)
Edit _config/agent_goals.json to add/remove/modify goals. The daemon
hot-reloads this file on every loop iteration — no restart needed.
Trigger types:
file_count — fires when N+ new files appear in a vault folder since last runhourly — fires every N hourson_start — fires once when daemon starts (if goal has never run)Cooldown: cooldown_minutes prevents a goal from firing again too soon.
Goals declare permissions for the scripts they invoke:
vault.read — reads vault markdown filesvault.write — creates/modifies files via save_note()network.read — outbound HTTP requestsexec — runs subprocessesnotify — Telegram/macOS notifications