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.
The name took longer to surface than the architecture. When it did, everything fell into place — even the brand colors. I didn’t design the palette: I found it in the hardware itself.
The context
A single-script project doesn’t need a name. A product
does. A family, even more so. While the repo was called
python2arduino_neopixel, the only way I could refer to
it was “the project”. Every time I wrote a README, I ran
out of vocabulary.
There was a practical reason to fix it: I already knew I
wanted to ship two sibling products (sensor→host,
unity↔strip), and if all three carried unrelated names,
they would never be a family — just three repos that
happened to know each other.
The decision
Lumware. Lum (Latin for light) + ware (software). Short, registrable, describes what it is without overselling it. Light is saturated in the market; neon is aesthetic rather than functional; photon is pretentious. Lumware is what’s actually there: software for light.
Three products, one family name:
- Lumware — flagship, this repo.
host → strip. Images and video to the strip. - Lumware Capture —
sensor → host. Camera, mic, MIDI feeding a host that decides. - Lumware Stage —
unity ↔ strip. Unity sends frames and receives strip events bidirectionally.
Each lives in its own repo. They share vocabulary (frames, transport, host, codec) and they share brand. They do not share code: no cross-imports. The family is cultural, not technical.
The palette comes from the hardware
An RGB strip can make white by mixing R+G+B. An RGBW
strip carries a fourth channel dedicated to white —
typically warm, always cleaner. That fourth letter is
the brand:
spectrum.r— red of the R channelspectrum.g— green of the G channelspectrum.b— blue of the B channelspectrum.w— warm white,#FFF5E0
The flagship’s canonical accent is spectrum.w. Not
just any white — the specific white a well-calibrated W
LED produces when it does its job. If you’re coming from
the code, it’s literally the byte the host injects into
the W channel of an RGBW frame.
Beyond spectrum, three more roles:
glow— secondary accent, for active states.pulse— positive feedback (frame sent, settings saved).code.*— syntax-highlighting palette for documentation snippets.
Typography
Geist for UI. Geist Mono for code, numbers, IDs. One family, two clear roles. No serifs. No decoration. No italics by default.
Geist Mono isn’t cosmetic: in the web UI, when you see
measured_fps: 29.97, you read it column-aligned without
effort. The difference between 0 and O, between 1
and l, is unambiguous. In a live-metrics table that
saves reading errors.
Why the brand lives outside this repo. The canonical brand book is at
arlaf-design-systems/packages/tokens-lumware/BRAND_BOOK.md, in a separate repo. Only references live here. When Lumware Capture or Lumware Stage want to claim the family, they import from the same tokens package — no duplication, no risk of drift between repos. The cost: a tokens repo to maintain as the source of truth. The reward: three products with literally identical identity.
What comes next
We have software, hardware, protocol, host, process, brand. What’s missing is the place where all of it meets a human: the local web UI. Next post: why it lives in the browser and not as a native app.