The keys at the top of an App that name it, say where its data comes from and where it opens. Every key here is stable (status). All parts.
Only name and home are required. id is the App’s address and account
store, a slug of name by default (Help Desk → help-desk); set it before
accounts are created. connection names one configured connection, never a
URL; sources bind several instead.
A view id, or rules read in order on every request, first match wins:
signedOut: true (needs auth, names a public view), roles, and a last
rule with neither. A rule whose view the visitor cannot open gives way to the
next.
Optional; without it there is no menu. An entry is a view id, { to, label },
a navGroup(id, label, children, { icon?, placement?, inline? }) (nesting up to
eight deep) or a feature placement { feature: 'id' }. A top-level group with
inline: true draws its items straight in the top bar as links, and stays a
section in the folded menu and the sidebar. Each list, dashboard, signed-in form or
room appears at most once; landings and public forms are refused. A list the
menu does not name is still served at its address and offered by ⌘K. Icons are
Phosphor names from a curated set, and a wrong one is refused with the nearest.
See Navigation and shell.
Every record, list, dashboard and form has one canonical address;
tablewalk check --app <dir> --routes prints them all. For a server serving
one App, at the root:
A record is addressed through the first list showing its table among the
views the person reading is served: the resource’s view where they are
served it, else the first plain list over it in menu order. A resident’s
repair is /my-requests/12 and the office’s the same record at /repairs/12;
a mailed link is the recipient’s own, and a signed-in person opening the
other’s address is sent on to theirs. Several Apps on one
server each keep their id (/lintel/leases/12), and --base-path /tools
puts the whole server under a proxy’s path. new, api, assets,
sign-in, welcome and form are reserved segments. A query-language
address still opens and is rewritten to the canonical one.
The one connection this App is for, by id or name. Absent means every connection. Not with sources. A name that is an identifier is also the App’s one source’s: commands name it in defineSource. Used in examples/apps/tick/app.ts.
Where a visitor starts, required: a view id for everyone, or rules read in order that end with a rule with no condition. Used in examples/apps/tick/app.ts.
In the sidebar, the section starts folded to its heading for someone who has never opened or closed it. Their own fold is remembered over it; it still opens while it holds the current room, while filtering, and in the rail. One of true.
In the top bar, a top-level group’s entries stand in the bar as links of their own, not under its menu. The sidebar still draws the group. One of true. Used in examples/apps/tick/app.ts.
Named connection bindings. At most one says default: true; several may share a connection, each with its own schema. Not with root connection. Used in examples/apps/lintel/app.ts.
Server-configured connection ID or name, never a connection URL. Used in examples/apps/tick/app.ts.
sources.*.default
boolean
Stable
The source whose resources stay bare. At most one says true when there are several, and none has to; a source standing alone is the default unless it says false.
sources.*.realm
Stable
A platform-only source: read by a tenant App’s platform realm alone, never the default, never written. Its resources are owner platform, access read. One of platform.
sources.*.resources
array
Stable
The tables this source brings in without a block each: ‘all’, or their names. Each is an implicit {} block, granting nothing. One of all. Used in examples/apps/tick/app.ts.
sources.*.schema
string
Stable
The one schema of its connection this source sees (a PostgreSQL schema). Several sources may share a connection, each with a schema of its own. Not on SQLite.