Skip to content
LogoLogo

Manifest Reference

Generated from @openislands/schema by scripts/gen-reference.ts. Do not edit by hand. Run pnpm gen:reference to refresh it after a schema change.

A manifest is the typed declaration of a data app: the datasets it reads, the pages and islands that render them, the optional actions and connectors that write to them, and the queries that read from them. This page documents every field the schema accepts. The schema is the single source of truth: the CLI, runtime, and MCP server all validate against it, so an island bound to a field that doesn't exist fails the build and names the island.

Top level

A manifest is a JSON object with the following top-level shape:

{
  "version": 1,                  // required: the manifest format version, always 1
  "title": "Finance Overview",   // required: the app title
  "icon": "wallet",              // optional: the app's tile icon in the workspace app rail
  "datasets": { /* ... */ },     // required: named data sources (see Datasets)
  "pages": [ /* ... */ ],        // required: the app's pages (see Pages)
  "actions": { /* ... */ },      // optional: typed data writes (see Actions)
  "queries": { /* ... */ },      // optional: typed, parameterized reads (see Queries)
  "connectors": { /* ... */ }    // optional: vendored sync integrations (see Connectors)
}
FieldTypeRequiredDescription
version1yesThe manifest format version. Always 1.
titlestringyesThe app title, shown in the chrome.
iconstringnoOne of the curated icon names, used for the app's tile in the workspace app rail.
datasetsobjectyesA map of dataset name to a dataset declaration. See Datasets.
pagesarray of objectyesThe app's pages, one sidebar entry each. See Pages.
actionsobjectnoA map of action name to an action declaration. See Actions.
queriesobjectnoA map of query name to a query declaration. See Queries.
connectorsobjectnoA map of connector name to a connector declaration. See Connectors.

Datasets

datasets maps each dataset name to a source. A dataset is one of three shapes: a file source, a SQL transform, or a SQLite table.

"datasets": {
  "net_worth": { "source": "data/net_worth.csv" },            // a CSV / JSON / Parquet / SQLite file
  "monthly":   { "sql": "models/transforms/monthly.sql" },    // a DuckDB SQL transform over other datasets
  "tracks":    { "source": "data/library.sqlite", "table": "tracks" } // a table within a SQLite database
}
FieldTypeRequiredDescription
sourcestringnoPath to a CSV / JSON / Parquet / SQLite file. One of source or sql is required.
sqlstringnoPath to a DuckDB SQL transform. One of source or sql is required.
tablestringnoThe table within a .sqlite / .db source. Required for a SQLite source; an error on any other source.
descriptionstringnoFree-form note describing the dataset.

A .sqlite / .db source requires table; supplying table for any other source is a validation error. A sql dataset is derived and read-only; it can never be the target of an action or a connector.

Pages

Each entry in pages is a page: one sidebar entry. A page holds either a flat islands list or tabbed groups, never both:

{
  "id": "overview",       // required: unique page id, used in the URL
  "title": "Overview",    // optional: sidebar label
  "icon": "house",        // optional: one of the curated page icons
  "filters": [ /* ... */ ],  // optional: page-level shared filters (see Page filters)
  "islands": [ /* ... */ ]   // a page has EITHER islands ...
  // "groups": [ { "id": "...", "title": "...", "islands": [ /* ... */ ] } ] // ... OR groups
}
FieldTypeRequiredDescription
idstringyesUnique page id, used in the /<appId>/<pageId> URL.
titlestringnoSidebar label for the page.
iconstringnoOne of the curated page icons (e.g. house, chart-line, wallet).
filtersarray of objectnoPage-level shared filters: a date range or a categorical select.
islandsarray of objectnoThe page's islands. Exactly one of islands or groups.
groupsarray of objectnoTabbed groups of islands. Exactly one of islands or groups.

A group is { id, title?, islands }: a string id, an optional title, and its own islands list. Groups render as tabs under the page header, deep-linked via ?group=<id>.

Page filters

A page's optional filters declare shared controls in the page header. Each filter's bind maps each affected dataset to the column the filter applies to; islands whose dataset appears in bind re-query when the filter changes, and the rest ignore it. Two kinds are supported: a daterange over a date column, and a select that narrows a categorical column.

