Skip to content

All projects

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

  1. Telemetry over serial

    An Express 5 and Socket.IO service streams Time, Yaw, Pitch, Roll at roughly 10 Hz over serialport.

  2. Safety is structural

    Movements go through a sequential task queue, and emergency_stop sets a flag and then empties the queue outright.

  3. 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.