2026 · Production · 4DX attraction
Motion Ride
A control system for a 4DX attraction: a kiosk console and a service that streams telemetry to an Arduino platform.
- Next.js 15
- React 19
- Express 5
- Socket.IO 4.8
- serialport
- AES-256-CBC
- Arduino
- telemetry, roughly
- 10 Hz
- baud to the Arduino platform
- 115200
- frame an emergency stop lands inside
- 100 ms
- byte key validated at boot
- 32
What I walked into
A 4DX attraction moves people, so a stop command cannot wait behind motion that is already queued.
Licensed motion tracks had to stay encrypted at rest.
What I changed, and why
Telemetry over serial
An Express 5 and Socket.IO service streams Time, Yaw, Pitch, Roll at roughly 10 Hz over serialport.
Safety is structural
Movements go through a sequential task queue, and emergency_stop sets a flag and then empties the queue outright.
Tracks consumed by playing
Tracks are AES-256-CBC at rest. A ride decrypts one to a sibling CSV, then unlinks both the plaintext and the encrypted file.
A track is literally consumed by being played.
Where it landed
The kiosk console drives the platform through a queue in which a halt cannot be stuck behind queued motion.
Licensed tracks are encrypted at rest with the key validated at boot, and each one is consumed by being played.