Leo¶
A process supervisor and task scheduler for Claude Code
Leo manages persistent Claude Code sessions, schedules autonomous tasks, and lets you spawn on-demand coding agents. 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.
-
Processes
Define multiple persistent Claude sessions with different channels, workspaces, and settings. Leo supervises them with auto-restart and exponential backoff.
-
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 processes, 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:
Processes¶
User (channel) --> Channel plugin --> claude --> Agent
|
User (channel) <-- Channel plugin <-- claude <----+
leo service start launches all enabled processes in supervised mode. Each process is a long-running Claude session with its own workspace, model, and channel plugin list.
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: