Skip to content

← Back to list

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.

3 min read

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.

Lumware identity grid: wordmark, spectrum R/G/B/W palette, and type samples (Geist + Geist Mono).

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 Capturesensor → host. Camera, mic, MIDI feeding a host that decides.
  • Lumware Stageunity ↔ 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

Lumware’s strip is RGB: white comes from mixing R+G+B, not from a dedicated channel. Three of the four brand tokens are literal — they come straight from the channels travelling down the wire:

  • spectrum.r — red of the R channel
  • spectrum.g — green of the G channel
  • spectrum.b — blue of the B channel
  • spectrum.w — warm brand white, #FFF5E0

The flagship’s canonical accent is spectrum.w. Not a physical channel: a brand decision — the warm white you’d want an RGBW strip to make, even though this one composes it from R+G+B. If I ever migrate to an RGBW strip, spectrum.w becomes a real channel.

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.