User Guide

Using SpatialWork on the Web

Build and view 3D digital twins in the browser, drive them from live data, and publish read-only links people can open without an account. No install.

Where to go: spatialwork.hiverlab.com. There is also a staging copy at spatialwork-staging.hiverlab.com for trying things before they reach everyone — it shares the same data, so treat changes there as real.

01 What you are working with

A project is a 3D scene plus everything layered on it: imported models, data charts, interactive objects, heatmaps, saved camera viewpoints, and the connections to wherever your data lives. Two kinds sit side by side on the dashboard:

KindWhat it is
SpatialWork sceneA 3D scene you build in the browser, or one published from Unity SpatialWork. Everything in this guide applies to it.
GeoSenseA map-based project, opened in the geo editor. Different tool, same dashboard and the same sign-in.

Work saves as you go. There is no Save button to forget.

02 Sign in, and your dashboard

Log in with your Central Platform account — the same email and password you use elsewhere in Hiverlab tooling. You land on the dashboard, which lists every project you own or that someone has shared with you.

Everyone can read a few shared folders without being added to anything — the Spatialwork Assets Library, SW_3D_Group and GeneralLibrary, including their icon sets. You will see them in the library and in every picker.

03 Moving around

ActionControl
Look aroundLeft-drag
Orbit a pointAlt + left-drag — turns around whatever is under the cursor
PanRight-drag or middle-drag
ZoomScroll — towards whatever is under the cursor, not blindly forwards
FlyWASD · up E/Space · down Q · Shift for 3× speed
Frame the selectionF
Straight-on viewsThe view pill at the top — Top, Front, Left and the rest
Jump to a viewpointClick it in Views
Move / Rotate / Scale the selection1 2 3

Looking and flying are deliberately separate from orbiting, the same way Blender and Unity separate them — so a fly never fights an orbit mid-drag. Any movement cancels a viewpoint fly-to.

04 The Scene panel

The tree on the left lists everything in the scene, sorted by kind. Each row carries three switches, always in the same columns:

Select a row to get the gizmo — 1, 2 and 3 switch it between Move, Rotate and Scale. Double-click a name to rename. Drag a row onto a group to put it inside. New group is in the panel header — groups are the main way to keep a scene legible, and they matter later when you publish (§13).

05 Adding 3D content

Open Assets in the rail to browse the Central Platform library — your own uploads, folders you are a member of, and the shared libraries. Pick a model or splat and it drops into the scene.

The picker also shows In this project: everything the open scene already uses. That is the only listing that works on a project shared with you, since the folders belong to whoever uploaded into them.

06 Connecting data

Rail → Data source. A source is a connection, defined once and reused by every chart in the project. Credentials are stored encrypted on the server and never sent back to the browser.

A database

Host, port, database, user, password. Queries are read-only SELECTs.

A REST / JSON API

The URL, then as much of the rest as the API needs:

FieldUse it for
MethodGET, or POST for a read endpoint that takes its filter in the body.
Request bodyAppears for POST. Must be valid JSON — it is checked before saving.
AuthNone, an API key in a header, a bearer token, a username and password, or Sign in for a token.
Extra headersName: value, one per line. For a tenant id, an API version pin, anything that is not itself a credential.
Sign in for a token is for APIs that issue short-lived tokens instead of permanent keys. Give it the sign-in URL, a username and password, and its own headers; the server fetches a token, keeps it in memory only, and renews it from its expiry — so charts keep updating without anyone pasting a new token every few hours.

Press ⚡ on a source to test it. A failure says which half broke: bad credentials, a token that is not where expected, or the data call itself being refused.

07 Charts

Rail → Chart adds a card into the scene. Open its ✎ for the style editor.

Describe it, and let the assistant write the query

Pick the source, say what you want in plain language — "chiller flow rate for device 100001" — choose a type or leave it on Auto, and press Generate with AI. It fills in the query, and you press Test query to see what actually comes back before anything reaches the scene. Nothing is applied behind your back.

If a result comes back wider than you meant, say the identifying value in your description. The assistant filters on what you name; with nothing to go on it can only guess, and it will say what it assumed.

Types

