Speckle Intelligence Dashboards Changelog — May to July 2026

Hey Community :wave:

It’s been a busy couple of months on Bashboards, and we’ve shipped a lot, from a completely new calculated fields engine to performance leaps in the viewer, plus two new widget types and a whole batch of quality-of-life improvements. Here’s what’s landed since our last post on May 4th.


:abacus: Calculated Fields (Public Beta) — compute new properties without touching your model

This is the biggest thing we’ve shipped in a while. Calculated Fields lets you define synthetic properties that are computed at runtime from your existing model data — no need to change anything in Revit, Grasshopper, or wherever your data lives.

You define a field once, and it appears alongside your native model properties everywhere a property binding is accepted: charts, tables, filters, and viewer colour-by, just like you pick Category or Level.

Fields can be saved at the workspace, project, or dashboard scope, so commonly used calculations (embodied carbon ratios, area-weighted averages, unit conversions) can be shared across all your dashboards or kept local.

Expression types available today:

  • Arithmetic — math formula with named variable bindings to model properties
  • Aggregate — sum, average, count, min, max, median across all objects or a filtered subset
  • Unit conversion — scale a numeric property by a fixed factor with an output unit label
  • Grouping — classify objects into labelled bands (numeric ranges, or text value groups)
  • Boolean flag / Logical — pass/fail a set of filter rules, output as custom string labels
  • Map lookup — drive mappings from a Lookup Table
  • Coalesce — return the first non-null value across a list of paths
  • Null fallback — replace nulls with a fixed value

We also added Dashboard constants — aggregate fields that produce a single dashboard-level number (e.g., total GFA) rather than applying the same value to every object. Use them as stable denominators in a Ratio widget, or to combine totals across multiple models. See the Dashboard constants section for the full walkthrough.

:book: Calculated Fields docs


:mag_right: Design Explorer (Public Beta)

The Design Explorer widget is now in public beta. It’s built for Grasshopper workflows where you’re generating and evaluating multiple design options — connect your Grasshopper model, pick the numeric metrics you want to compare, and get a parallel coordinates chart that lets you filter across multiple axes simultaneously.

Click any axis range to isolate the options that meet your criteria; the viewer updates in sync so you can inspect the geometry of your shortlisted options. Great for early-stage massing, facade optimisation, or structural sizing.

:book: Design Explorer workflow guide


:wrench: Parameter Updater (Public Beta)

The Parameter Updater widget is now in public beta, and we’ve expanded what it can do:

  • Now supports Rhino and Civil3D — write parameter values back to Rhino and Civil3D objects (previously Revit-only)
  • Add new attributes — no longer limited to updating existing parameters; you can now push entirely new properties onto objects, which then become available on the next sync

If your workflow involves computing a value in a dashboard (say, from a carbon calculation or a validation check) and writing it back to the authoring tool, this is the widget for that.

:book: Parameter Updater docs


:chart_with_upwards_trend: Time Series widgets — redesigned module

We’ve reworked the time series widget family into a proper module with dedicated widget types and their own calculation layer:

  • Sum by property over time — track a summed numeric property across model versions
  • Count by property over time — count grouped elements version-by-version
  • Element count over time — simple total element count trend
  • Material quantities over time — track material volumes/areas across versions
  • Numeric aggregate over time — any aggregate (sum/avg/count/etc) over time

Time series data now resolves via packfile when available, providing a significant improvement in loading speed for large models with many versions.

:book: Intelligence Dashboards overview


:rainbow: Numeric Gradient Range widget

New widget that maps a continuous numeric property to a colour gradient and applies that colouring to objects in the connected viewer. Useful for visualising anything on a spectrum — floor-to-floor heights, structural utilisation ratios, embodied carbon by element, thermal performance metrics, and so on.


:art: Viewer: colour objects by calculated field

