Topic

The types

One set of twelve types is used for the columns of a table, for inputs and outputs, for the checking of a form, for the API description, for MCP tools and for the answers of an AI.

TypeScript
text(o?)
number(o?)
boolean(o?)
date(o?)      // a moment in time
day(o?)       // a calendar day with no time and no zone
choice(values, o?)
link(tableName, o?)
file(o?)
list(type, o?)
object(shape, o?)
json(o?)
vector(o)     // numbers for search by meaning

Each has a page of its own, as word.text, and so has each option of one, as option.text.min.

The options every type takes

OptionMeans
optionalTrue for a value that may be left out. A value is required when it is left out
defaultThe value that stands in for one that was not given. On a date, 'now' is the moment; on a day, 'today' is the day. A vector takes none
labelThe words a form shows beside the field: text, or a message(...) of the language files
helpThe words a form shows under the field: text, or a message(...) of the language files

The options a column also takes

OptionMeans
uniqueNo two rows hold the same value
indexThe column is indexed
privateThe value never leaves the server in a row: the read rule of the column that no caller passes, held by its paths below. A private column states no search
personalThe value is data about a person
sealedThe value is stored encrypted. sealed: { findable: true } keeps beside it a keyed fingerprint of the value, bound to the table and the column, so a filter of an equal value finds the row with nothing opened, and the same value in another column does not match. A sort and a range on it are code.T2026
readWho may read the column: a rule, as the rules of a table are written, as read: role('hr'). A caller the rule does not let in gets each row without the column, also through a link, in a live answer and on a page, and a row that code with full access read loses it again where it leaves through a typed answer, a field of a group too; is refused a filter, a sort and a group by it (code.T0013); a search and a near are answered over the other columns, the column left out of what is matched, and a near by the column itself finds no row; and a group answers no value worked out from it. A rule that is a filter, as where({ manager: caller('id') }), lets the caller read the column of each row it fits. Code with full access reads it. In the description of the API, an MCP tool and the line of a tool the field is optional, and the line says who reads it, as salary?: number (read by hr). A kept count stands under the rule of its own row: a builder who must hide it states read on it
fromThe value is worked out from the row's own columns, or kept from the rows that link to its row: count, sum, min and max handed { of, by, where, column }, as number({ from: count({ of: orders, by: 'customer' }) }) (word.count)
wasThe column's old name, or a list of them, where it was renamed
byThe work that fills the column: an action, a python or a model, as by: summarize or by: { work, input, take }. On a vector column that states its model: the columns whose words are turned into the vector, as by: 'body'
oldOn a column that states by, and on a vector column: 'drop' or 'keep', what becomes of the values it holds when its work or its model changes

A vector column takes neither unique nor index, and is always optional.

Values in code

TypeIn TypeScript
text, day, file, linkstring. A day is '2026-10-08'. A file and a link are ids
numbernumber
booleanboolean
dateDate in backend code. On the wire it is text in the standard form
choiceThe union of its values
list, objectA list and an object of the inner types
jsonunknown
vectornumber[]

A value that is not there is left out: an optional input that was not given is not in input. Given as an input, null means "not given". Inside a json value, null is kept as it is.

Two types of TypeScript say what a type means in code. Handed<typeof type> is what code is handed for a value of the type: a value that has a default is there, and a moment is a Date. Given<typeof type> is what a caller gives: a value that is optional or has a default may be left out, and a moment is a Date or text.

When a value does not fit

A value that does not fit its type is refused, and the error names each field that failed by its dotted name, with the name of the check it failed: see tent docs T0002.

Tent.js