Skip to content

The web interface

Every page shares the same shell: a top navigation bar, a mobile menu, a toast stack, and a set of alert and dialog components. Individual pages render their own content inside this shell; no page inlines styles.

The navbar shows the brand, the signed-in role (when authenticated), and links whose visibility depends on what the account may do:

Link Route Visible when
Admin /admin the account may manage at least one structural area
Permissions /permissions the account may manage roles or users
Analytics / always
Rates /admin/ecb the account may read exchange-rate data
Import /admin/import the account holds an insert grant on some data: object
Export /admin/export the account holds a read grant on some data: object
Password /password authenticated
Log out POST /logout authenticated
Login / Register /login, /register not authenticated

The same links are repeated in the mobile menu, which is toggled with a hamburger below the md breakpoint.

The navbar links are permission-driven rather than role-name-driven. A custom role with the right grants sees the same links an administrator does, and an account that lacks a grant does not see the link at all.

The site answers every form in one of two ways:

  • Errors render an inline alert and a dialog, both carrying the message, and the affected fragment is swapped back into the page with the reason shown.
  • Success dispatches a self-dismissing toast through the toast stack and, where the action changes where you are, redirects through an hx-redirect header rather than a 3xx status.

Pages that fail to load (for example when the backend is unreachable) show a standalone error page. One-line notices are used where the full alert card is too heavy, such as the analytics endpoints.

Selectors that list profiles offer a Global scope (__global) alongside them. Global tables are shared by every profile and are browsed under this scope rather than repeated under each profile. A profile’s own tables are the ones it declares; the global scope’s tables come from the table catalog.

See Admin workspace and How table definitions work for how a selection travels between pages.