"filters": [
  { "id": "period", "type": "daterange", "label": "Period",
    "bind": { "net_worth": "month", "transactions": "ts" } },
  { "id": "team", "type": "select", "label": "Team", "multiple": true,
    "bind": { "services": "owner" } }
]
FieldTypeRequiredDescription
idstringyesUnique filter id within the page.
typestringyesThe filter kind: daterange or select.
labelstringnoLabel shown on the control.
bindobjectyesA map of dataset name to the column the filter applies to. Each column is validated against the live data.
multiplebooleannoselect only: allow several values (IN); default single (=).
optionsarray of stringnoselect only: explicit choices; when omitted, the bound column's live distinct values are used.

Actions

An action is a manifest-declared, typed write into a source dataset (a sql dataset is never writable). mode: "insert" appends rows: an append for a flat file (CSV / JSON(L)), an INSERT for a SQLite table. The row schema is derived from the live data; fields only narrows or annotates it.

"actions": {
  "log_meal": {
    "dataset": "meals",
    "mode": "insert",
    "fields": {
      "meal_type": { "enum": ["breakfast", "lunch", "dinner", "snack"] }
    }
  }
}
FieldTypeRequiredDescription
datasetstringyesThe source dataset to insert into. Must not be a sql dataset.
mode"insert"yesThe write mode. v1 supports insert.
fieldsobjectnoPer-column overrides on the derived row schema (see field overrides).
descriptionstringnoFree-form note describing the action.

A field override (fields.<column>) narrows one column of the derived row schema:

FieldTypeRequiredDescription
type"string" | "number" | "boolean" | "date"noConstrain the column to one type.
enumarray of stringnoConstrain the column to a fixed set of string values.
minnumbernoMinimum for a numeric column.
maxnumbernoMaximum for a numeric column.
defaultstring | number | booleannoValue applied when the column is omitted.
descriptionstringnoFree-form note describing the column.

Queries

A query is a manifest-declared, read-only read over one dataset, written as a declarative spec — not raw SQL. The compiler translates it to a parameterized, type-aware SELECT, validates every field against the live columns, and binds every param and value (so it's injection-safe). Its dataset is a source dataset or a sql transform; there are no joins, so heavy shaping lives in a transform the query points at.

"queries": {
  "get_daily_macros": {
    "description": "Macros + goals for one day; omit date for the latest.",
    "dataset": "macros_daily",
    "params": { "date": { "type": "date", "required": false } },
    "where": [{ "field": "date", "op": "eq", "param": "date" }],
    "orderBy": [{ "field": "date", "dir": "desc" }],
    "limit": 1
  }
}
FieldTypeRequiredDescription
datasetstringyesThe dataset to read: a source dataset or a sql transform.
selectarray of string | objectnoColumns to return: a column name or { field, fn?, as? } where fn is sum / avg / count / min / max. Omit for all columns.
wherearray of objectnoFilters, ANDed together; each is { field, op, param } or { field, op, value } (see filter ops).
groupByarray of stringnoColumns to group by, for aggregate select entries.
orderByarray of objectnoSort keys, each { field, dir? } where dir is asc / desc (default asc).
limitnumbernoMax rows returned.
paramsobjectnoA map of parameter name to a parameter declaration (see query params).
descriptionstringnoFree-form note describing the query.

A query param (params.<name>) declares one parameter, referenced by a where clause's param:

FieldTypeRequiredDescription
type"string" | "number" | "boolean" | "date"noThe parameter type. Defaults to string.
requiredbooleannoWhether the caller must supply it. Defaults to true; false makes it optional.
enumarray of stringnoConstrain a string parameter to a fixed set of values.
minnumbernoMinimum for a numeric parameter.
maxnumbernoMaximum for a numeric parameter.
defaultstring | number | booleannoValue used when the caller omits it; implies optional.
descriptionstringnoFree-form note describing the parameter.

A filter (where[]) names a field, an op, and exactly one of param (bind a declared param) or value (a literal). The ops are eq, ne, lt, lte, gt, gte, contains (case-insensitive substring), sameDay (match a timestamp field to a date), and in (a literal value array). A filter bound to an optional param the caller omits is dropped, so the query runs without it.

Connectors

A connector is a vendored integration that syncs a provider's data into source datasets through the same checkpointed write path actions use. The integration code lives in the user's project at <module>/index.ts; the manifest declares an instance:

"connectors": {
  "whoop": {
    "module": "connectors/whoop",                  // connector directory, relative to project root
    "datasets": { "recovery": "whoop_recovery" },  // connector output name → manifest dataset name
    "schedule": "6h",                              // optional: sync interval, overrides the connector default
    "config": { "lookbackDays": 30 }               // optional: validated against the connector's own schema
  }
}
FieldTypeRequiredDescription
modulestringyesConnector directory relative to project root, e.g. connectors/whoop.
datasetsobjectyesA map of connector output name to the writable source dataset it syncs into.
schedulestringnoSync interval, overriding the connector default (<n>m, <n>h, <n>d, or ms-style).
configobjectnoFree-form config, validated against the connector's own schema at load time.
descriptionstringnoFree-form note describing the connector instance.

Each datasets value must name a writable source dataset (never a sql dataset), and each key must be one of the connector's declared outputs.

Islands

Each island in a page's islands (or a group's islands) is an object discriminated by its type. Below is every built-in type with its minimum grid span and the fields its config accepts. id, title, and span are common optional fields on every data-bound island; span is a 1–12 grid column count and must not fall below the island's minimum span. Bind an island only to fields that exist in its dataset; a missing field fails validation and names the island.

