⚠️ The boku package name on PyPI is currently squatted. Please install with pip install boku2 or uv tool install boku2 until the name is cleared. Track progress →
$ boku run deploy

Write what to run. Not how. Boku reads your YAML, runs your tasks, gets out of the way.

Boku (僕 — "servant") reads a YAML file and runs the tasks inside it. One after another. Variables, iteration, dependencies, conditions — all in YAML.

No #!/bin/bash. No tab-indentation rage. No ifeq syntax. Just a list of things to do.

why not bash_

bash
#!/bin/bash
for pkg in fzf eza bat; do
  if command -v brew &>/dev/null; then
    brew install "$pkg"
  fi
done
boku
variables:
  packages: [fzf, eza, bat]

tasks:
  install:
    if: command -v brew
    iterate: packages
    run: brew install {}

a more complex task_

daily.yaml
variables:
  vault: ~/Documents/Brain/
  daily: ${vault}Daily/

tasks:
  date:
    run: date +%Y-%m-%d
    save_output: date
    suppress_output: true

  daily_obsidian:
    if: test -f ${daily}${date}.md
    run: cat ${daily}${date}.md | grep -E '^- \[ \]'
    save_output: daily_tasks
    suppress_output: true

  weather:
    run: curl -s wttr.in/new-york?0T | base64
    save_output: weather
    suppress_output: true

  day:
    run: |
      echo "## Weather"
      echo "${weather}" | base64 -d
      echo ""
      echo "## Today's tasks"
      echo "${daily_tasks}"

Fetches today's date, pulls Obsidian tasks, gets weather, renders a daily brief.

features_

iterate Loop over lists. {} becomes each item.
depends_on Control execution order. Tasks wait.
variables ${var} normal · @{var} masked · ${env:VAR} env.
save_output Capture output into a variable for later tasks.
if Shell condition. Skip tasks that don't need to run.
on_success Run a command when the task succeeds.
on_failure Run a command when the task fails.
dry_run boku run ‐d previews without executing.
fail_fast Abort remaining tasks on first failure.

faq_

Q: Why no [X] feature?

Most likely because I didn't see the need in it.

Q: Why not Taskfile?

Taskfile is great. It's also a bigger surface area – includes, templating, dotenv, remote schemas. Boku is smaller. If you need less, it's simpler.

Q: Why not just write a Python script?

You could. But then you're writing Python. Boku is for when you want to describe what to run, not how to run it.

Q: Why no parallel execution?

Because I didn't need it, and it would make boku more complex than it needs to be. Sequential is predictable. You can always shell out to & if you want background jobs.

Q: Is this serious?

It's a YAML file that runs commands. Take it as seriously as you take your shell aliases.

for agents_

YAML is unambiguous. LLMs can read, write, and modify boku taskfiles without guesswork. skills/ has step‐by‐step guides for common patterns — give your agent the skills and a taskfile, and it can add tasks, change dependencies, or create new workflows.

  • 01‐quick‐start.md
  • 02‐iteration‐patterns.md
  • 03‐task‐dependencies.md
  • 04‐variables‐and‐secrets.md
  • 05‐conditionals‐and‐helpers.md

install_

$ pipx install boku2
$ uv tool install boku2
$ pip install git+https://git.sr.ht/~hxii/boku