The viewer’s colour-by system now works with Calculated Fields. Any field you’ve defined — derived metrics like carbon intensity per m², or flag-based pass/fail outputs — can be used to colour your 3D model directly. Combine this with the Numeric Gradient Range widget or the standard group-by colouring for richer visual analysis.


:ghost: Context models — visual exclusivity

When you load a model as a context model in the viewer (for spatial reference only), it is now fully exempt from dashboard filter slices. Previously, filtering by a chart value could inadvertently ghost out your context geometry. Now, context models remain fully visible regardless of which filters are active on the analytical models.

See the Context models section of the dashboards overview.


:bookmark_tabs: Lookup Tables (Beta) — expanded scope and management

Lookup Tables — the shared reference data library for validation rules and calculated field mappings — now supports dashboard scope in addition to workspace and project. Import a CSV or Excel file that’s local to a single dashboard without touching the shared workspace library. We’ve also improved the collection management UI and fixed CSV parsing for edge cases.

:book: Lookup Tables docs


:white_check_mark: Model Validation — new predicates and conditions

Continuous Data Validation is where our attention falls these days, but for those of you with existing validation dashboard workflows, you are not forgotten - that said, we will likely sunset this feature in time.

In the meantime a set of improvements to the validation widget rule engine:

  • count_at_most and count_at_least predicates — validate that no more than (or at least) N elements match a condition per group
  • External lookup tables in validation rules — rule conditions can pull their allowed-value lists from a named column in a Lookup Table, so approved material lists or category allowlists live in one place and are referenced across multiple rulesets
  • Advanced condition handling — more complex multi-condition rule logic with better human-readable message generation
  • Fixed: commas in “one of” predicates — a regression that broke comma-separated values in one of rules has been fixed

:book: Validation Widgets docs


:zap: Faster loading across the board

  • 3D geometry loads noticeably faster — the viewer now uses the faster loading path by default for recent model versions. For most Revit models, you should see geometry appear significantly sooner than before.
  • Charts appear before all data has finished loading — property data for each data source now loads independently in the background. Rather than waiting for every source to finish, chart widgets start showing results as soon as their data is ready. A readiness indicator tells you when sources are still resolving.
  • Complex dashboards feel more responsive — widgets now skip unnecessary redraws when their underlying data hasn’t actually changed, which reduces jank on dashboards with many widgets and large models.
  • Time series dashboards load faster — time series widgets now use the same faster loading path as the viewer when your model versions support it.

:lady_beetle: Fixes

  • Dashboards with deleted sources now open correctly — previously, if a model you’d connected to a viewer widget had been removed from the project, the whole dashboard could fail to load. It now opens and shows the remaining widgets normally.
  • Custom widget titles are no longer reset — widgets that auto-generate titles from their configuration were overwriting custom titles you’d set. Your names now stick.
  • Filtering no longer affects context models — chart filters and slices were inadvertently ghosting geometry that was loaded as a context/reference model. Context models now stay fully visible regardless of what filters are active. (This was also called out above under Context models — noting it here too since it was a visible regression.)
  • Carbon assessment and lookup tables now work at dashboard scope — these features weren’t recognising dashboard as a valid scope, which caused data to fail to load in some configurations.
  • Switching model versions no longer leaves ghost geometry — swapping to a different version in the viewer could leave stale geometry from the previous version visible alongside the new one.

:books: What’s new in the docs

  • Calculated Fields — full reference including all expression types, scope, constants, and things to watch out for
  • Lookup Tables — import formats, scope levels, and usage in both validation and calculated fields
  • Validation Widgets — updated to cover new predicates, lookup-backed rules, and improved condition handling
  • Parameter Updater — full setup guide with images, Rhino support, and new attribute creation
  • Design Explorer workflow — end-to-end guide from Grasshopper tagging through to reading results
  • Data validation results — guide and example notebook for working with validation output programmatically
  • Context models — how to configure them and what exemptions apply to filters and slices
  • Common workflows — new walkthroughs: share-of-whole with Aggregate + Arithmetic; X-per-Y across two models using constants; codes to clear labels with Map lookup