A layout.row is a structural wrapper: it holds other islands and forces them onto their own full-width grid row. It carries no span, title, or data binding, and it cannot nest another layout.row.

Built-in islands: metric.kpi · metric.scorecard · timeseries.line · category.bar · category.combo · waterfall.bars · breakdown.treemap · distribution.heatmap · activity.calendar · funnel.steps · rank.list · compare.radar · map.choropleth · correlation.scatter · category.pie · table.grid · timeline.feed · gauge.rings · gauge.goal · gauge.meter · status.grid · search.box · note.card · source.doc · content.editor · form.entry

metric.kpi

A single headline number, optionally with a delta vs the previous row or a target — use for at-a-glance KPIs.

Minimum span: 2

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
valuestringyesfield holding the headline value
compareTostringno'prev', 'none', or a field name
targetstringnofield holding a target to compare against
unitstringno
formatvalue formatnoDisplay format for a value. Currency: usd, eur, gbp, jpy. Number: int, decimal, pct (a 0–1 fraction shown as a %), compact (1.2K). Unit: kg, bytes (1024-scale), duration (a number of seconds → 1h 5m). Date/time: date, datetime, time, month. Omit for a plain number with up to 2 decimals. See the Value formats reference (/reference/value-formats).
colorstringno6-digit hex color (e.g. "#22C55E") for the sparkline, overriding the default palette

metric.scorecard

A compact scorecard of several KPIs off the last row — use for a tidy row of related numbers, each with an optional delta vs the previous row.

Minimum span: 3

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
statsarray of objectyesthe stats to show, each read off the last row
columnsnumbernofixed grid column count; defaults to responsive

timeseries.line

A line chart over time — use for trends; supports multiple y fields, a series split, and a goal line.

Minimum span: 4

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
xstringyesdate/time field
ystring | array of stringyesnumeric field(s)
seriesstringnofield to split series by
colorsarray of stringnoCSS colors per y field (or per series value, in first-seen order), overriding the default palette
optionsobjectno

category.bar

A bar chart across categories — use to compare discrete groups; supports grouped or stacked bars.

Minimum span: 4

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
xstringyescategory field
ystringyesnumeric field
groupstringno
stackedbooleanno
colorsarray of stringnoCSS colors per series (group value or y field), overriding the default palette

category.combo

A dual-axis chart: bars on the primary axis, lines on a secondary axis — use to compare a level against a rate (revenue vs margin, volume vs price).

Minimum span: 4

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
xstringyescategory or date field (x axis)
barsstring | array of stringyesnumeric field(s) drawn as bars on the primary y-axis
linesstring | array of stringyesnumeric field(s) drawn as lines on the secondary y-axis
stackedbooleannostack the bar series into one bar per category
colorsarray of stringnoCSS colors per series (bars first, then lines), overriding the default palette
formatvalue formatnoformat for the primary (bar) y-axis
lineFormat"usd" | "eur" | "gbp" | "jpy" | "int" | "decimal" | "pct" | "compact" | "kg" | "bytes" | "duration" | "date" | "datetime" | "time" | "month"noformat for the secondary (line) y-axis

waterfall.bars

A waterfall / bridge chart — use for a P&L walk or variance: an opening anchor, signed +/− steps that accumulate, and closing anchors. Mark anchor rows via a kind field whose value is "total".

