View Experiences
A View Experience is a named, reusable configuration for finding content in a Vertesia project. Instead of building search UI and writing Elasticsearch queries by hand, you describe what users should be able to browse and search — the content scope, the facets, the search behavior, and the result layouts — and Vertesia renders and executes it for you.
Persist a View once, then open it through the generic /view/<id> route or embed it in an application with the
ViewExperience React component.
View execution uses Elasticsearch. Enable it for the project before opening or embedding a View. See Search Configuration.
Anatomy of a View
Every View Experience is four parts. Most of the documentation is organized around them:
View Experience
├── scope which content the View covers — content types, locations, collections, a fixed filter
├── navigation how users narrow down — property facets, hierarchies, ranges, collections, location
├── search how users search — deterministic (keywords + key terms) or agentic (natural language)
└── results how matches are shown — list, table, cards, gallery, or board displays, plus sorting
A View author configures these four sections; the runtime turns them into a secure Elasticsearch query and a normalized result set that the reusable UI renders.
How a View runs, end to end
AUTHOR PERSIST EXECUTE RENDER
┌──────────┐ client.views ┌───────────────┐ resolve ┌──────────┐ execute() ┌──────────┐
│ Studio │ ───────────────▶ │ studio-server │ ────────▶ │ Zeno │ ────────────▶ │ your │
│ editor │ create/update │ (MongoDB) │ by id │ (ES) │ /view/:id or │ app │
│ + Agent │ or an app's │ versioned │ │ secure │ ViewExperience│ UI │
└──────────┘ in-code View └───────────────┘ └──────────┘ └──────────┘
- Authoring happens in the Studio editor (with help from Studio Assistant), or an application ships a View in code. See Configuration.
- Persistence is owned by studio-server: project-scoped, separately revisioned View resources under
/api/v1/views. The platform includes read-onlysys:*Views, and apps can contribute in-code definitions that resolve asapp:<app-name>:<view-id>. - Execution is owned by Zeno at
POST /api/v1/view-executions/:id/execute. It loads the authoritative configuration, composes the query, and returns normalized results. - Rendering uses the generic
/view/<id>route or theViewExperiencecomponent. See Embedding in applications.
The client only ever sends user-controlled state — the text query, selected facets, chosen display, sort, and page. It never sends a raw Elasticsearch request.
Security model
View execution is safe to expose to end users because the server, not the client or the model, owns the dangerous parts of the query:
- The View's scope (content types, locations, collections, fixed filter) and the caller's content-security and project filters are always composed on the server, outside anything a user or an agent supplied.
- Agentic search asks a model to produce a query, but the result is checked against a validated allowlist of query types and fields before the immutable scope and security filters are added around it.
- Only head revisions are searched by default, and callers can only select authored sort options — never arbitrary Elasticsearch sort clauses.
- Generated Elasticsearch DSL and security filters are never placed in the URL. Execution diagnostics may expose the validated model-authored query subtree, but never the server-owned scope or content-security filters.
When to use a View
Use a View Experience when you want a reusable, shareable, permission-aware way to browse and search project content — an internal document library, an operational worklist, a customer-facing search page, or an agent-authored browsing surface. Prefer a direct content search call when you need a one-off query with no reusable UI, and a collection when you only need to group a fixed set of objects without search or navigation.
In this section
- Quickstart — create your first View in three steps.
- Configuration — scope, navigation, search, and result displays in depth, with a complete example.
- Search & agentic planning — deterministic versus natural-language search, and the typed-indexing prerequisite for numeric and date facets.
- Embedding in applications — the route, the
ViewExperiencecomponent, deep links, custom renderers, and in-code (app-contributed) Views. - API & validation reference — REST endpoints, draft preview, permissions, and configuration validation.
- Troubleshooting — common problems and how to fix them.
