The Fixo prefix and the Fixo / Fluxo split
Why everything is "Fixo something" right now
The Fixo prefix and the Fixo / Fluxo split
If you've spent any time in the OctoMY™ codebase or studio you'll have noticed almost everything firmware-adjacent is named Fixo* — FixoPreset, FixoActuator, FixoLobeType, FixoLibrary, FixoStudioActivity. This is deliberate, and only temporary. Here's the story so you don't have to guess.
TL;DR
The
Fixoprefix marks "the new, unified, statically-compiled firmware system". It exists to keep the new types separate from the legacy types they replaced. Once the legacy types are fully out (a planned single-commit prefix-strip pass), the prefix goes away in one clean operation. Until then, every new type carries it.
Where the name comes from
Fixo is from Latin fixus — "fixed, fastened, settled". The companion controller, Fluxo (from fluxus — "flowing"), shipped configuration over the wire at runtime so the firmware was generic. Together they expressed a static / dynamic duality.
Fluxo itself was a rename of the older ArduMY (Arduino-based generic firmware), done for symmetry with Fixo.
Fluxo was retired in 2026 because Fixo's embedded LLVM made the static path's only real cost — having to compile firmware — fast enough to be invisible. The duality is gone, but the Fixo name survived because it accurately describes what the surviving system does.
Why everything is Fixo*
The Fixo system was built alongside the legacy system, not as a replacement of it (initially). For a year or more, both systems coexisted in the codebase: Stanza (legacy) and FixoStanza (new), StanzaBook (legacy) and FixoStanzaTemplateBook (new), Lobe (legacy from liblobe) and FixoLobe (new), Controller / IController (legacy abstraction) and FixoController (new concrete class). The prefix was the safest way to keep them apart.
This let the team:
- Migrate consumers one at a time without renaming-stress on the legacy code
- Keep tests green at every step (legacy tests against legacy types, new tests against
Fixo*types) - Delete the legacy code in tractable chunks rather than one giant rename PR
When the prefix goes away
The plan is a single dedicated commit, scheduled after:
- The last legacy controller (Servotor32, Fluxo, NullController) is gone — this happened in 2026.
IControlleritself is gone — in flight; it requires careful unwinding because libhardware UI activities still holdIController*and have to be relocated first.liblobeand the legacyStanzaBookare gone.
Once all three are done, a single bulk-rename pass strips Fixo from every canonical class:
| With prefix | After strip |
|---|---|
FixoPreset |
Preset |
FixoActuator |
Actuator |
FixoStanza |
Stanza |
FixoLobeType |
LobeType |
FixoLibrary |
Library |
FixoController |
Controller |
FixoRuntime |
Runtime |
FixoBook |
Book |
| … | … |
Until that pass lands, don't strip the prefix yourself — the rename has to happen all at once to keep the codebase coherent.
A second naming convention: "Manager", not "Management"
While we're talking conventions: the manager activities are named FixoPresetManager, FixoActuatorTypeManager, etc. — never FixoPresetManagementActivity.
Earlier code had a mix: ActuatorManagementWidget, ConstellationManagementActivity, NodesManagementWidget. In Phase 9 we did a sweep to rename every *Management* to *Manager* for consistency. So when reading older docs or PRs, you may still see the older spelling — the actual class names today are all "Manager".
This rule applies broadly across OctoMY™, not just in libfixo.
File and tag naming, while we're at it
A summary of the conventions used across libfixo:
| What | Convention | Examples |
|---|---|---|
| C++ classes | CamelCase, Fixo prefix until the strip pass |
FixoActuatorType, FixoPreset |
| Source files | kebab-case | rc-servo.hpp, legged-gait.hpp |
fixo.json field names |
camelCase | fixoType, semanticTags, mainHeader |
| Semantic tags | snake_case | knee_joint, left_motor, leg_3 |
| Manager classes | "Manager" not "Management" | FixoPresetManager |
If you're authoring a custom fixo.json (an actuator type, a stanza template, a preset template) and you stick to these conventions, the existing UIs will recognise and surface your additions cleanly.
See also
- Why Fixo — bigger-picture explanation
- Fixo Data Model — where the prefix lives in the type tree
- Fixo Controller — the controller class itself