Data tables

Field types overview

12+ types: text, number, date, select, attachment, AI, doc-link, and more.

Primitive types

Primitive types map to what Notion or Airtable users already know. No formulas or prompts required — they are just storage slots with the right UI affordance.

  • text — single line (titles, IDs)
  • rich_text — multi-line Markdown with bold, links, code
  • number — with optional unit (USD, kg, %) and precision
  • select / multi_select — colored tag enums
  • date — date + optional time, optional timezone
  • checkbox — boolean, rendered as a square
  • url / email / phone — text with semantic validation and click behavior
  • attachment — files stored under <vault>/.kition/attachments/

Relational types

These three types turn isolated tables into a real database. relation stores a pointer to a row in another table; rollup follows that pointer and aggregates a field from the far side; doc_link pins a row to a .md file so navigation is bidirectional.

  • relation — link to one or many rows in another table; row cards render inline
  • rollup — aggregate a field across a relation (sum, count, avg, min, max, concat)
  • doc_link — point to a .md in the vault; backlinks appear automatically on the doc side

Computed types

Computed fields do not store data — they evaluate per row on read. formula is deterministic; ai_field is not. The key trade-off is debuggability and cost: a broken formula is obvious; a broken AI field requires reading the prompt to understand why.

  • formula — Excel-style expressions, syntax below
  • ai_field — agent-computed via prompt (see "Setting up an AI field")
  • created_at / updated_at — system-maintained, read-only
  • created_by / updated_by — populated in team vaults
// Days since a date column was set
days_since({last_contact})

// Conditional priority based on number + checkbox
if({score} > 8 && {is_blocker}, "P0", if({score} > 5, "P1", "P2"))

// Concat across rollup
concat(rollup({Tasks}, "title", "list"), ", ")

How to pick a type

  • Prefer select over text whenever the values are bounded — filtering and reports get more reliable
  • Use rich_text sparingly — tables should feel database-like, not document-like; link out to a doc with doc_link for long content
  • For tables over 1000 rows, avoid ai_field on the hot path — switch to manual mode and only refresh recent batches
  • relation beats stuffing foreign IDs into a text column — you get a real reference, not a string

Related articles

Ready when you are.

Kition is a local-first AI workspace. Markdown documents, structured tables, and an AI agent — running on your own machine, against the model provider you choose.