Document Store Explorer
The Document Store Explorer (/documents) browses the documents a monitored service stores, and shows how its document stores are configured — type-to-table mappings, store options, and the generated DDL.
Route: /documents. Documents are a peer subsystem to event sourcing, not a sub-feature of it: plenty of services use Marten or Polecat document features with no event store at all. That is why this is its own top-level explorer rather than a tab inside the Event Store Explorer. The old /explorer?tab=documents deep link redirects here.
Three similarly-named surfaces
Documents live here. A monitored service's event streams live in the Event Store Explorer. The console's own frontend state lives in the Store Inspector.
Scope bar
The page uses the shared Service ▸ Store ▸ Tenant scope bar:
- Service — only services that actually report a document store are offered. Scope is shared with the global service selector in the header, and a
?service=deep link wins on arrival. - Store — modular monoliths host several document stores; the picker collapses to a static label when the service has only one, so a single-store service shows no redundant control.
- Tenant — appears only for multi-tenanted stores. A conjoined store offers All tenants as well as each tenant; a database-per-tenant store requires a pick, and the page says so ("Select a tenant to query this store.") rather than querying the wrong database.
Scope and the active tab are written back to the URL, so any view you are looking at is a shareable link.
When nothing is reporting a document store the page reads "No services with document stores are currently reporting."
Documents tab
Pick a document type, then query it.
Filters. An id filter is always available. Beyond that, the offered filter facets are derived from what the store actually captures rather than from engine config — common metadata (version, last modified, tenant, soft delete) plus opt-in columns (correlation id, causation id, last modified by) that only appear when the store tracks them. You are never offered a filter that cannot be applied.
Results. Documents render as a table with one column per top-level JSON key, unioned across the page. Scalar values render inline; object and array values render as a clickable chip that opens the nested JSON in a side drawer. A trailing action on each row opens the whole document's JSON in the same drawer. Results are paged, with the total count shown above the table.
Empty states are specific: "Select a document type to browse stored documents" before you pick one, and "No documents found" when a query genuinely comes back empty.
Configuration tab
The store's own shape, for when the question is "is this mapped the way I think it is?":
- Store identity and schema — which store this is and where its tables live.
- Options — the full document-store options description, with per-property tooltips sourced from the underlying library's XML docs.
- Document mappings — each document type and the table it maps to, with the generated DDL fetched on demand and rendered with syntax highlighting.
This tab is the same component the service detail page renders, so the two views cannot drift apart.
