Skip to main content
A workflow is a named state machine stored in .kiwi/workflows/. Pages join a workflow through two frontmatter fields, workflow and state. KiwiFS then moves them only along the transitions you allow, and the web UI shows them as a Kanban board. Use workflows for task boards, editorial pipelines, review queues, or any process where a page should move through fixed stages.

How it works

  1. A definition in .kiwi/workflows/{name}.json lists the states and the allowed transitions.
  2. A page opts in with workflow: {name} and a starting state.
  3. Moving a card (or calling POST /api/kiwi/workflow/advance) checks the move against the definition, then updates the page’s frontmatter through the write pipeline. Every move is a git commit.

Definition format

.kiwi/workflows/tasks.json
KiwiFS validates a definition when you save it and when it loads the folder. Invalid files are skipped, and GET /api/kiwi/workflows lists their errors in an errors array. The kiwifs init templates kb, tasks, cms, adr, and research ship with a ready-made workflow.

Page frontmatter

tasks/add-sso.md
The board reads these fields: A card that is blocked cannot move to a state named in_progress; the move returns 409. When a page has a status field that equals its old state, advancing updates status to the new state as well. Pages whose state matches no column appear under __unmatched__ in the board response.

Moving pages

Click Kanban in the toolbar and pick a board. Drag cards between columns to advance them, or within a column to reorder them. Drag a page from the file tree onto a column to add it to the workflow. Use New board, Edit columns, and Delete board to manage definitions.
Advance returns 409 when the transition is not defined, the current state is terminal, the target column is at its WIP limit, or the card is blocked. Advancing to the state a page is already in returns "noop": true.
/workflow/advance is the only path that checks a workflow definition. A plain file write can still set any state. To guard every write, add global transition rules under [workflow] in config.toml with enforce_transitions = true. See Configuration.

Pair workflows with claims

On a shared board, have agents claim a card before they work on it, then advance it. The claim tells other agents the card is taken; the workflow records where it is.

Workflows REST API

Definitions, assign, advance, reorder, and board.

Task claims

Leases that stop agents from colliding on a card.

Webhooks

Get a transition event when a page changes state.

Templates

Init templates that ship with workflows.
Last modified on October 19, 2026