The complete vocabulary of the app definition JSON (schema version 2). Every field here is enforced at save time; anything outside this vocabulary is rejected. Conventions used below: required fields are marked ✱; all concept and column references are validated against the page’s ontology, with column names matched case-insensitively.

Top level

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
  • checkbox is a single boolean; its placeholder renders as the inline label.
  • radio is one choice from an always-visible set — a dropdown alternative for a few options.
  • password is masked; textarea is multi-line.
  • select / combobox / multi_select / radio take options from options (static) or optionsSource (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 with type: "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’s fields:

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’s span (1–12) sets its width.
  • columns — side-by-side stacks; each widget’s column (1-based) picks its stack, weights sets 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 name and pages; unique page, input and run-group ids; every page has a resolvable project.id.
  • Vocabulary: every type, trigger, layout, variant, operator, color and format must be one of the values listed on this page; span must be an integer 1–12.
  • References: widget inputId / groupId / outputId must point at existing inputs, groups and taps; formId must name a form; optionsSource and seedFrom concepts must exist, and their columns must exist on those concepts.
  • Bindings: params keys must be declared @params; {{…}} roots must be published by something on the page; facts must bind a record group to an input predicate.
  • Warnings (non-blocking): an output tap on a concept not computed by its group’s execute; weights on a non-columns layout.