Minimum span: 4

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
labelstringyesstep-name field (x axis)
valuestringyessigned delta per step; for a total/anchor row, its absolute level
kindstringnofield marking anchor rows: a row whose value here is "total" draws as an absolute bar from zero (opening/closing/subtotal). Omit to make every row a delta.
colorsobjectnoCSS colors per tone, overriding the defaults (increase green, decrease red, total neutral)
formatvalue formatnoDisplay format for a value. Currency: usd, eur, gbp, jpy. Number: int, decimal, pct (a 0–1 fraction shown as a %), compact (1.2K). Unit: kg, bytes (1024-scale), duration (a number of seconds → 1h 5m). Date/time: date, datetime, time, month. Omit for a plain number with up to 2 decimals. See the Value formats reference (/reference/value-formats).

breakdown.treemap

A treemap of part-to-whole composition — use to show how a total splits across (optionally hierarchical) parts.

Minimum span: 4

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
labelstringyes
valuestringyes
parentstringnofield for hierarchy parent
colorsarray of stringnoCSS colors cycled across top-level nodes, overriding the default palette

distribution.heatmap

A matrix heatmap — use to show one value across two categorical dimensions (x × y), shaded by a continuous color scale.

Minimum span: 4

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
xstringyescolumn-category field (x axis)
ystringyesrow-category field (y axis)
valuestringyesnumeric field mapped to each cell's color
colorsarray of stringnogradient color stops for the scale, overriding the default
formatvalue formatnoDisplay format for a value. Currency: usd, eur, gbp, jpy. Number: int, decimal, pct (a 0–1 fraction shown as a %), compact (1.2K). Unit: kg, bytes (1024-scale), duration (a number of seconds → 1h 5m). Date/time: date, datetime, time, month. Omit for a plain number with up to 2 decimals. See the Value formats reference (/reference/value-formats).

activity.calendar

A calendar heatmap — use to show a daily value over weeks and months, GitHub-contributions style; rows on the same day sum.

Minimum span: 6

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
datestringyesdate field — any parseable date or timestamp
valuestringyesnumeric field mapped to the day's color intensity
colorsarray of stringnogradient color stops, overriding the default
formatvalue formatnoDisplay format for a value. Currency: usd, eur, gbp, jpy. Number: int, decimal, pct (a 0–1 fraction shown as a %), compact (1.2K). Unit: kg, bytes (1024-scale), duration (a number of seconds → 1h 5m). Date/time: date, datetime, time, month. Omit for a plain number with up to 2 decimals. See the Value formats reference (/reference/value-formats).

funnel.steps

A funnel of sequential stages — use for conversion or drop-off; each stage's width is its share, ordered by the rows unless sort is set.

Minimum span: 3

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
labelstringyesstage-name field
valuestringyesnumeric field — the count at each stage
sort"none" | "ascending" | "descending"nofunnel ordering; 'none' keeps the declared row order
colorsarray of stringnoCSS colors per stage, overriding the default palette
formatvalue formatnoDisplay format for a value. Currency: usd, eur, gbp, jpy. Number: int, decimal, pct (a 0–1 fraction shown as a %), compact (1.2K). Unit: kg, bytes (1024-scale), duration (a number of seconds → 1h 5m). Date/time: date, datetime, time, month. Omit for a plain number with up to 2 decimals. See the Value formats reference (/reference/value-formats).

rank.list

A ranked Top-N list with proportional bars — use for leaderboards: top products, customers, errors, or movers.

Minimum span: 3

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
labelstringyesfield naming each row
valuestringyesnumeric field the rows are ranked by
limitnumbernomax rows shown
sort"descending" | "ascending"norank order by value
secondarystringnooptional field shown beside each row's value
colorstringnoCSS color for the bars, overriding the default accent
formatvalue formatnoDisplay format for a value. Currency: usd, eur, gbp, jpy. Number: int, decimal, pct (a 0–1 fraction shown as a %), compact (1.2K). Unit: kg, bytes (1024-scale), duration (a number of seconds → 1h 5m). Date/time: date, datetime, time, month. Omit for a plain number with up to 2 decimals. See the Value formats reference (/reference/value-formats).

compare.radar

A radar (spider) chart — use to compare entities across several metrics at once; each metric is an axis, each row a polygon.

