The fabriq-admin console is a web dashboard over a running fabriq instance. It talks
to the adminapi HTTP surface (forgeext/adminapi) — the same
surface the connection string and remote clients use — and
renders one interactive surface per subsystem. It is a library-first, runtime-pluggable
React app: mount <FabriqAdmin> into a host app, or run the bundled cmd/admin-demo.

Every request is tenant-scoped: a tenant switcher sets X-Tenant-ID, and
all reads and writes route to that tenant. Each surface is capability-gated — it renders
only when the instance advertises the backing capability, and write controls appear only
when the matching write capability is present.
Surfaces01
Engine capabilities (which subsystems this instance provides), tenant summary, and quick links to every registered section.
Browse any registered entity type with pagination and reference links, open a row for its full record, and create / edit / delete — capability-badged per type.
Author dynamic entity schemas: list types, view a type's fields, create a type, add /
rename / drop fields, and delete a type — gated on the schema.write capability, with
typed-confirm on destructive actions.
Full-text, semantic (text→vector), and similar-to-entity search with ranked results. Text search supports equality filters over indexed fields, sort, and pagination; vector search supports embedding-meta filters. Manage stored embeddings inline.
Neighbors and traversal from a node, plus a read-only openCypher console with a d3-force visualization of the returned subgraph.
Radius / within queries over geometries, returned with true-metre distances.
Browse the file tree, create folders, upload, download, and delete — the catalog lives in Postgres, bytes in the blob store.
Inspect a CRDT document's merged state and its update log.
The transactional outbox, newest first, with the relay's publish state. Filter by aggregate type and event type (multi-select, server-backed distinct values), aggregate id, and publish state.
Subscribe to a maintained, ordered window and watch enter/leave/move/update deltas stream in.
The agent toolkit's hybrid recall — RRF fusion of vector, full-text, and graph
channels — plus guarded remember writes.
The per-tenant Merkle tree of summaries: browse the digest map and drill into nodes.
Cache stats and invalidation; projection blue-green status, reconcile, and rebuild; migration status, run/rollback, drift, and ad-hoc DDL.
A read-only SQL console (query.raw capability) over a read-only tenant transaction,
with a table / JSON result grid.
Runtime Module Federation: load remote plugin surfaces into the console without a rebuild.
Running it02
The console needs a fabriq instance exposing the adminapi. The quickest path is the
bundled demo, which stands up the full stack (Postgres, Elasticsearch, FalkorDB, Redis,
a file:// blob store) and seeds illustrative data:
# from the fabriq repo — serves the adminapi on :8080
go run ./cmd/admin-demoPoint the console at it (defaults to http://localhost:8080/admin):
# from the fabriq-admin repo
pnpm --filter @fabriq/host dev # Vite dev server, opens the consoleBy default the demo runs unauthenticated — the console loads straight in. To require credentials, enable authentication and, optionally, a dashboard login.
Mounting into a host app03
The console is a library. Import <FabriqAdmin> from @fabriq/admin-sdk and give it a
client:
import { FabriqAdmin, connect } from "@fabriq/admin-sdk"
// Build a client from a connection string (carries endpoint + tenant + credential):
const client = connect("fabriq://<key>@fabriq.internal/acme-corp")
export function Console() {
return <FabriqAdmin client={client} plugins={[/* built-in + remote */]} />
}See Connection string for how a client is built from a
fabriq:// DSN, and Authentication for API keys and login.