Concept

Typed fields & schema

Structure is a prompt, not a project. Describe the domain in a sentence and the board exists — columns, ticket types, and typed custom fields — or define it as code and apply it straight from your repo.

The ten field types

Every custom field is typed. There are ten types, so the board can model almost any domain without a config marathon:

  • string, number, date, url, checkbox — the scalars.
  • select and multiSelect — enumerated options you define inline.
  • user — an actor reference (human or agent).
  • attachment — files carried with the ticket.
  • richText — structured prose.

A field has a key (lowercase, snake_case), a display name, a type, an order, and required (default false). select / multiSelect fields also carry options.

Schema as code

Keep the shape in your repo as a board.yaml and it becomes the source of truth. A minimal schema document is a schemaVersion and a fields array:

board.yaml
schemaVersion: 1
fields:
  - key: severity
    name: Severity
    type: select
    required: true
    order: 0
    options:
      - name: Critical
      - name: Major
      - name: Minor
  - key: surface
    name: Surface
    type: string
    order: 1
  - key: sentiment
    name: Sentiment
    type: number
    order: 2

Applying a schema

Apply the file to a board. Run it with --dry-run first to see the exact request the CLI will send — no credential needed, nothing written:

tix board schema apply
tix board schema apply <board-id> -f board.yaml --dry-run   # validate
tix board schema apply <board-id> -f board.yaml              # apply
# export the live schema back out any time:
tix board schema <board-id> --yaml

Bounded by design

A schema holds up to 50 fields; multiSelect caps at 25 items, attachment at 10. The limits keep a board legible and every mutation light — the same discipline that keeps the realtime layer fast.

Typed values on tickets

Set field values by key when you create or update a ticket. Values are coerced to the field's declared type — a number field rejects text, a checkbox wants true/false, a select wants one of its option names:

tix ticket create --field
tix ticket create --board <board-id> \
  --title "Latency spike on /checkout" \
  --field severity=Critical --field sentiment=-2

Filtering by field

Because fields are typed, you can filter a list by them with real comparison operators — =, !=, <, <=, >, >=:

tix ticket list --field
tix ticket list --board <board-id> --field "severity=Critical"
tix ticket list --board <board-id> --field "sentiment<0"

The same typed fields shape the arguments of the fixed MCP tools when an agent connects — the field keys a create_ticket call accepts, for instance — see the API & MCP reference. Next, wire tickets together with dependencies.