Theme Taxonomy Changes (6.4.0)¶
This document describes changes to the theme category taxonomy introduced in 6.4.0.
As of the 6.4.0 migration (2026-08-15)
The tables on this page record the library as of the 6.4.0 migration and are
deliberately not updated as the library changes. This is a dated migration record,
not a live reference — the values may change over time, but this page will not be
updated to reflect current status. For current data, ask the library itself:
ThemeLibrary.get_categories() lists the categories and
ThemeLibrary.get_by_category() fetches one.
Overview¶
The theme library's category navigation was rewritten over the LIFX app's own taxonomy:
- App taxonomy:
get_by_category()now reads the nine categories from the generated theme records instead of a hand-made six-name grouping over hardcoded theme lists - Category discovery: the new
ThemeLibrary.get_categories()class method lists every category present in the data - Legacy names: the six pre-6.4.0 category names are retired, and the error lists the categories that exist
- Dispositions: every theme records its fate as queryable data —
Theme.dispositionandTheme.replaced_by— including the two rename aliases
The Nine Categories¶
Eight of the nine categories are the LIFX app's own. Library is defined by this library, not the app: it holds the 28 pre-6.3.0 keys that have no app counterpart. The app's three sport categories (AUSSIE RULES, LEAGUE and UNION) are not carried — they have been out of scope since the library was first generated from app data.
| Category | Themes | Defined by |
|---|---|---|
| Archives | 60 | LIFX app |
| Art Series | 10 | LIFX app |
| Holidays | 15 | LIFX app |
| Library | 28 | This library |
| Moods | 13 | LIFX app |
| Music | 14 | LIFX app |
| Nature | 8 | LIFX app |
| Play | 7 | LIFX app |
| Space | 11 | LIFX app |
Category matching is case- and punctuation-insensitive: Art Series, art series
and art_series all resolve to the same category, while artseries does not.
Retired Category Names¶
All six pre-6.4.0 category names are retired. Each now raises ValueError
listing the nine categories that exist:
ThemeLibrary.get_by_category("holiday")
# ValueError: Category 'holiday' is not recognised. Available categories:
# Archives, Art Series, Holidays, Library, Moods, Music, Nature, Play, Space
No legacy name is redirected, because no honest redirect exists. Not one of the
six mapped onto a single app category, and the Closest column below is the
share of each name's old result set that the nearest single category actually
holds, measured against the 6.4.0 data:
| Retired name | Nearest category | Closest |
|---|---|---|
holiday |
Holidays |
7/12 |
mood |
Moods |
10/16 |
seasonal |
Library |
2/2 |
ambient |
Play |
5/6 |
functional |
Library |
3/3 |
atmosphere |
Library |
2/3 |
Redirecting holiday to Holidays would have silently dropped five themes and
added ten, with no exception and no warning to say so. Raising is the only
behaviour that tells you your grouping changed. Read the table, pick the category
you meant, and call it by its current name.
Every theme any of these names used to return still resolves through
ThemeLibrary.get() — nothing was deleted, only regrouped. Use
Theme.category to see where a given theme now sits.
Three theme names the old hardcoded lists carried — winter, romantic and
dramatic — never resolved to real themes and were silently filtered out of
results. The hardcoded lists are gone, so nothing is silently filtered any more.
Deprecated Keys¶
Nine of those library keys are recorded as deprecated in 6.4.0, each with a replacement that is both palette-close and semantically the same idea:
| Deprecated key | Replacement |
|---|---|
focusing |
gentle |
intense |
fantasy |
shamrock |
st_patricks_day |
love |
romance |
holly |
christmas |
fire |
warm_ember |
proud |
pride |
pumpkin |
pumpkin_spice |
santa |
candy_cane |
A deprecated key still resolves: deprecation records a fate, it never deletes, and
removing a key would be a major-version decision. The disposition is queryable data —
Theme.disposition and Theme.replaced_by on the object ThemeLibrary.get()
returns — and no warning is emitted and nothing is logged when a deprecated key is
used. The remaining 19 orphan keys are recorded as library-only and stay.
Rename Aliases¶
Two keys are a theme's former name, kept resolvable since 6.3.0. They now report the rename instead of the target's fate:
| Old key | Current key | disposition |
replaced_by |
|---|---|---|---|
forest |
forrest |
renamed |
forrest |
aurora_borealis |
aurora |
renamed |
aurora |
Before 6.4.0 an alias key bound its target's own record, so the only two keys
whose name had actually changed were the two claiming a clean lifx-app fate
with no successor. A migration audit keyed off replaced_by saw nothing to do
for exactly the keys that had moved. Both now answer:
theme = ThemeLibrary.get("forest")
print(theme.disposition) # renamed
print(theme.replaced_by) # forrest
An alias still returns its target's palette, display name and category, so
existing code that only reads colours is unaffected. What changed is slug,
which is now the key you asked for rather than the target's, and the pair no
longer double-counts in get_by_category() — a category lists each theme once,
under its current key.
Before and After¶
Before — historical pre-6.4.0 behaviour, shown for context:
from lifx import ThemeLibrary
# The old hand-made grouping: a hand-picked, mixed list of themes
holidays = ThemeLibrary.get_by_category("holiday")
After:
from lifx import ThemeLibrary
# Discover the categories, then fetch one
categories = ThemeLibrary.get_categories()
holidays = ThemeLibrary.get_by_category("Holidays")
# Read a deprecated theme's recorded fate
theme = ThemeLibrary.get("fire")
print(theme.disposition) # deprecated
print(theme.replaced_by) # warm_ember
get_by_category("holiday") and get_by_category("mood") were the only two
legacy names any published example used, and both now raise. The nearest
equivalents are "Holidays" and "Moods", but they are not the same sets — the
table below lists what each legacy call returned that its nearest category does
not. Every one of these themes still resolves through ThemeLibrary.get(); each
has simply moved to a category the legacy name never pointed at.
| Legacy call | Themes the nearest category does not return | Where they are now |
|---|---|---|
get_by_category("holiday") |
holly, proud, pumpkin, santa, shamrock |
Library (all five are deprecated keys) |
get_by_category("mood") |
epic, exciting, intense, love, relaxing, serene |
Library, except exciting (Play) |
Holidays and Moods also each contain themes the legacy names never returned,
so review the full category rather than assuming a superset.