Top level
header
The rendered app header also links to the app’s home ontology automatically.
Pages
A page is one screen of the app, rendered as a tab.Inputs
An input is either a scalar input or a form.Scalar input types
text, number, select, combobox, date, multi_select, checkbox, radio, password, textarea
checkboxis a single boolean; itsplaceholderrenders as the inline label.radiois one choice from an always-visible set — a dropdown alternative for a few options.passwordis masked;textareais multi-line.select/combobox/multi_select/radiotake options fromoptions(static) oroptionsSource(from a concept).
Scalar input fields
A standalone scalar input publishes its value as a page variable continuously — pair it with an
auto run group for buttonless filtering. Place it on the page with an input_ref widget.
Forms
An input withtype: "form" groups fields behind a single submit.
Submitted values become page variables referenced as
{{formId.fieldId}}. A form is placed on the page with a form_ref widget and usually paired with a trigger: "form" run group.
Form fields
Each entry in a form section’sfields:
record_group (row input)
A repeating group of sub-fields — the user enters rows, and the rows feed an input predicate through a run group’s facts binding.
Run groups
The unit of execution: when the trigger fires, run these concepts with these bindings and expose these taps.
Triggers:
Sections
grid— widgets flow onto a 12-column grid; each widget’sspan(1–12) sets its width.columns— side-by-side stacks; each widget’scolumn(1-based) picks its stack,weightssets the widths. The layout for master–detail screens.
Widgets
Common fields:id ✱, type ✱, label, span (grid layouts, 1–12), column (columns layouts).
button actions
buttonStyle: primary, outline, or ghost.
rich_table presentation
What save-time validation checks
Saving an app runs the full definition against the referenced ontologies. Errors block the save; each names the offending element and, for unknown names, suggests the closest match.- Structure: non-empty
nameandpages; unique page, input and run-group ids; every page has a resolvableproject.id. - Vocabulary: every
type,trigger,layout,variant, operator, color and format must be one of the values listed on this page;spanmust be an integer 1–12. - References: widget
inputId/groupId/outputIdmust point at existing inputs, groups and taps;formIdmust name a form;optionsSourceandseedFromconcepts must exist, and their columns must exist on those concepts. - Bindings:
paramskeys must be declared@params;{{…}}roots must be published by something on the page;factsmust bind a record group to an input predicate. - Warnings (non-blocking): an output tap on a concept not computed by its group’s
execute;weightson a non-columnslayout.

