Leo¶
An agent supervisor and task scheduler for Claude Code
Leo spawns and supervises Claude Code agents and schedules autonomous tasks — including tasks that inject into a long-running agent instead of spawning a fresh process each time. Leo is channel-agnostic — bring your own messaging channel via any Claude Code plugin (Telegram, Slack, webhook, etc.). A built-in web dashboard lets you manage everything from a browser.
-
Persistent Tasks
Point a
runtime: persistenttask at a template and Leo injects its prompt into that agent's tmux session — spawning or resuming it on demand — instead of spawningclaude -pper firing. -
Consults
One-off second-opinion subagents via leo_consult
-
Agent Templates
Define reusable blueprints and spawn ephemeral coding agents from the HTTP API, a channel plugin, or the web UI. Agents clone repos, run in isolated sessions, and appear in claude.ai.
-
Scheduled Tasks
Cron-driven tasks that invoke Claude in non-interactive mode. Write a prompt, set a schedule, and Leo handles prompt assembly and execution.
-
Web Dashboard
Monitor agents, manage tasks, spawn agents, edit config, and preview cron schedules from a browser on your LAN.
How It Works¶
Leo operates in three modes, all invoking the stock claude CLI:
Persistent Tasks¶
User (channel) --> Channel plugin --> claude --> Agent
|
User (channel) <-- Channel plugin <-- claude <----+
leo service start boots the daemon, which supervises every configured agent — including the ones backing runtime: persistent tasks. Rather than spawning a session at boot, a persistent task's target agent is spawned or resumed on its first firing (an "ensure-exists" step), then reused across subsequent firings: a long-running Claude process with its own workspace, model, and channel plugin list, restarted on crash with exponential backoff.
Agent Templates¶
HTTP / channel plugin / CLI --> Leo daemon --> tmux session
|
User (claude.ai) <-- --remote-control --name leo-<template>-... <------+
Templates let you spawn ephemeral agents on demand. Post to /api/agent/spawn (or use a channel plugin that exposes agent commands) and Leo clones the repo and starts a new Claude session you can connect to from claude.ai or the Claude app.
Scheduled Tasks¶
cron scheduler --> leo run <task> --> claude -p "<prompt>" --> Agent
|
Channel plugin <-- MCP tool call <-------+
The in-process cron scheduler runs tasks on a schedule. Each task reads a prompt file, assembles arguments, and invokes claude -p. The agent delivers its final message via whatever channel plugin(s) are configured, or outputs NO_REPLY when there is nothing to report.
Quick Install¶
Then run the setup wizard: