Skip to main content

Technical reference

A live app is a saved React application plus a set of stored data steps that execute server-side against the sources the app declared when it was built. This page describes the runtime model, its constraints, and the surfaces it exposes.

Execution model

No language model runs when an app is used. The AI participates only at build time; afterwards the app is a fixed bundle whose data steps are executed by a sandboxed runner.

  • Data steps are stored server-side and run without network access to anything but their declared sources. Each step declares its sources, its parameters and the shape of its output; that declaration is the app's least-privilege boundary.
  • Credentials resolve on the server. They are never present in the app bundle or in the browser. A shared viewer never receives them either.
  • Source binding is fixed at build time. A step can only reach the tools, database tables and Nirvai data areas it declared. Adding a source is an edit, not a runtime decision.
  • Database access is read-only. Table sources expose a filtered select. There is no write path from an app to a table.

The refresh lifecycle

Two properties follow from this design:

  • Snapshot semantics. A run with the app's default parameters updates the stored snapshot — the copy every viewer sees on open. A run with non-default parameters (a changed filter or time range) returns to the caller only and does not overwrite it.
  • Fail-closed rendering. A failed refresh never blanks a section that already has data. The previous values remain with an error banner above them. Only a first load with no snapshot renders empty.

Concurrency is one execution per data step at a time. A second refresh while one is in flight is rejected rather than queued; a run that exceeds its window is treated as stale and released.

Access model

PropertyBehavior
OwnershipOne owner per app. Ownership does not transfer.
Visibilitypersonal or organization. There is no per-user grant list and no public or token-based URL.
Member accessView and refresh. Edit, rename, delete and re-share are owner-only.
Execution identityShared refreshes execute as the owner. Tools, credentials and tables resolve against the owner's account, not the viewer's — a viewer's identity would resolve none of them.
Statusdraft, published, or needs_attention when a data step is failing.

Limits

LimitValue
Total execution time per data step5 minutes
Single call to an external service150 seconds
External calls per execution25
Rows returned to the interfaceAggregate server-side to roughly 200 rows per step; larger results are chunked
Concurrent executions per step1

Apps are built to aggregate before returning. A step that needs thousands of rows to answer a question should reduce them server-side rather than paginate them into the browser.

Error types

Failures return as typed results the app renders, not as broken pages.

TypeMeaning
auth_expiredThe credential for a connected service expired or was rejected. Reconnect it.
tool_errorThe external service returned an error for this call.
tool_missingA declared tool or table no longer resolves — deleted, renamed, or no longer owned. Flips the app to needs attention.
timeoutThe step, or one call inside it, exceeded its window.
already_runningAn execution of this step is already in flight.
no_snapshotNo stored data for this step yet; it has never run.
invalid_paramsA supplied filter value is outside the step's declared parameters.
script_errorThe step itself raised an error.
output_too_largeThe result exceeded the size limit.

Building from an outside assistant

An assistant connected over MCP — Claude Code, Codex, Cursor — can build a live app in your account. The division of labour is deliberate: the assistant authors and tests, you approve and save.

It canNotes
List your apps and read one's full contractManifest, per-step parameters, declared sources, run history
List what data is available to build onThe same three source kinds as the in-app builder
Propose sources and propose a lookEach opens a review page in Nirvai that you approve
Test a data step, and validate the whole appThe same validation battery the in-app builder runs
Stage a draftOnly after validation passes; produces a real preview with a Save button
PublishAvailable, but the reviewed Save in Nirvai is the intended path

These actions appear individually in your Activity Feed, each deep-linked to what it produced. Reading another member's shared app through the plugin is not exposed — an assistant reaches only its own account holder's apps.

The in-app builder is not a callable action

The native builder is a streaming conversation, not a single operation. An outside assistant reproduces the same pipeline step by step rather than invoking it wholesale.

What's next