Projects / Embedded

Automated firework launcher

An air-gapped system for designing and firing firework shows, using custom 16-channel PCBs.

I'm the only author of all four repositories in the current rebuild.

  • C
  • ESP-IDF
  • ESP32-S3
  • Python
  • FastAPI
  • Nuxt 3
  • Docker Compose
  • Caddy
A blue 3D-printed launcher node held in one hand, with 16 numbered lit connectors and an LED display
A launcher node, with its 16 numbered channels and LED display.

Launcher nodes

ESP32-S3 boards on custom PCBs, with C firmware on ESP-IDF.

  • 16 PWM-driven ignition channels, continuity sensing through a PCA9535, and an LED display board
  • Firing is gated by an arm state that also drives a hardware arm pin
  • Over-the-air updates for firmware, filesystem and partition table

Controller

A Python FastAPI service that finds nodes through UDP broadcast beacons and runs firing sequences.

Web UI and show builder

  • A Nuxt 3 control interface, which can also be served directly from a node's flash
  • A Nuxt 3 timeline editor, similar to a video editor, for designing shows

Distributed firing

Nodes hold the schedule and fire from their own synchronized clocks, so timing stays tight and a show survives a WiFi drop.

Deployment

Everything runs as one Docker Compose stack behind Caddy.