flowlite
A job scheduler and orchestrator in a single binary, for scripts, pipelines and AI agents alike. Cron, DAGs, retries, timeouts and alerts over a directory of YAML, plus task results, idle timeouts, run-time fan-out and an MCP server for agentic jobs.
Install / Use
claude mcp add writes-the-spec -- npx -y github:writes-the-spec/flowliteIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
AutomationSupported Platforms
Our assessment of flowlite
flowlite scores 81/100 on our quality scale, 2429th of 2,885 Automation skills we index.
Its MCP Server is 8.9 KB long, well organised into 15 sections with 8 code examples: a thorough specification that gives an agent plenty to work with.
It has 3 GitHub stars, so there is little community track record yet; judge it on its content.
Maintenance, license and trust
- The repository was last updated yesterday, so flowlite is actively maintained.
- It is released under the 0BSD license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 92/100, with 1 caution from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
flowlite compared with similar skills
All 4 of these similar skills score higher than flowlite; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| flowlite (this skill)by writes-the-spec | 81 | 3 | 1d ago | MCP Server |
| claude-memby thedotmack | 100 | 100.1k | today | CLAUDE.md |
| Agent-Reachby Panniantong | 100 | 96.5k | 4d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 75.1k | today | CLAUDE.md |
| CowAgentby zhayujie | 100 | 47.4k | today | CLAUDE.md |
Frequently asked questions
- How do I install flowlite?
- Run
claude mcp add writes-the-spec -- npx -y github:writes-the-spec/flowlite. The install tabs above show the steps for each supported agent. - Which AI agents does flowlite work with?
- It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
- Is flowlite safe to use?
- It is 0BSD-licensed and scores 92/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is flowlite still maintained?
- The repository was last updated yesterday, so flowlite is actively maintained.
Skill content
View source on GitHubA job scheduler and orchestrator in a single binary, for scripts, pipelines and AI agents alike. Put any command in a YAML file and flowlite runs it on a schedule, in order, with retries, timeouts and alerts. Agentic jobs get more: each step's result is handed to the next, a retry is told why the last attempt failed, and an agent that hangs is ended. An agent can also drive flowlite itself over MCP.
Why flowlite
For any job:
- Nothing to install. There is no database server, broker, worker pool or Python to run. It is one binary and a SQLite file beside your YAML.
- Jobs are files. A pipeline is plain YAML in git, reviewed and reverted like any other change. Cron with time zones, a DAG per job, retries, timeouts, concurrency limits, email and Slack alerts, a localhost dashboard and retention all come built in.
- Runs remember themselves. Every run snapshots the definition it executed, so a rerun months later replays that run rather than today's file.
- Nothing is left behind. A timeout or a stop ends the whole process tree, asked first and killed after a grace period, and a crash leaves nothing running past the next start.
For agentic jobs, the kind that produce a result something downstream has to read, exit 0 while being wrong, stall on a provider and cost money the whole time:
- Results, not just exit codes. A task writes its result to
$FLOWLITE_TASK_OUTPUT, and every task that depends on it reads it from$FLOWLITE_INPUT_<TASK>. Logs stay logs. - Retries that know what went wrong. A retried attempt is handed the failed attempt's stdout, stderr and result, so the second try need not repeat the first.
- Hangs end.
idle_timeoutends an agent that has gone quiet long beforetimeoutwould. - Prompts without shell quoting.
stdin:hands a prompt to the command as written, so no backtick runs and no$expands. - Fan-out decided at run time. A task can submit further runs, from the CLI or over MCP. Those runs are linked to the task, stopped if it fails or is stopped, and deleted with it.
- Provider quotas. A named limit (
llm_api = 4) caps how many tasks reach one provider at once, and a task waiting with--waiton a run it submitted holds no slot.
Install
cargo install --git https://github.com/writes-the-spec/flowlite
Or clone and cargo build --release, which leaves the binary at target/release/flowlite.
Quick start
flowlite init # an example job, schedule and commented flowlite.toml
flowlite serve # scheduler, orchestrator and dashboard on :8000
flowlite job submit hello-world --wait # in a second shell; exits non-zero unless it succeeded
Everything lives in the data directory: the current one, or whichever -D names. Jobs are
under jobs/, schedules under schedules/, and run history in flowlite.db.
A scheduled pipeline
A nightly ETL in three steps, each starting only once the one before it has succeeded:
# jobs/nightly-etl.yaml
id: nightly-etl
name: Nightly ETL
parameters:
region: eu-west-1 # reaches every command as $FLOWLITE_PARAM_REGION
tasks:
- id: extract
command: /srv/etl/extract.sh
max_retries: 2 # three attempts in all, a minute apart
- id: transform
depends_on: [extract]
command: /srv/etl/transform.sh
timeout: 1800
- id: load
depends_on: [transform]
command: psql -h warehouse.internal -U etl -f /srv/etl/load.sql
secret_env:
PGPASSWORD: warehouse_pw # a secret's name; its value never enters the YAML
# schedules/nightly.yaml
id: nightly
name: Nightly
cron: "0 30 1 * * *" # 01:30:00 every day; six fields, seconds first
timezone: Europe/Vienna
jobs:
- id: nightly-etl
# flowlite.toml
[secrets]
warehouse_pw = "..."
serve refuses to start on a job that names a secret nothing defines, rather than letting
the run fail at 01:30. Add on_failure: with an address or a Slack channel to be told when
a run breaks, with the failing output quoted in the message. Run it now rather than tonight
with flowlite job submit nightly-etl --wait.
An agentic pipeline
One agent reads the CI logs and picks the flaky tests worth fixing, and a second agent
fixes them. my-agent stands for whichever agent CLI you run:
# jobs/flaky-tests.yaml
id: flaky-tests
name: Fix flaky tests
limits: [llm_api] # claims one of [concurrency_limits] llm_api
secret_env:
LLM_API_KEY: llm_api_key
tasks:
- id: triage
command: my-agent > "$FLOWLITE_TASK_OUTPUT"
stdin: |
Read last week's CI logs under /srv/ci/logs and list the flaky
tests worth fixing, one per line, most expensive first.
idle_timeout: 300 # five quiet minutes and the attempt is ended
- id: fix
depends_on: [triage]
working_dir: /srv/checkouts/api
command: |
my-agent "Fix these and open one PR per test: $(cat "$FLOWLITE_INPUT_TRIAGE")"
timeout: 3600
max_retries: 1 # the retry gets $FLOWLITE_PREVIOUS_ATTEMPT_LOG
# flowlite.toml
[concurrency_limits]
llm_api = 4
[secrets]
llm_api_key = "..."
triage writes its answer to a file rather than to its log, and fix reads it from there.
A task with no working_dir works in a directory created for its run, so two runs never
edit the same files. Schedule it by adding - id: flaky-tests under a schedule's jobs:.
Driving flowlite from an agent
flowlite mcp serves the Model Context Protocol on stdin and stdout. There is no port to
open and nothing to start first. Register it with any MCP client as a stdio server:
{
"mcpServers": {
"flowlite": { "command": "flowlite", "args": ["-D", "./data", "mcp"] }
}
}
| Tool | Answers |
|---|---|
| init_data_dir | Set this empty directory up with an example job and schedule. |
| list_jobs | What jobs does this data directory declare? |
| submit_job | Run this installed job, file or inline YAML, and optionally wait for the outcome. |
| list_job_runs | What has run lately, by job and by status? |
| get_job_run | What happened to run 42, task by task, and what did each task produce? |
| get_job_run_logs | What did each attempt write to stdout and stderr? |
| stop_job_run | Stop run 42, and tell me what it settled to. |
| delete_job_run | Remove run 42 before it is due, so its schedule writes it again. |
| get_serve_status | Is anything actually serving this directory? |
| list_limits | What is a queued run waiting behind? |
Each tool returns the same fields its CLI twin prints with --json. submit_job accepts a
pipeline an agent wrote itself as inline YAML, and runs it once without installing it.
wait_seconds (up to 300) returns the outcome in the same call instead of a polling loop.
An agent running inside a task can call the same tools, and the runs it submits become
that task's children.
What a task can reach
flowlite does not sandbox. A task runs as the user flowlite serve runs as, with that user's
filesystem and network. It inherits the server's environment, less every FLOWLITE_*
variable. That strip keeps flowlite's own settings out of a task's environment, but not out
of its reach: flowlite.toml, [secrets] included, is a file the task can read. A
secret_env: value is in the process's environment, which means an agent handed a key can
read it and write it into its log or result.
Treat a job file like a shell script you are about to run, and run serve as a user whose
reach you would hand to a model. The dashboard binds to 127.0.0.1 and has no
authentication, and MCP is stdio with one process per client.
Documentation
REFERENCE.md covers every key and command: command inputs and secrets, task results, retries, runs a task submits, notifications, concurrency limits, reruns, retention, the MCP tools, configuration and upgrading.
Status
0.2.0 is the current release. Since 0.1.0, run history upgrades in place. The YAML format, the CLI and the MCP tools may still change before 1.0.
Not there yet: an approval gate before a run starts, recording what a run cost, a
success_when: check for a task that exits 0 while being wrong, and a sandbox.
License
Zero-Clause BSD — see LICENSE. The frontend assets embedded in the binary keep their own licenses, listed in THIRD_PARTY_LICENSES.md.
Related Skills
claude-mem
100.1kPersistent Context Across Sessions for Every Agent – Captures everything your agent does during sessions, compresses it with AI, and injects relevant context back into future sessions. Works with Claude Code, OpenClaw, Codex, Gemini, Hermes, Copilot, OpenCode + More
Agent-Reach
96.5kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
75.1kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
CowAgent
47.4kOpen-source personal AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-agent, multi-model, multi-channel. Lightweight, extensible, one-line install.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