Minimum span: 4

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
metricsarray of stringyesnumeric fields, one radar axis each
seriesstringnofield naming each polygon (one per row); omitted numbers them Series 1, 2, …
maxnumbernofixed max for every axis; omitted maxes each axis at its metric's peak
colorsarray of stringnoCSS colors per polygon, overriding the default palette
formatvalue formatnoDisplay format for a value. Currency: usd, eur, gbp, jpy. Number: int, decimal, pct (a 0–1 fraction shown as a %), compact (1.2K). Unit: kg, bytes (1024-scale), duration (a number of seconds → 1h 5m). Date/time: date, datetime, time, month. Omit for a plain number with up to 2 decimals. See the Value formats reference (/reference/value-formats).

map.choropleth

A geographic choropleth — use to shade regions (world countries) by a value; region names must match the map's names. Local-first: the map ships as vendored GeoJSON, no network.

Minimum span: 5

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
regionstringyesfield holding each row's region name, matching the map's region names (e.g. a country name like "France")
valuestringyesnumeric field mapped to each region's color
mapstringnothe registered map name
colorsarray of stringnogradient color stops, overriding the default
formatvalue formatnoDisplay format for a value. Currency: usd, eur, gbp, jpy. Number: int, decimal, pct (a 0–1 fraction shown as a %), compact (1.2K). Unit: kg, bytes (1024-scale), duration (a number of seconds → 1h 5m). Date/time: date, datetime, time, month. Omit for a plain number with up to 2 decimals. See the Value formats reference (/reference/value-formats).

correlation.scatter

A scatter or bubble plot of two numeric fields — use to explore correlation; split into series by a field and size points by a third.

Minimum span: 4

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
xstringyesnumeric field for the x axis
ystringyesnumeric field for the y axis
seriesstringnofield splitting points into one colored series per distinct value
sizestringnonumeric field driving bubble radius; omit for fixed-size dots
labelstringnofield naming each point, shown in the tooltip
colorsarray of stringnoCSS colors per series, overriding the default palette
formatvalue formatnoformats the y value (axis + tooltip)
xFormatvalue formatnoformats the x value (axis + tooltip)

category.pie

A pie or donut chart of part-to-whole composition — use for one series' share across a handful of categories; set donut for a hole.

Minimum span: 3

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
labelstringyescategory field naming each slice
valuestringyesnumeric field sizing each slice
donutbooleannorender with an inner radius (a donut hole)
colorsarray of stringnoCSS colors per slice (in descending-value order), overriding the default palette
formatvalue formatnoDisplay format for a value. Currency: usd, eur, gbp, jpy. Number: int, decimal, pct (a 0–1 fraction shown as a %), compact (1.2K). Unit: kg, bytes (1024-scale), duration (a number of seconds → 1h 5m). Date/time: date, datetime, time, month. Omit for a plain number with up to 2 decimals. See the Value formats reference (/reference/value-formats).

table.grid

A paginated table of raw rows: use when exact values matter; supports column formats, click-to-open details, and collapsible groups.

Minimum span: 5

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
columnsarray of objectno
detailsarray of objectnofields hidden from the row, revealed by clicking it
groupByobjectno
pageSizenumberno
expandbooleannooffer the see-all / expand dialog; false renders every row inline instead
drilldownobjectnoan embedded island shown in a clicked row's details dialog, filtered to that row

timeline.feed

A reverse-chronological feed of events: use for logs and activity; supports detail dialogs and collapsible groups, and a rich row layout (header value, inline stats, meta footer) when highlight/stats/footer are set.

Minimum span: 4

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
tsstringyestimestamp field
titleFieldstringyes
detailstringno
kindstringno
detailsarray of objectnofields hidden from the row, revealed by clicking it
groupByobjectno
highlightobjectnoright-aligned emphasized value in the row header
statsarray of objectnolabeled inline stats rendered under the title
footerarray of objectnosmall meta line below the row; the row timestamp always leads it. Setting any of highlight/stats/footer switches the row from a single line to the rich layout
expandbooleannooffer the see-all dialog; false renders every row inline instead
drilldownobjectnoan embedded island shown in a clicked row's details dialog, filtered to that row

gauge.rings

Up to four concentric progress rings read off the last row — use for tracking several goals or budgets at once.

Minimum span: 4

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
ringsarray of objectyesconcentric rings, outermost first; reads the last row (max 4 for legible geometry)

gauge.goal

