Skip to main content
A recipe is the whole box spec, written declaratively. dabs ships five generic ones; anything project- or tool-specific is yours to add.
Screens verified by walkthroughs/test_recipes.py.

The bundled five

dabs recipes --print dumps the bundled YAML in full — the best starting point for writing your own.

Write your own

Project recipes live in ./dabs.yaml; personal ones in ~/.dabs/recipes.yaml. Resolution is bundled → global → project, later winning. This is a complete recipe:
Drop that in your project and it joins the registry immediately:
Recipes provision; they don’t prompt. A recipe’s command must not bake in agent instructions — keep prompts in the caller (or a skill) and keep the recipe reusable.

Running one — three shapes

Appending is literal. Trailing tokens are appended to the recipe’s command argv. Against command: [sh], dabs recipe sh -c 'echo hi' runs sh -c 'echo hi' — but dabs recipe -- echo hi runs sh echo hi, which asks sh to open a file named echo. Read the confirmation carefully: it always shows the exact final command.

The confirmation

Handing a box an arbitrary command always asks first, showing the recipe, its mounts, and the exact command:
Answer Yes and it runs, then removes the box when the command exits:
Answer No and nothing is built or run: dabs: recipe "sh": aborted.

A typo never becomes a command

A first token that is neither -- nor a known recipe is an error, not a command:

The default: key

A registry’s default: names the recipe that dabs build, dabs recipe (no name), and dabs recipe -- <cmd> resolve to.
A default: is not a shell. If it names an agent (say, a claude -p box), a bare dabs recipe -- echo hi appends your argv to the agent’s command line. Set no default unless one recipe is the obvious “just run it” choice.