Skip to content

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 is source.table. A source standing alone is the default unless it says default: 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.

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.

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 references from 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.