Features
28 July 2026

This release is a big performance push. We shipped incremental rendering for the space viewer, smarter re-render logic across the board, and promoted facade-based rendering to the default in the app. For smplr.js integrations, facade mode becomes the default in v3.

🚀 Performance

  • The space viewer now renders spaces incrementally: when something changes, only the affected parts are rebuilt rather than the entire scene. In the app, this makes level switching and live edits noticeably faster on large, multi-level buildings, and opens the door to incremental loading for faster initial renders.

  • Facade-based rendering is now the default in the app, delivering faster initial loads and quicker level switches on large spaces. In smplr.js, this will become the default in v3. To prepare, pass disableFacadeMode: false to opt in early, or disableFacadeMode: true to preserve the current behavior after upgrading. The experimentalFacadeBasedPerformance option is deprecated in favor of disableFacadeMode. Learn more in the docs.

  • The viewer no longer delays every render by 300ms or shows a progress indicator for simple changes. We now evaluate the complexity of each change upfront: simple ones apply immediately with no interruption, while complex ones trigger the progress indicator before the heavy work begins, keeping the interface responsive.

  • Mode and filter changes no longer freeze the page when a dense sphere heatmap data layer is active.

  • We fixed memory leaks in the viewer that could accumulate over long-running sessions.

🎉 New features

  • You can now generate an entire bank of parking bays in one step. In the 2D editor, go to the Advanced tab, choose Add parking, pick three corners to define the area, and set your parameters: number of bays, bay width, angle, and single or double rows. You can re-edit or delete a cluster at any time, and extract the bays as mapped polygons in the Entity Manager.

  • You can now attach custom key-value properties to any editor feature: walls, grounds, roofs, stairs, objects, annotations, doors, and windows. Properties support text, number, and boolean values, are available under "Advanced" in the properties panel, and persist with the space. Use them to tag features with asset IDs, equipment specs, or any data your application needs.

  • Desk and seminar seating clusters are now re-editable. Click any desk, or right-click any seat, to reopen the original configuration, adjust it, and regenerate the layout, or remove the entire cluster.

  • You can now copy a space's map location and paste it directly onto another space from the space location panel.

  • The listSpaces query client method now returns floor area and project membership for each space, making it easy to build portfolio dashboards, track area usage per project, and enforce client allowances. You can also filter by project, request a per-level area breakdown, and choose your area unit (sqm or sqft). Learn more in the docs.

💅 Improvements

  • The space profile now shows a single, stable loading cover while a space loads, replacing the previous sequence of flashing pill indicators. The cover lifts as soon as the initial render is ready, letting equipment stream in progressively.

  • If you embed the space viewer in your own app, you can implement the same behavior using the new onPartialRenderReady callback: it fires as soon as the space shell is rendered, letting you lift your own loading cover at the same moment. Learn more in the docs.

🐛 Bug fixes

  • We fixed an issue where holding Ctrl to pan the canvas while drawing a polygon entity mapping would also unintentionally drag the polygon.

  • We fixed a bug where completing a hole polygon by clicking on a ground corner would automatically start drawing a new hole.

  • We fixed an issue that could occur when calling addDataLayer, updateDataLayer, or removeDataLayer after the viewer had been stopped.

  • We fixed an issue where data layers with tooltip templates could fail silently in the 3D viewer and map viewer.

Share