What's New in the Reveal November Release (SDK 2.3.0)

The Reveal November release adds AI metering and billing, row-level security, a time zone API, Reveal Skills for AI coding agents and a new Trust Center.

Executive Summary:

The Reveal November release covers Reveal SDK 2.3.0, Reveal AI, Reveal Skills and a new Trust Center. You can map AI models to your customers' plans, check and settle token spend on every call, show each user their own time zone, and filter rows per tenant on the server.

Key Takeaways:

  • Map AI models to your customers' plans with profiles
  • Check every AI call before tokens are spent and settle the real token counts after it
  • Show each user dates and times in their own time zone, and switch it live
  • Build one dashboard and let each tenant see only its own rows
  • Teach Claude Code, GitHub Copilot and Cursor to embed Reveal with Reveal Skills

This month’s release covers Reveal SDK 2.3.0, which shipped on November 5, 2026, along with Reveal AI, Reveal Skills for AI coding agents and a new Trust Center.

If you embed Reveal in a product you sell, most of it comes down to two things - controlling what AI costs, and showing each customer only their own data, in their own time zone.

Upgrading an existing integration? Read Before you upgrade first.

Reveal AI

The usual objections to embedding AI in a product are cost and control. Who pays for the tokens, and what stops one customer from spending the whole budget?

Four Reveal AI capabilities: any model, metering and billing, observability, and no lock-in

Reveal AI is a separate package. Start with System Requirements if you want to lay hands on it.

Any model, any plan

Reveal AI works with OpenAI, Anthropic, Azure OpenAI, Google Gemini and any OpenAI-compatible service. A profile names a model and its settings, and you decide which profiles each of your customer plans includes.

Customer plans mapped to AI models: Economy to a low-cost model, Standard to a balanced one, Premium to the most capable

An entry plan can run a fast, low-cost model while your top plan gets the most capable one. Your client code sees only profile names, never a model ID or an API key.

The plan mapping is covered in Profile Selection.

You can also pick the model per workflow. Reveal tags every AI call with an intent, such as generation-build-report or datasource-ranker, and you can map an intent to a profile: dashboard generation on a larger model, background steps such as datasource ranking on a fast, inexpensive one. A mapped intent takes precedence over the profile the client requests, so it applies to every plan. See Intents.

Metering and billing

Every AI call made for a user passes through a quota gate with two steps:

  • Check first. Before any tokens are spent, you verify the user’s plan and remaining budget.
  • Settle after. When the call ends, you get the token counts the provider reported, so you debit real usage instead of an estimate.

An AI request is checked against plan and quota, answered by the model the plan allows, and settled with real token counts

A denied call never reaches the provider. Your app gets a stable error code, such as ai.quota_exceeded or ai.not_entitled, so it can show an upgrade prompt instead of a generic error. The full list of codes is in Error Handling.

Plan your limits around provider calls rather than user actions, because one chat message can make several calls. Metering and Billing compares the quota gate with usage tracking, and the full billing example is in Quotas and Billing.

Observability built in

Reveal produces a record for every AI call, with its feature, model, provider and token counts. Records never contain prompt or response text.

Every AI call is measured by feature, model and provider, no prompt text is recorded, and records can go to your analytics

On ASP.NET, logs and metrics work with no setup, and you can export the metrics through OpenTelemetry. On every platform, a usage sink sends the records to your own analytics.

Use those records for reporting and bill from the settle step, because delivery to a sink is best effort. See Usage Tracking and Observability.

No lock-in

Buyers raise two objections about embedded AI, and each has an answer.

Two objections to embedded AI, answered by bringing your own key and by using any OpenAI-compatible endpoint

“We don’t want your LLM choice.” With dynamic profiles, in preview, each user connects their own provider key and model. Your application stores the connection details, and Reveal never stores or logs the keys.

There are two limits to know about: Google Gemini isn’t available for dynamic profiles, and datasource ranking during dashboard generation still runs on your models. See Dynamic Profiles (BYOK).

“Our data can’t go to your vendor.” Any service with an OpenAI-compatible API, such as Ollama, LM Studio or vLLM, works as a provider. See Custom Endpoints.

To review what reaches the model in the first place, Data Handling lists what each AI operation sends, including sample field values from your data.

Time zones

Dashboards have always shown a timestamp as it was stored, so 14:00 UTC read as 14:00 UTC in New York and in Berlin. With the new time zone API, the same timestamp shows as 9:00 AM in New York and 3:00 PM in Berlin on November 4.

Before, New York and Berlin both see 14:00 UTC. After, New York sees 9:00 AM and Berlin sees 3:00 PM

Set RevealSdkSettings.timeZone to follow each user’s browser, or to a time zone saved in your app’s user profile. Reveal converts DateTime fields on the server and relative date filters such as Today follow along, with no changes to dashboards or data sources.

The time zone can also be switched live. Changing it on an open dashboard reloads the data in place and keeps filter selections, drill-down and the maximized visualization.

Reveal doesn’t include a picker, so your app provides the control, and Time Zones has an example you can copy.

A few things to check when you adopt it:

  • Nothing changes until you set a time zone.
  • Date and Time fields don’t shift. Only DateTime fields read from the data source are converted.
  • A dashboard that already converts dates with applyTimeZone() needs that formula removed, or values convert twice.
  • Server-side exports take their own TimeZone option and use UTC when it isn’t set.
  • Conversion works on the supported data sources.

