lume

Profiles

The one idea the whole command line is built on.

A profile names one lamp or several, and every verb takes a profile. That is the whole model — a profile of one lamp is just a lamp.

$ lume key on --brightness 80 --kelvin 4500
$ lume studio on     # key, rim and the accent light, each at its stored values
$ lume all off

The config

lume config prints where the file belongs — ~/.config/lume/lamps.json — and a starter to copy. lume setup writes it for you.

{
  "lamps": {
    "key":    { "type": "elgato", "host": "192.168.1.29",  "certs": "~/.config/lume" },
    "rim":    { "type": "elgato", "host": "192.168.1.131", "certs": "~/.config/lume" },
    "akzent": { "type": "hue",    "host": "192.168.1.53",  "id": "Büro" }
  },
  "profiles": {
    "studio": {
      "key":    { "brightness": 80, "kelvin": 4500 },
      "rim":    { "brightness": 47, "kelvin": 5600 },
      "akzent": { "brightness": 30, "color": "#ff7a2f" }
    },
    "elgatos": ["key", "rim"]
  },
  "default": "studio"
}

A profile written as a list of names controls those lamps and leaves their values alone. A profile written as an object applies the values it holds, and any flag you pass overrides them for that one command.

default is the profile used when a command names no target at all, so lume off turns off the studio.

Where secrets are not

The Hue application key lives in ~/.config/lume/hue-token, or $LUME_HUE_TOKEN, or a path named in the config’s token field — deliberately not in the config file itself, so the config is safe to keep in a dotfiles repo. The Elgato private keys never leave the certificate directory.

For scripts and Stream Decks

A Stream Deck button is just lume studio toggle. Because a profile fans out in parallel, three lamps take about as long as one.

--json prints machine-readable results, --quiet prints nothing but errors, and the exit code is 1 if any lamp failed.