TypeShowsNeeds
ValueOne big numberA query returning a single value
GaugeA dial with threshold bandsA single value, plus min and max
TableRows and columnsA query returning rows
Bar, LineA plotted seriesWritten by the assistant — these are the two the dropdown cannot offer, because their shape lives in a generated spec

Styling

08 Interactive objects

Rail → Interactive asset. Clicking an object in the scene opens a small panel of readings beside it.

Choose what is clickable: a whole group, or individual objects you select and Add selected. The difference decides how the query has to look:

Bound toThe query should returnObject id column
One objectOne rowNot needed — the binding already says which object
Several, or a groupOne row per objectThe column whose values match the object names

Names are matched with the file extension dropped, so an object imported as pressure.glb matches a row keyed pressure. You do not need to rename anything, and your data does not need to know about .glb.

Fields chooses which columns the panel shows, in order. If a click produces a panel that says nothing matched, it tells you which column it was matching on and what values it saw — usually the id column is the wrong one, or the query is wider than the binding.

09 Spatial heatmaps

Rail → Spatial heatmap interpolates one numeric reading across a floor, between sensors that are ordinary objects in a group. Move a sensor in the editor and its contribution moves with it.

Point it at the group, give it a query returning one row per sensor, and say which column is the name and which the value. Min and max should come from the quantity — RSSI is about −90 to −30 dBm, a percentage 0 to 100 — not from whatever today's sample happens to span, or later readings fall off the scale. Viridis is the default colour scheme and the safest for colour blindness; the traffic-light scheme is the one to avoid if that matters to your audience.

10 Viewpoints

Views in the rail saves camera positions. The first is the scene's opening view — what anyone sees when they open the project or the published link. Viewers can jump between them; they cannot change them.

11 Versions

A version is an authored variant — "ground floor", "night lighting", "client cut A" — not an undo history. Each has its own objects, charts and viewpoints, and each is independently shown or hidden to viewers.

12 Publish a read-only link

Publish gives the project one link. Anyone with it can look around, jump between viewpoints and switch between the versions you marked shown — and nothing else. They cannot edit, and they do not need an account.

Hiding a version is real access control, not a display filter: a hidden version cannot be reached from the link at all. Unpublishing revokes the link.

13 Let viewers show and hide groups

A published scene can let whoever opens it switch whole groups off — a floor of sensors is one idea, not forty, and hiding them is easier than explaining them.

  1. Group the objects in the Scene panel.
  2. Open the group's ✎ and tick Let viewers show or hide this group.
  3. Publish. The viewer gets a Groups dropdown listing exactly those groups.

What a viewer switches off is theirs for that visit only — it is never saved back, and it never affects anyone else opening the same link. A group inside a group gets its own switch.

14 Let someone else edit

People on a project card adds an editor by email address. They get the project on their own dashboard with a SHARED chip, and can do everything you can except publish, rename, delete or re-share it — those stay with the owner.

An editor can open the project's assets even when the folders they came from belong to you, which is what makes a shared project actually workable.

15 Embedding in your own dashboard

A published scene can sit in an <iframe> and talk to the page around it: your dashboard can highlight an object when someone clicks a table row, and hear about clicks in the 3D view. See the embedding guide for the full message list.

One behaviour worth knowing here: selecting an object from the host works even when the viewer has switched its group off. The host asked about an object, not a group, so the group is not revealed — expect the readout, and the camera move, for something not currently on screen.

16 When something looks wrong

What you seeUsually means
A chart says no dataThe query returned nothing. Press Test query in the style editor to see the raw result.
A chart stopped updatingA short-lived token expired. Test the source; if it is a sign-in source, that renewal is automatic and the failure is elsewhere.
No reading matched "…" on a clickThe object id column is wrong, or the query is wider than the binding. The panel names the column it used and the values it saw.
A heatmap is blankNo row's name matched an object in the group. It reports how many rows it had and what the objects are called.
A table shows columns you did not wantSet Columns. A REST query cannot trim them itself.
Panels feel slowSettings → Chart panels → Glass blur effect. The blur behind them is the most GPU-expensive part of how they look.
An icon shows a dashed boxIts URL no longer resolves — the asset was probably removed from the library. Clear it and choose another.

Something here wrong or missing? It is maintained alongside the code — tell the team and it gets corrected in the same place the behaviour lives.