:pray: Thank you

Some of this release was shaped directly by people who took the time to report issues and push for what the product should be able to do.

@hwollersheim (Henrik, Haskoning) — filed a clear, reproducible report showing that total property value widgets displayed inflated numbers on first load, correcting themselves only after opening and closing the filter dialog without changing anything. That described the bug precisely. Fixed.

@Tom.Sargent (WSP) — pushed hard everywhere.

@Neeraj — raised the constraint of only being able to place one checker widget per dashboard and asked about more complex multi-rule configurations in the Property Checker feedback thread. The reworked Model Validation widget handles multiple independent rulesets.

Haskoning @pieter and LMN Architects (Alex) and Laing O’Rourke (Ana Elisa, Ben and @Jeremy — all asked for the ability to load a site or reference model into the viewer without it participating in widget calculations or getting ghosted by filters. Alex put it well: “I’m hoping to upload a site model which shows existing conditions while the design schemes themselves are what I hope to be tabulating on the canvas.” That’s exactly what context models now do.

Gensler (@NaoB and @Maya) — raised the need for gradient colouring based on numeric parameters and for more expressive OR-logic in validation rules. Both shipped this cycle.

WSP (Tom), JTC, KPF (@Klee), and Multiconsult — each independently requested the ability to compute new values from model properties within the dashboard: normalised carbon metrics, rebar ratios, span-to-depth ratios, and unit conversions. Calculated Fields is the answer.

Pomerleau, Turner, Entuitive, Heijmans, and Woods Bagot — flagged data conditioning and parameter write-back as top priorities. Parameter Updater is going to public beta, and the arrival of Calculated Fields is a direct response to the weight of demand, albeit more of a trajectory at this point


All that is to say - thank you. But also, always, always keep letting us know what you are up to, where we fail or where we can grow. The calculated fields engine, in particular, is very new — we’d love to hear which expressions you wish existed, which scoping behaviour doesn’t match your expectations, and what you end up building with it.

— Jonathon & the Intelligence team

Hey Community :wave:

Quick addendum — a few more things landed after the May–July post. Same spirit as before: what shipped, plus what to watch out for so you don’t chase ghosts.


:bookmark_tabs: Saved Scenarios (Beta)

Useful when you keep returning to the same “story” on a dashboard — a shortlist of options, a pass/fail slice, a colour-by view — and don’t want to rebuild the filters every time, or when you want to send someone a link that opens that exact view. You can save named snapshots of the current global filters, issue filters, and viewer colour-by, group them, deep-link them, and (in view mode) merge one into whatever filters you already have open. Keep a "scrapbook set while editing, group them to make them available to your clients when sharing.

Watch out for

  • This is not a full dashboard snapshot. Variations in chart config, layout, and data sources are not included.
  • You need an active filter or colour-by before Save does anything useful.
  • A normal click replaces the current filter/colour state with that scenario.
  • Merge overlays that scenario’s slices onto the current state (same widget wins on a clash). The result is a blend, so nothing stays “selected” as a single scenario.
  • Share the scenario URL if you want someone to land on that exact view.

:pushpin: Change a pinned version in place

Useful when a model has moved on and you want the same charts and tables to follow a different version — without deleting the source, remounting it, and re-pointing every widget. From the sources sidebar you can re-pin or unpin a mounted model version; widgets keep their bindings to the same source id.

From the sources sidebar you can re-pin or unpin a mounted model version without creating a new data source. Widgets keep their bindings to the same source id.

Watch out for

  • You still can’t have two sources on the same model + version (or both tracking latest for that model).
  • The change saves the dashboard immediately.
  • Charts and tables recompute against the new version’s properties — paths that only existed on the old version will go empty until you rebind them.

:arrows_counterclockwise: Switch a widget’s data source in place

Useful when you’ve already tuned a widget (properties, filters, chart options) and want that same analysis on a different mounted model — for example scheme A → scheme B — without rebuilding the widget from scratch. Data widgets can retarget to another already-mounted source and keep their configuration.

Watch out for

  • Model Viewer and Dual Viewer are excluded — they own their mounts. Change models/versions on the viewer (or use pin-version above).
  • Broken property paths and filter rules are kept and flagged, not deleted. An empty chart often means “this path isn’t on the new source,” not that the widget was wiped.
  • Switching back usually restores invalid filter rules once the property exists again.

:chart_with_upwards_trend: Ratio widgets — filter targeting

Useful when the question isn’t “filter everything,” but “filter only the Part” (or only the Total) — e.g. completion-style ratios where the numerator is a subset and the denominator should stay the whole. Widget filters and global filters each have four states: Off / Part only / Total only / Both.

Watch out for

  • Default is Both. Part-only or Total-only changes the fraction a lot — easy to misread as bad data.
  • In Single property mode, Part vs Total targeting is what creates the two populations. Both-on or both-off collapses that meaning.
  • Dashboard constants as operands stay filter-immune; targeting only affects property-based sides.

:abacus: Calculated fields — scalars in arithmetic

Useful when you need a stable project-level number (total GFA, total IT load, conditional steel mass) that still works inside Arithmetic formulas and Ratio widgets, and that doesn’t wobble every time someone clicks a chart filter. Arithmetic fields can bind dashboard constants, and a scalar aggregate can source from a per-object calculated field (handy for masked / conditional totals).

Watch out for

  • Scalars are immune to interactive filters by design. If the number won’t move when you slice — that’s expected.
  • Constants still don’t show in the Properties panel; use them in Ratio / Total property value (and now Arithmetic).
  • Prefer Dashboard constant denominators in Ratio widgets. Stamped All data / Current view aggregates can still inflate if a widget sums once per element (same warning as in the main post).

Also: duplicating a dashboard now copies dashboard-scoped calculated fields and lookup tables onto the new dashboard (as dashboard scope). Workspace/project library fields still need Use on this dashboard if they weren’t dashboard-scoped.


:left_right_arrow: Dual Viewer modernised

Useful when you’re comparing two versions or two schemes in the same spatial context and want a swipe reveal from one shared camera, instead of navigating two independent viewers and trying to keep them lined up. Dual Viewer is now a swipe/slider comparison with cameras always synced between panes.

Watch out for

  • Pane-to-pane camera sync is always on.
  • No section box or measurements on Dual Viewer (misleading on a split).
  • Both panes need a model before either renders.
  • Bottom view-mode controls drive the left pane; modes mirror to the right.

:green_circle: Smaller fixes worth knowing

More accuracy and less confusion in day-to-day use — numbers you can trust a bit more, cards that don’t look broken when they aren’t, and layout that stops fighting you.

  • Carbon assessment — Revit material volumes normalise unit strings more carefully before converting to m³. Spot-check critical assessments; totals may shift if a unit previously parsed wrong.
  • Model Validation — a 100% pass no longer reads like an error via severity colouring.
  • Numeric Gradient Range — collapsing the range resets custom edges; set them again if you had a tight band.
  • Compare mode — user-driven tile order for totals now sticks across recomputes.
  • Data sources UI groups by project (same sources, clearer nesting).

As always — if something feels off, tell us what you expected vs what you got. Scenarios and the ratio targeting controls especially: we’d rather hear early footguns than late ones.

— @Jonathon & the Intelligence team

A couple more features snuck out the door that didn’t make the last update or already represent testing feedback of what was reported above.

:world_map: Context widget (beta) — your model on a map

We quietly shipped a new widget called Context. It takes your co-mounted Speckle model and renders it as a pitched 3D scene on a MapLibre / OpenFreemap basemap — so your geometry sits properly in the real world, at the right lat/lon/elevation/rotation.

A few things worth knowing:

  • SitePose is a new dashboard-level geospatial anchor (lat, lon, elevation, rotation) stored as dashboard metadata and shared between the Map widget and Context widget. Set it once, both widgets use it.
  • Building clearance: surrounding OpenFreemap buildings that overlap your model footprint are automatically hidden, with a configurable clearance radius slider.
  • Filter and colour-by work the same as in the Model Viewer — meshes on the map respond to your global dashboard filters and colour groups.
  • Ground clip: hides Speckle meshes below the map deck plane so you’re not fighting with underground geometry.
  • Mouse controls match the Model Viewer (orbit, pan, pitch-capped at 87.5° so the ground stays visible).

Nobody explicitly asked for this one. Find it in the widget panel under Presentation → Context (beta). The Map widget stays co-developed alongside it for bookmarks and SitePose helpers.

:artist_palette: Workspace & project-scoped colour palettes

You can now define a colour palette at the workspace or project level and have it applied consistently across all dashboards within that scope. No more re-picking colours per dashboard — set it once and every chart, pivot, and colour-by will respect it.

This is particularly useful if you’re running dashboards for multiple clients or projects and need branding to stay consistent without manual effort.

Thanks again to @Mpekurov, @NaoB, but also Haskoning and @katherine.c from Price & Myers.


:1234: More aggregation options on Total Property widgets

Total Property widgets now support five aggregation modes: Sum, Average, Min, Max, and Median. Previously, you were limited to sum (and an unlabelled average). Pick the one that makes sense for your data — median pile length, maximum span, minimum clearance, whatever your workflow needs.

1 Like

The addendum no one asked for

We heard you like Calculated Fields…We heard you like Ratios…

We heard you particularly enjoy combining Calculated Fields with Ratios, before staring at the resulting number in silence. :eyes:

We also heard you’ve been exploiting NaN values as logical fallbacks to create pseudo-filtering. We heard this repeatedly and from several trusted sources.

We didn’t hear that because nobody said that. I said it to @Pim and @Tom.Sargent

So, a confession.

A ratio is simple. It is one thing divided by another thing. But sometimes the first thing is a list of things and the second thing is a thing that isn’t a list. Sometimes the thing that isn’t a list was calculated from a different list of things. Sometimes filters apply to both things. Sometimes they apply only to one of the things. Sometimes a value has been written onto every thing and is then added up once for every object.

At this point the ratio remains simple, technically. It has simply become difficult to explain without using the word “thing” several more times.

*Property Checker has been explaining itself since day zero. It takes a small thicket of `WHERE`s and `AND`s, turns it into something resembling a sentence, and shows you what happened at each step.*

You seemed to find that useful.

Again, this was the intended outcome. But it was gratifying to have the intended outcome independently confirmed.

So we’ve done it again.

Introducing “Explain this value” (beta)

In dashboard edit mode, Ratio Value and Total property value widgets now have an Explain this value action.

Open it, and Speckle follows the live number back through its property sources, calculated fields, aggregates, filters and dashboard slices, before arriving—slightly out of breath—at the final result.

The explanation shows where filters narrowed the data, whether a value is Fixed, Current view or Constant, and what each stage contributed. It will also point out less successful outcomes: empty values, nulls, missing field references, division by zero and numbers that are mathematically valid but spiritually troubling.

Clickable stages take you back to the relevant calculated field or filter settings. There is also a plain-text summary you can copy, should you need to explain the explanation to somebody else.

So when a widget says 486,000%, you no longer need to ask:

“How did Speckle arrive at that number?”

You can now discover, stage by stage, which entirely reasonable decisions caused the number to become unreasonable.

For now, Explain this value is available on Ratio Value and Total property value. Ratio Value by Property does not yet have the action, because even explanations need boundaries.

This feature comes to you from poolside in the Erzgebirge, because nothing says “holiday” quite like tracing an aggregate through a calculation chain.

erzgebirge-head-wobble

Happy holidays from Speckle. :beach_with_umbrella::mountain:

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.