A command runner, not a build system
Tasks always run when asked. No .PHONY traps, no timestamp guessing. Content-hash
caching exists as an explicit per-task [cache(...)] opt-in.
curl -fsSL https://raw.githubusercontent.com/rune-task-runner/rune/main/scripts/install.sh | shOr see every installation method — Homebrew, Docker, go install,
or a release archive.
# Build the project.build target="release": fetch go build -tags {{quote(target)}} ./...
# Fetch dependencies.fetch: @go mod download
# Run tests.test: build go test ./...rune # show the version + available tasks (runs nothing)rune build # run the `build` taskrune test # runs `build` (a dependency), then `test`rune --list # shows documented tasksA command runner, not a build system
Tasks always run when asked. No .PHONY traps, no timestamp guessing. Content-hash
caching exists as an explicit per-task [cache(...)] opt-in.
Errors are a feature
Undefined variables, unknown dependencies, dependency cycles and arity mismatches are
caught before anything runs, with file:line:col and caret-underlined
diagnostics.
Agents are first-class
Every task is an MCP tool — read-only by default, gated when destructive. Your agent and your terminal run the same definitions. See AI agents (MCP).
Polyglot task bodies
Shell, Python, Node — or an AI agent — as the body of a task, chosen per task with executors.
Composable across a repo
Split and namespace task files with imports and modules, and run independent prerequisites in parallel.
Secrets stay secret
Values of sensitive-looking variables are masked as *** in all output, and are never
exposed to agents. See secret masking.
New here
What is Rune? then Getting started — install, write a tiny Runefile, run a task.
Know what you want
The how-to guides cover one capability per page, each with a runnable example.
Wiring up a project
Looking something up
CLI flags, the Runefile language, the
grammar, and the RUNE#### codes.