Skip to main content
A recipe is one file in ~/.karmax/recipes/. Save it and it runs; there is no install step and no restart, because a tier with an install step is a tier nobody uses.
That is a complete, working automation. It has a schedule, it calls a model, it binds the result, it checks the result was real, and it writes to memory.

Triggers

Cron takes five fields, the syntax everyone writes. Six is also accepted if you need seconds ("0 0 9 * * *"). Shorthands work too: @every 45m, @daily. An expression KARMAX cannot run is rejected when the file is saved, not silently at 9am on a morning it does not fire.

Steps

Exactly one verb per step, so the file reads top to bottom and there is never a question about what runs first. Only the verbs that return something can be bound with as.

Binding and using results

Conditions

Waiting for days

sleep parks the run in a durable timer rather than holding a goroutine, so hours and days are fine and a restart does not lose it.

HTTP headers

Headers are flat, one per line:
A nested headers: block is rejected rather than silently ignored — it is the obvious thing to write and the wrong thing, so the error says so and shows the flat form.

Checking your work

Errors point at a line and suggest a fix:

When to reach for a workflow instead

A recipe is a schedule and some steps. When you need real control flow, state across runs, or tools of your own, that is a WASM workflow — sandboxed code with a capability manifest. Most automations are not that, and reaching for it first is how you end up maintaining a program where a file would have done.