Sources
An App reads one connection, or several named sources, each bound to a
connection tablewalk.json configures.
sources: { ops: { connection: 'fieldops', default: true }, billing: { connection: 'billing' },},resources: { work_order: { access: 'write' }, // the default source: bare 'billing.payment': { access: 'read' }, // another source: source.table},- The default source’s resources are bare (
work_order); every other source’s are qualified (billing.payment), in views, pages, paths and grants alike. The dot means a source and nothing else. - Beside others, at most one source says
default: true, and none has to: without one, every resource issource.table. A source standing alone is the default unless it saysdefault: false, so an App that will lose a source can keep its names by saying so first. physical: 'archive.opportunity'binds a name the catalog cannot find on its own; it is the only place an engine schema appears.- A table name two PostgreSQL schemas share is inferred as
<schema>_<name>for each copy (sales_partner,settings_partner); a connection’s"schemas"(or--schema) narrows which schemas it reads.
A source per schema
Section titled “A source per schema”One PostgreSQL connection (a MySQL server) can back several sources, each
scoped to one schema: ops: { connection: 'main', schema: 'ops' } beside
catalog: { connection: 'main', schema: 'catalog' }. Each sees its own
schema’s tables and nothing else, under its own names, so no name collides.
They are one database: a real foreign key from one to the other joins, and
writes to both are one transaction. On one connection every source needs a
schema of its own; a connection’s "schemas", where it lists any, must
include each one. SQLite has none.
Tables without a block
Section titled “Tables without a block”resources: 'all' on a source declares whichever of its tables a view
names, and resources: ['product', 'bin'] the ones listed, without a {}
block each. A table neither names is not served: it answers as one that does
not exist. Such a table grants nothing a block would not; authority.lock
records the line (source catalog resources all).
- Sources on different connections share no joins or transactions. A
declared
referencesfrom one into another is read in two steps: labels, links and related lists, never a filter or sort through it (relationships). - Connection URLs and credentials stay in tablewalk.json; the App names
connections only, and authority.lock records each binding
(
source billing connection "billing"). - Adding, removing or rebinding a source changes the App’s authority, so it needs a restart (reload and restart).
- Named-source Apps are refused over the database browser’s MCP server.
{ "connections": [ { "name": "fieldops", "url": "${FIELDOPS_URL}", "writable": true }, { "name": "billing", "url": "sqlite:./billing.db" } ] }Sign-in, row policies and tenant sources: Sign-in, roles & data.