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 sostingut a 299 LEDs (RGB), measured.
  • Wire baud 500 000, frames binaris amb CRC8.
  • Frame budget host ~8 ms, latency p99 < 12 ms (host → photon).
  • 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

code · que-es-lumware-en.mdx

Part of Lumware 01/10

What Lumware is

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

  • #lumware
  • #intro
  • #hardware
  • #software
code · de-script-a-producte-en.mdx

Part of Lumware 02/10

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.

  • #lumware
  • #procés
  • #refactor
  • #brand
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.

bench · 2026-05-25

Part of Lumware 04/10

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.

  • #lumware
  • #firmware
  • #arduino
  • #neopixel
code · protocol-binari-en.mdx

Part of Lumware 05/10

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.

  • #lumware
  • #protocol
  • #host
  • #firmware
code · arquitectura-python-en.mdx

Part of Lumware 06/10

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.

  • #lumware
  • #python
  • #arquitectura
  • #eventbus
code · bmad-i-branches-en.mdx

Part of Lumware 07/10

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.

  • #lumware
  • #procés
  • #bmad
  • #git
design · identitat-spectrum-en.mdx

Part of Lumware 08/10

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.

  • #lumware
  • #marca
  • #identitat
  • #colors
code · ui-web-local-en.mdx

Part of Lumware 09/10

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.

  • #lumware
  • #frontend
  • #fastapi
  • #react
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.