Skip to main content
These blocks connect a page to the rest of the knowledge base: they run DQL queries when the page is viewed, or hold structured records that other pages can query.

kiwi-query

Runs a DQL query when the page is viewed and renders the result as a table or list. Rows link to their pages.
The body is a DQL query. An older key-value form still works when every line is one of from, where, sort, order, limit, or columns:

kiwi-data

Structured records rather than code. The web UI shows them as a table with a kind badge, and the server indexes them so DQL can query them with FROM RECORDS "<kind>".
DQL
Three body shapes work: A kind: in the body wins over the opening line.
  • Field names resolve against the record first, then fall back to the owning page’s frontmatter. Force one side with the record. or page. prefix, for example record.status.
  • Each row also has _kind, _block (which kiwi-data block on the page), and _record (position within the block). Rows default to document order.
  • FROM RECORDS "<kind>" IN "folder/" limits the query to a folder.
  • Records refresh on every write. After upgrading from a version without kiwi-data, run kiwifs reindex once to index older pages.
  • A block is capped at 256 KB.
  • A block that fails to parse (bad YAML, no kind, no records) is skipped and logged, and the rest of the page still indexes. The web UI shows the raw source with the parser’s message.
A table fence with fromData: <kind> renders the records of a kiwi-data block on the same page, so a walkthrough and its dataset share one source.

kiwi-kanban

A drag-and-drop board from YAML columns, or from a DQL query grouped by a field. Dragging a card reorders the board in the browser and doesn’t change the file. Use the copy button to export the prioritized list.
Start each card with - id:. The YAML parser only recognizes a new card on an id line.
To build the board from pages, give a query: and a groupBy: column. Each distinct value becomes a lane, and any columns: you declare fix the lane order and colors:
A query card takes its title from the title or name column (falling back to the file name), and also reads tags, description or summary, priority, and assignee or owner.
For boards that change page frontmatter when you drag a card, use the workflow board in the web UI. See Workflows.

Progress tracker

A ```widget:tracker block tracks progress through a course or problem set. It lists the pages in every top-level folder whose name starts with a number (01-arrays/, 02-trees/, …) as a collapsible section, skipping files that start with _. Readers check pages off and bookmark them, and their progress is saved per reader under the state name you choose.
  • state names the saved progress, so two trackers with the same name share it. A body that is just a name, such as leetcode-progress, works too. The default is progress.
  • modes adds a toggle that switches which frontmatter fields show as chips on each row. The default is one tags mode.
Sections start collapsed. The chips shown under each page’s title come from [ui.tags] banner in .kiwi/config.toml.

DQL

The query language, including FROM RECORDS.

Charts and plots

kiwi-chart draws a DQL result as a chart.

Workflows

State machines behind the workflow board.

Croissant import

Dataset schemas imported as kiwi-data blocks.
Last modified on October 19, 2026