Skip to main content

29 posts tagged with "enhancement"

View All Tags

๐Ÿ›ก๏ธ Prevent invalid metric breakdowns in multi-fact schemas

In complex data models, users can create metric breakdowns that are technically valid but analytically wrong.

These queries run successfully and return plausible numbers, but the results are meaningless. This silent failure undermines trust and hurts self-service.

Now you can control which dimensions can be used with each metric using the direction property on relationships.

Why this mattersโ€‹

  • Prevents silent data correctness issues before they reach end users
  • Turns semantic correctness into a default behavior, not a best practice
  • Keeps self-service powerful and safe, even in multi-fact (galaxy) schemas
  • Reduces the need for manual user education or tribal knowledge

๐Ÿ“š Learn moreโ€‹

๐Ÿงฉ Aggregating a dimension on a viz now creates a metric

We've made aggregation on a viz more reusable.

Before: aggregating a dimension on a viz only created a setting on that viz field. It couldn't be reused in filters or in other metrics.

Now: that aggregation creates a new metric, or reuses a matching one from the dataset. This metric can be used in filters, derived metrics, etc.

This is available for Holistics 4.0. We'd love to hear if you have any feedback on this update.

๐ŸŽจ Pick your own color for the "Others" group

Pick your own color for the Others group

You can now choose the color of the "Others" group in your charts. The "Others" group often holds more data than any single series, but until now you couldn't change its color. Mute it so your main series stand out, or make it bold when the long tail is the story.

Get startedโ€‹

  1. Open your chart's Styles tab.
  2. Turn on Group small legend items into "Others" and set Max groups.
  3. Click the Others group color swatch and pick a color.

This works on line, column, pie, donut, pyramid, and funnel charts.

๐Ÿ”„ Switch chart types without losing your work

Chart switching in Explore is now non-destructive. Previously, switching chart types could silently drop fields and reset settings. Now Holistics keeps a memory of everything you've selected, so you can try a chart, change your mind, and switch back without rebuilding anything.

Here's what happens when you switch:

  • Fields and settings auto-map to the new chart. Fields that don't fit (e.g. fewer axis slots on the target chart) are held in memory, not discarded.
  • Switching back restores exactly what you left, including any fields that were held aside while you were on other charts.
  • Edits carry forward globally. Any change you make on one chart becomes the configuration that applies to the next switch.

This builds on two earlier Explore improvements: auto-mapping fills chart slots for you, and chart suggestions picks the right chart for your data. With chart switching now non-destructive, trying a different chart type is no longer a decision you have to commit to.

๐Ÿงฉ New unified embedding

Unified embedding is now available in Embedded Analytics. There is one way to embed: it's easy to start, you see value quickly, and you unlock more capabilities as your needs grow.

Why this mattersโ€‹

Previously, you had to choose between two embedding methods before trying any embedded features:

  • Single-dashboard embedding was quick to start but limited to viewing a dashboard. Adding data exploration, Ask AI, or email subscriptions meant migrating to Embed Portal.
  • Embed Portal had every feature but needed a complex setup (portal, user attributes, publishing code) before you saw any value.

With unified embedding:

  • Easy to set up: no need to create an Embed Portal, publish code, or set up user attributes.
  • Effortless to scale: everything is set in the embed payload. New features unlock by adding config, never by migrating.

How it worksโ€‹

  1. Embed your first dashboard: generate one shared embed credential, sign a payload listing the dashboard, then load it in an iframe. The Embed Builder lets you preview it and copy the payload.
  2. Add more features: unlock data exploration, Ask AI, user-built dashboards, email subscriptions, and more by updating the embed payload.
  3. Use Embed Portal and dataset permissions when you need them: when listing every dashboard and permission rule in your app gets hard to keep in sync with Holistics, move them into an Embed Portal and attribute-based permissions in datasets.

Here's how each feature maps to a key in the payload:

Each embed feature maps to a few keys in the same embed payload: dashboards, datasets, row-level permissions, user-built dashboards, email subscriptions, and Ask AI.
  • f-view โ†’ a-view
  • f-explore โ†’ a-explore
  • f-rlp โ†’ a-rlp
  • f-build โ†’ a-build
  • f-subscribe โ†’ a-subscribe
  • f-ai โ†’ a-ai

Migrate from legacy single-dashboard embeddingโ€‹

Your existing embed links keep working, so migrating is optional. To move to the new embed payload, follow the migration guide:

  1. Swap the credentials: replace the per-dashboard credentials with the new shared credentials.
  2. Name the dashboard in the payload: add the dashboard's name to objects.dashboards.