One ring per goal comparing the last row's value to a goal or target band — use for numbers with a defined good range; within the band reads success-green, under amber, over danger-red. size sets the shared ring footprint so several share a row.

Minimum span: 2

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
goalsarray of objectyesone ring per goal, side by side in a row that wraps; each reads the last row (max 6 to stay legible)
size"small" | "medium" | "large"nofootprint shared by every ring: small packs several goals into a row, large emphasizes one or two

gauge.meter

One or more horizontal usage meters read off the last row — use for quota- or capacity-style values.

Minimum span: 3

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
metersarray of objectyeshorizontal usage bars, top to bottom; reads the last row

status.grid

A responsive grid of state tiles — use for service/check health on ops & status-page dashboards; each tile's tone comes from its state value.

Minimum span: 4

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
labelstringyesfield naming each entity (service, check, host)
statestringyesfield holding each entity's status value
valuestringnooptional metric shown under the label
formatvalue formatnoDisplay format for a value. Currency: usd, eur, gbp, jpy. Number: int, decimal, pct (a 0–1 fraction shown as a %), compact (1.2K). Unit: kg, bytes (1024-scale), duration (a number of seconds → 1h 5m). Date/time: date, datetime, time, month. Omit for a plain number with up to 2 decimals. See the Value formats reference (/reference/value-formats).
tonesobjectnomap a state value to a tone; unmapped values fall back to a keyword convention (up/ok/healthy/online → success, warn/degraded/pending → warning, down/error/critical/fail → danger, else neutral)

A search box over a dataset — typing matches rows case-insensitively across fields, results drop down as an autocomplete; selecting a result opens the row's details.

Minimum span: 3

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
datasetstringyes
fieldsarray of stringyescolumns the query matches against
titleFieldstringyesfield each result shows
detailstringnofield shown as a secondary line under each result
placeholderstringno
limitnumbernomax visible results

note.card

A static markdown card with no data binding — use for commentary, instructions, or context between islands; set tone to render it as an info/success/warning/danger callout.

Minimum span: 3

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
tone"info" | "success" | "warning" | "danger"norenders the card as a colored callout with a matching icon; omit for plain prose
markdownstringyes

source.doc

An embedded file or external link (pdf, markdown, image, link) — use to surface source documents alongside the data; renders as a document card with a type icon, name, and open affordance.

Minimum span: 2

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
filestringno
hrefstringno
kind"pdf" | "markdown" | "image" | "link"no
labelstringnohuman-readable name shown on the card; defaults to the file name or the link's host
descriptionstringnoa short caption shown under the document

content.editor

A full-page content workspace — browse and edit a directory of markdown files (and CSVs) Obsidian-style, with virtual folders and version history. Set exactly one of file (one doc) or dir (a tree). Binds no dataset and renders full-bleed.

Minimum span: 6

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
filestringnopath to a single document under data/ or docs/ — mutually exclusive with dir
dirstringnopath to a directory under data/ or docs/ whose files are browsable and editable — mutually exclusive with file
includearray of stringnoglobs of files to surface when dir is set; defaults to markdown (**/.md, **/.markdown)
csvbooleannoalso surface .csv files (an editable table — cells and row add/delete; read-only when readOnly) when dir is set
readOnlybooleannodisable editing/saving — a viewer only
groupsarray of objectnovirtual folders grouping scattered files; only meaningful with dir

form.entry

A data-entry form card bound to a manifest action — renders one typed input per action field, with a submit button in the bottom-right that inserts a row; the bound dataset's islands then refresh live. The human-facing mirror of the agent's run_action: it reuses the action's typing and so binds no dataset of its own.

Minimum span: 3

FieldTypeRequiredDescription
idstringno
titlestringno
spannumberno
actionstringyesname of a manifest actions entry this form writes to; the form's inputs are derived from that action's resolved row schema — types, enums, ranges, and defaults all come from the action
fieldsarray of stringnothe action's columns to render as inputs, in this order; omit to show every insertable column. Each must be a column of the action's dataset
submitLabelstringnotext on the submit button; defaults to "Add"

Custom islands

When no built-in fits, register a renderer in the user's project under components/custom/<type>/; the directory name is the island type. An unknown island type is accepted as a custom island: with a schema.ts its manifest config is validated by the same machinery that guards the built-ins; without one it renders a placeholder. See the Custom Islands guide for the full shape.