Row-level security

Build one dashboard, and each tenant sees only its own rows.

One dashboard passes through row-level security, and Tenant A and Tenant B each see only their own rows

You set a row filter on a data source item in your server’s data source provider, using the user context of the request. Reveal applies it to every query that reads the item: visualizations, totals, filter value lists, blended data and exports. It’s available in the ASP.NET, Java and Node.js server SDKs, and your client code doesn’t change.

How it protects the data:

  • The filter stays on the server and never reaches the client.
  • It runs before aggregation, so totals and pivot grand totals count only the rows the user can see.
  • User context values go into the query as parameters.
  • Results are cached per filter value.
  • When a filter can’t be applied, the request fails instead of returning unfiltered rows.

A filter can match the user’s tenant, a list of values or an expression, filters can be combined, and named roles such as administrators can be exempt.

Two things to get right:

  • Fill the user context from an identity your server has verified, never from a value the browser sends.
  • Check that your data sources are on the supported list.

Setup for each platform is in Row-Level Security.

Reveal Skills for AI coding agents

If you build with Claude Code, GitHub Copilot, Codex or Cursor, Reveal Skills teach the assistant how Reveal works, so a prompt like “Embed a Reveal dashboard in my app” produces code that follows the SDK.

The prompt Embed a Reveal dashboard in my app produces a working embed, with Claude Code, GitHub Copilot or Cursor

There are two skills:

  • reveal-embed covers server and client setup, data sources, user context and theming.
  • reveal-dashboard-authoring creates and edits .rdash files in code with the Reveal DOM.

They’re public in the Reveal.Sdk repository, and AI Agent Skills covers installation. Don’t forget to give our repo a star while you are there!

The new Trust Center

The Trust Center gathers what a security review asks for in one place: where Reveal can be deployed, how it fits your identity model, who is responsible for what, and a production checklist.

SBOMs with VEX assessments, in one place for your security review

Its Software Bill of Materials page has CycloneDX SBOMs with VEX assessments, across the Reveal server, client and AI packages.

New data engine, on by default

Time zone conversion and row-level security run on Reveal’s new data engine, which is now on by default on both the client and the server.

It pushes aggregation, filters, joins and paging down to your data source wherever the connector supports them, so the database does that work instead of Reveal. A few results can differ from the previous engine, and Before you upgrade lists them.

Exports

Excel and CSV exports used to send the visualization data from the browser back to the server, so large grids could fail at the server’s request size limit. Now the client sends only the dashboard, with its filters and sorting, and the server runs the queries.

  • Grids export completely, up to Excel’s limit of 1,048,576 rows per sheet.
  • A visualization whose data can’t be read gets a sheet with the error instead of failing the whole export.
  • Grid PDF exports apply conditional formatting, including colors, bold and italic text, and icons.
  • Grid and Pivot PDF exports no longer cut text at 200 characters.
  • Excel keeps large-number formatting: a value shown as 1.23M keeps that format, and the cell holds the exact value.
  • Excel keeps a chart legend at the bottom when the dashboard shows it there.

See Exporting and Server Export.

Data sources

  • Oracle now runs aggregations in Oracle instead of in Reveal, and supports parameterized custom queries.
  • PostgreSQL has server-side TLS settings: SslMode and SslRootCertificate.
  • Timeouts: CommandTimeout and ConnectionTimeout are available on PostgreSQL, Redshift, MySQL, MariaDB, SQL Server, Oracle, Snowflake and Sybase.
  • In-memory data now works in the Node.js and Java SDKs.
  • Redis cache now also stores XMLA and Cube metadata and the value lists of dashboard and quick filters.

Connection details for each source are in Data Sources.

Smaller changes

  • Next N days date rules can now include today, on the web client and all three server SDKs.
  • Theme fonts: the web SDK now applies the italicFont and boldItalicFont settings. See Theme Fonts.

Before you upgrade

Check these against your integration before you move to 2.3.0:

  • New data engine: you can keep the previous engine by turning the new one off on both the client and the server, but row-level security needs the new engine. Test these first:
    • ROW, PREVIOUS and the deprecated aggregation functions are rejected with an error in pre-calculated fields, which run before aggregation. They still work in post-calculated fields, the ones you add under Values.
    • Strings sort in the data source’s collation.
    • An average over integers on SQL Server and Redshift keeps its decimals.
  • Snowflake accepts only key-pair credentials. Username and password authentication is gone.
  • Redshift: a blend of two data sources on the same cluster now runs as one cross-database query, with the main data source’s credentials. It fails on DC2 and DS2 nodes.
  • Functions with invalid arguments, such as the logarithm of a negative number, no longer return an empty value and can return an error.
  • Filter search in dashboard and quick filters covers string fields only.
  • Java and Node.js: an exception in a data source, authentication or dashboard provider now fails the request.
  • Node.js: advancedSettings must be a Map.
  • Hyperlink callback: in onUrlLinkRequested, args.url now holds the resolved URL, and args.urlTemplate holds the template.
  • Visual changes: expect screenshot tests to change.
    • Charts now render every series. They used to stop at 30, or 100 for stacked bar and column.
    • Tooltips open to the bottom right of the pointer.
    • The DataGrid has a full border.
    • Grid cells with an italic conditional formatting style change appearance if you set italicFont or boldItalicFont.

Every feature, fix and breaking change, including how to turn off the new engine, is in the 2.3.0 release notes.