Migrating from a legacy per-dashboard embed link: swap in the shared Key ID and Secret, list dashboards in objects.dashboards, and sign and load the embed with the new credentials
  • Before: Legacy per-dashboard embed link
  • After: New embed payload
  • Your backend const jwt = require('jsonwebtoken'); const embedCode = '275XXXXXXXXX'; // per dashboard const secretKey = '382fXXXXXXXX'; // per dashboard const payload = { // dashboard implied by the embed code settings: { dashboard_autorun_on_changes: true }, permissions: { row_based: [ ... ] }, exp: Math.floor(Date.now() / 1000) + 24 * 60 * 60, }; const token = jwt.sign(payload, secretKey); const url = `${host}/embed/${embedCode}?_token=${token}`;
  • Your backend const jwt = require('jsonwebtoken'); const embedKeyId = 'abc123XXXXXX'; // one for all const embedSecret = '9f1dXXXXXXXX'; const payload = { objects: { dashboards: ['sales_overview'] }, settings: { dashboard_autorun_on_changes: true }, permissions: { row_based: [ ... ] }, exp: Math.floor(Date.now() / 1000) + 24 * 60 * 60, }; const token = jwt.sign(payload, embedSecret); const url = `${host}/embed/${embedKeyId}?_token=${token}`;

Learn more: Get started with unified embedding

๐Ÿ”— Cross-filters now save in the dashboard URL

Cross-filters now save in the dashboard URL

Cross-filters are now saved in the dashboard URL. When you click a data point or row to cross-filter a dashboard, that selection stays in the link. Reload the page, bookmark it, or send it to a teammate, and you'll land on the exact same cross-filtered view.

What's newโ€‹

This update ensures that your cross-filter selections are seamlessly preserved across different viewing contexts.

  • Works everywhere: internal dashboards, shareable links, and embedded dashboards.
  • One link for the whole view: cross-filters are stored alongside your dashboard filters and controls, so a single URL captures everything you've applied.
  • Nothing to set up: just cross-filter as usual and copy the URL.

Learn more: Cross-filtering | Passing Filter Parameters via URL

๐Ÿท Exclude Endorse & Archive tags when duplicating objects

Exclude Endorse & Archive tags when duplicating objects

We've introduced an update: Exclude Endorse & Archive tags when duplicating objects.

Why this featureโ€‹

Endorse tells your team a piece of content is reviewed and trusted. Archive tells them it's no longer maintained. Neither should apply to a quick copy you're making to explore data personally.

What's newโ€‹

Now, when you duplicate or copy your dashboard, dataset or data model, then:

  • Endorse and Archive tags are not copied to the new object.
  • Other tags are copied over as before.

Learn more: Tags | Content Endorsement | Content Archiving

โ›“๏ธโ€๐Ÿ’ฅ Explicit interaction syntax for Canvas Dashboard

Explicit interaction syntax for Canvas Dashboard

Canvas dashboard's explicit_interactions list now states every active connection directly, so what's written is what's active, nothing is assumed.

Also, you can name target blocks directly across FilterInteraction, PopInteraction, and DateDrillInteraction without CustomMapping wrapper needed.

Before and afterโ€‹

  • โŒ Before (Old Syntax)

    // Old syntax - only the disabled links are visible, not the active connections
    interactions: [
    FilterInteraction {
    from: 'f1'
    to: [
    CustomMapping {
    block: ['v3', 'v4']
    disabled: true
    }
    ]
    }
    ]
  • โœ… After (New Syntax)

    // New syntax - active connections stated directly
    explicit_interactions: [
    FilterInteraction {
    from: 'f1'
    to: ['v1', 'v2'] // Bare block names, no CustomMapping wrapper
    field: r(model.field) // Set once on the entry, not per target
    }
    ]

Migration to new syntaxโ€‹

We don't support mass conversion yet, but the transition is seamless:

  • New dashboards automatically use the explicit_interactions: syntax.
  • Existing dashboards convert when you next update their control or cross-filter setup.
  • Legacy interactions: syntax remains functional, without breaking changes.

Learn more: AML Dashboard Interactions

๐Ÿ” Configure MCP access per user

Admins can now configure MCP access separately from in-app AI access, per user or group.

Previously, one combined toggle granted a user both AI access inside Holistics and AI access via MCP together.

Now, granting AI access to a user or group lets you choose the scope:

  • In-app only: use AI inside Holistics.
  • In-app & MCP: also connect an AI client like Claude directly to Holistics via MCP.

This helps you grant MCP access only to users you trust to use an external AI client responsibly.

Learn more: Who Can Use AI

๐ŸŽฏ Metric support for field filters

Metrics.png

Field Filters can now be built directly from a metric, the same way you'd build one from a dimension or measure.

What's changedโ€‹

Previously, Field Filters only supported dimensions and measures as the source field - even though metrics are a first-class concept in the semantic layer alongside them. Now you can filter on a metric too, for example only showing rows where a computed metric like Churn Rate crosses a certain threshold.

Learn more: Field Filters