Skip to content

← Back to products

Lumware

Lumware

Software for programmable light strips. A Python host decodes media, applies the colour pipeline, and streams frames over USB serial to an Arduino driving a NeoPixel strip.


Lumware streams light. Real pixels, real frames, real photons. No mood-lighting heuristics: the colour that hits the LED is the same colour the dashboard previews.

En xifres

  • 30 fps a 299 LEDs (RGB), sostingut en transport virtual; la mesura amb hardware real és pendent (perf spike, Epic 04).
  • Wire baud 500 000, frames binaris amb CRC8.
  • Frame budget host ~8 ms, latency p99 < 12 ms (host → photon): objectius de disseny, encara no mesurats sobre Arduino.
  • Transport serial per a hardware real; transport virtual per a desenvolupament sense Arduino — la UI rep exactament els mateixos bytes que rebria la tira.

La família

  • Lumware (flagship, aquest hub) — host → strip.
  • Lumware Capturesensor → host. Repository separat, planejat.
  • Lumware Stageunity ↔ strip. Repository separat, planejat.

Què no és

No automatització de la llar. No mood-lighting. No núvol — viu a la LAN. No depèn de hardware: el transport virtual arrenca sense Arduino i les imatges de calibració se sembren soles al primer boot.

Aprofundir

Els deep-dives — un script de 200 línies que es converteix en una família, l’electrònica mínima, el firmware Arduino, el protocol binari, l’arquitectura Python, BMAD i les branques, la identitat spectrum R/G/B/W, la UI web local, els benchmarks — viuen com a sèrie al blog. Cada article enllaça amb l’anterior i el següent dins de la sèrie.

Full series

What Lumware is
Code · May 25, 2026

What Lumware is

I set out to blink a few LEDs. I ended up designing a software family for programmable light strips.

Part of Lumware
From script to product
Code · May 25, 2026

From script to product

There was a 200-line script. It worked. The story did not end there — without the next step, there would be no family.

Part of Lumware
In progress

The minimum electronics for lighting a strip

Six parts. Drop one and the symptoms lie: the first LEDs work, then colors go random. Why every single piece matters.

The firmware: Arduino and critical timing
Electronics · DIY · May 25, 2026

The firmware: Arduino and critical timing

An Arduino Uno has 2 KB of RAM. A 300-LED strip is 900 bytes just for pixel buffers. Every decision is a question of space.

Part of Lumware
Why a binary protocol (and not JSON)
Code · May 25, 2026

Why a binary protocol (and not JSON)

The easy option was JSON. It was also the option that made 30 FPS physically impossible. A six-byte-overhead binary protocol clears the bottleneck.

Part of Lumware
Host architecture: events, settings, scheduler
Code · May 25, 2026

Host architecture: events, settings, scheduler

Three decisions changed how I think about this host. None is dramatic on its own. Together, they make all the difference.

Part of Lumware
BMAD: plan before writing code
Code · May 25, 2026

BMAD: plan before writing code

If I just write code, I lose the thread by week three. If I over-plan, I lose it sooner. I had to learn to plan without drowning in planning.

Part of Lumware
Identity: spectrum R/G/B/W
Design · Brand · May 25, 2026

Identity: spectrum R/G/B/W

The name took longer to surface than the architecture. When it did, everything fell into place — even the brand colors.

Part of Lumware
The local web UI: FastAPI inside the app
Code · May 25, 2026

The local web UI: FastAPI inside the app

A physical knob would be optimal. Building one, not. I put the UI in the browser and made it reachable from any device on the LAN.

Part of Lumware
In progress

Real framerate: benchmarks and bottlenecks

The theoretical ceiling is one thing. What you measure is another. The gap between the two is where the work that's left lives.