Otto
Otto is a simple task runner. Think make, but with built-in retries, timeouts, run history, and notifications.
)
Install
Install from crates.io:
How tasks work
Use exactly one command mode per task:
exec: direct argv execution (no shell parsing)run: shell command (/bin/sh -con macOS/Linux,cmd /Con Windows)tasks: compose other tasks by name
Task example:
tasks:
lint:
exec:
clippy:
exec:
build:
exec:
ci:
tasks:
parallel: false # set true to run child tasks in parallel
Shared defaults live in defaults, and each task can override:
timeoutretries(0..10)retry_backoff(uses exponential backoff between attempts)notify_on(never,failure,always)
Dotenv and env expansion
otto run auto-loads .env if present.
- Disable it:
--no-dotenv - Use a different file:
--env-file .env.staging
Variables from process env + dotenv + task env are expanded in:
runexecargsdirenvvalues
Unknown variables are preserved as ${NAME}.
Notifications
Supported channels:
- desktop (
osascripton macOS,notify-sendon Linux) - webhook (
POSTJSON tonotifications.webhook_url)
notify_on controls when notifications fire: never, failure, always.
History and automation
Every run gets recorded in .otto/history.jsonl.
For scripts, use:
otto run --jsonotto tasks --jsonotto history --jsonotto validate --json
In JSON mode, command output is suppressed so stdout is valid JSON only.
Shell completion