Fields
Every column in a table has a type that controls what values it accepts, how the cell renders, and which filter operators are available. You set the type when you create the column; you can change it later, but the stored values won't be coerced automatically.
Basic field types
TEXT
Stores a short freeform string. The inline cell editor is a single-line <input> that commits on Enter or blur. Optional settings: maxLength (integer) and pattern (a regular expression). Validation failures surface as a save-time error rather than blocking input.
LONGTEXT
Stores multi-line text. There is no inline editor — double-clicking the cell opens the record dialog, where a full textarea is used. A markdown flag exists in settings but has no rendering pipeline yet; it's a reserved option.
Stores an email address string. By default the cell renders as a clickable emerald badge with a mail icon (mailto: link). You can turn off the badge under settings (clickable: false), in which case the value displays as plain text. Setting allowedDomains restricts accepted values to a list of domain suffixes validated at save time.
PHONE
Stores a phone number string, parsed at display time via libphonenumber-js. The rendered cell shows a country flag followed by the number in international format (for example, +1 415 555 2671). If the value can't be parsed, it falls back to plain text. The region setting (default US) tells the parser which country code to assume for local numbers. You pick the region from a searchable combobox.
URL
Stores a web address. By default, the cell renders as a clickable emerald badge with an external-link icon (opens in a new tab). Set clickable: false to display plain text instead.
NUMBER
Stores a numeric value. The cell is right-aligned with tabular numerals, formatted via Intl.NumberFormat. Settings:
- Currency mode — enable
showCurrencyand pick a currency code (USD,BRL,EUR,GBP,JPY). When active, the locale comes from the currency (USD → en-US, BRL → pt-BR, etc.) and the separator/decimals controls are hidden. - Separator pattern —
1,234.56(en-US style) or1.234,56(pt-BR style). Only visible when currency mode is off. - Thousand separator — Yes/No toggle (default Yes).
- Decimal places — 0–5 (button group).
- Min / max — validation bounds; no UI clamping, surfaces as a save-time error.
- Aggregate —
none,sum, oravg. When any visible NUMBER column has an aggregate set, a sticky footer row shows the result.
SERIAL
An auto-incrementing integer assigned by the database. It is read-only in the grid — there is no editor, and no settings. Useful as a human-readable row identifier.
BOOLEAN
A true/false checkbox. Clicking the cell directly flips the value — there is no separate editor. No settings.
DATETIME
Stores a date, a time, or a full datetime. Settings:
- Mode —
date/datetime/time. Determines which parts of the value are stored and displayed. - Date format — ISO (
YYYY-MM-DD), US (MM/DD/YYYY), EU (DD/MM/YYYY), or long (MMM DD, YYYY). - Time format —
24hor12h(AM/PM). Only relevant when mode includes time. - Timezone —
viewer(the browser's local timezone) or any IANA timezone name (e.g.America/Sao_Paulo). Only available in fulldatetimemode. Date-only and time-only values are stored as local strings (YYYY-MM-DDandHH:mmrespectively) — they are not timezone-normalized.
The editor opens a calendar popover for date selection; when time is also shown, a time input sits at the bottom of the popover.
Select fields
SELECT
Stores a single choice from a pre-configured option list. The cell displays a colored pill. The editor is a popover showing all options; picking one commits immediately.
Options have a value (internal key), a label (display text), and an optional color. You manage options in the column settings panel: add, rename, recolor, or remove. New options get a random hue by default.
MULTISELECT
Like SELECT but stores an array of choices. The cell shows up to several pills inline. The editor popover supports selecting multiple options at once and has check-all / clear buttons. Options are configured the same way as SELECT.
Reference fields
A REFERENCE field points a record at one or more other records (or non-record entities like pages, bots, or projects). The cell displays the resolved label(s) for each referenced entity, fetched live. The editor is a popover with a live search against the target entity set.
Settings:
- entity_type — the type of entity being referenced (e.g.
record,table,page,engine_bot). This determines which picker is shown. - max — optional cap on how many references the cell can hold.
Filter operators for REFERENCE: isEmpty, isNotEmpty, contains, is, isNot.
For the full reference model — including the inline [label](ref:type:id) format in text cells — see References.
File fields
A FILE field stores one or more file attachments. Files are uploaded to Cloudflare R2 and served as time-limited signed URLs.
The cell shows up to three file pills inline (filename + icon; images show an image icon). Clicking a pill opens the file in a new tab. The editor is a dialog with the full file list and an upload button.
The stored cell value is an array of objects with shape { id, key, filename, mime_type, size }.
Settings:
- max — maximum number of files (default 1).
- allowedMimeTypes — array of accepted MIME types or prefixes (e.g.
image/to allow all image formats). - maxSizeBytes — per-file size cap.
Filter operators for FILE: isEmpty, isNotEmpty, mimeIs, mimeIsNot.
Calculated fields
Two field types compute their value automatically and are always read-only:
- FORMULA — a deterministic expression evaluated synchronously every time a depended-on field changes. Result is available in under a second.
- AI — a free-form instruction evaluated by an AI model, asynchronously. The cell shows a pulse icon while the job is pending.
Both use the {{Column Name}} placeholder syntax to reference other fields. Neither can be edited directly in the grid.
See Formulas and AI fields for the full expression syntax, AI field types, recompute triggers, and dependency rules.
Field configuration
Every field — regardless of type — shares a common set of configuration options accessible from the column settings panel:
- Name — the display label shown in the column header and in the record dialog. Names are used as
{{Placeholder}}references in formula and AI expressions, so renaming a column updates all dependent expressions automatically. - Description — optional freeform notes about what the field holds. Shown as a tooltip in the column header.
- Default value — a value pre-filled when a new record is created (not available for SERIAL, FORMULA, or AI fields).
- Required — when enabled, saving a record without a value for this field returns a validation error.
- Hidden — fields can be hidden from specific views without being deleted. Hidden fields still store data and still evaluate (for FORMULA/AI); they're just not visible in that view's grid.
- Position — columns can be reordered by drag-and-drop in the grid header. The per-view column order is stored in
viewSettings.columnOrderand doesn't affect other views.