Scania Experience Center
The Scania Experience Centre is an interactive museum platform, powering 3D installations synced across touchscreens and wall displays in real time
The Scania Experience Centre is a physical space where visitors move between large touchscreens and wall displays and walk through Scania's story. I built the software that runs those installations: the layer that turns a room full of screens into a set of coordinated, content driven experiences the museum team can run on their own and update without calling a developer.
The core problem is that an experience like this lives across many screens at once and has to hold together. A visitor stands at an interactive table while a much larger wall reacts to what they touch, and both have to stay in step in real time. The content behind all of it changes often, in two languages, and the people changing it are curators rather than engineers. On top of that the installations run all day, every day, unattended, so they have to recover on their own when a visitor walks away partway through or a screen sits idle.
The platform ships four installations. The Globe is the centrepiece: an interactive 3D globe rendered with React Three Fiber, with several visual themes (clustered hotspots, an image grid, a liquid metal shader, and a numbers view), plus a story mode that plays a full screen film on the wall while the table acts as the controller. The Timeline walks through Scania's history as an automatic slideshow with milestones the visitor can open, and it has a separate build for the very wide rooms that run past 6835 pixels across. The Quiz is a scored multiple choice experience with live feedback. And a remote control that runs from a phone lets staff drive story playback and reset any installation from the floor.
The piece I am most proud of is the synchronization layer. The table and wall never talk to each other directly; they share state through PIXILAB Blocks over a WebSocket, using a small set of realm variables that any display can publish to and subscribe to. One screen sets which screen state is active or which globe theme is showing, the server broadcasts it, and every other display reacts. The hardest part of that was story mode video: keeping playback on the wall in lockstep with the controls on the table meant sending play, pause and seek commands stamped with a time so they apply in the right order, reporting current position and duration back, and handling the cases where the wall player is not ready yet or the film has already ended. So I could develop this without a museum and a Blocks server on my desk, I built a localStorage fallback that makes two browser tabs behave exactly like the table and wall do in the building.
Everything visitors read or watch comes out of Sanity. I set up the CMS so a curator can build pages, swap globe content, edit quiz questions and translate every field into Swedish without touching code, and the front end fetches and caches that content through Next.js. Around that sit the things an unattended installation needs: an idle timer that returns a station to its start screen, a reset trigger that broadcasts a clean refresh to every display at once, an access whitelist, analytics wired per installation through Plausible so the team can see what visitors actually engage with, and layouts that hold up across the exact display sizes the rooms use, from 1920 pixels on a single screen up to the ultrawide walls.
Architecturally it is a Next.js 14 app on the App Router in TypeScript, with Three.js and React Three Fiber for the 3D, GSAP and Lottie for motion, Redux Toolkit for local UI state, Tailwind and Styled Components for styling, and Sanity as the content backend. The deliberate split is between local state, which Redux owns, and shared state across displays, which only ever lives in realm variables, so there is always one clear answer to where a given piece of state belongs.
Looking back, the thing I would do earlier is write the realm variable contract down as a proper document instead of letting it grow as we went. Once two displays, a remote and several installations all depend on the same handful of variables, the names and defaults have quietly become an API, and treating them like one sooner would have saved some confusion. The platform is live today, running the installations in the Scania Experience Centre, and across the build I was its largest contributor.