Configuration files
| Path | Owner | Survives upgrade | What it is |
|---|---|---|---|
/etc/openmixer/config.json |
openmixer-server package |
yes (%config(noreplace)) |
The server's startup configuration: console size, gig label, catalog path, network bind. |
/etc/nginx/conf.d/openmixer-web-ui.conf |
openmixer-web-ui package |
yes (%config(noreplace)) |
The nginx drop-in: the upstream, the plain listener, and the mask include that reaches the https server block. Names no certificate, so it loads on a console that has none. |
/etc/openmixer/nginx/tls.conf |
%post of openmixer-web-ui |
it is rewritten on every install | The https + HTTP/2 server block, copied from /usr/share/openmixer/nginx/openmixer-web-ui-tls.conf only when the leaf and key are there. Removed on a full uninstall, and by enable-nginx-tls.sh whenever the leaf goes. Edit the shipped file, not this copy. |
/etc/openmixer/tls/{root,console}.{crt,key} |
%post of openmixer-web-ui (issue-local-ca.sh) |
yes — never overwritten once present | The console's own certificate authority and the leaf nginx serves. Keys are 0600. Replace either with your own and upgrades will leave it alone; delete console.crt and console.key to have the next install re-issue. |
~/.config/reac-pw/reac-pw.env |
the mixer's Setup screen | yes (no package owns it) | Which NICs face REAC on this host — the transport's config-once fact. |
~/.config/reac-pw/<iface>.env |
the mixer's Setup screen and the segment's role |
yes (no package owns it) | One per segment: transmit interface, launch role, desk profile, wire pace, segment name. |
<state-dir>/network-settings.json |
the server | yes | The persisted Setup → Network values. Outranks CLI and environment. |
<state-dir>/locale-settings.json |
the server | yes | The persisted operator locale. |
<state-dir>/adapters.yaml |
the server | yes | Adapter definitions for the adapter manager. |
<state-dir>/stageboxes.json |
the server | yes | Stagebox names, keyed by box identity, independent of any session. |
~/.config/pipewire/pipewire.conf.d/*.conf |
you | yes | Graph-wide sample rate and quantum. See clocking. |
<state-dir> is $XDG_STATE_HOME/openmixer, or ~/.local/state/openmixer when
XDG_STATE_HOME is unset. See state and sessions.
/etc/openmixer/config.json
The shipped default is empty — with one boot path there is nothing to select, and every knob below has a working default:
{}
The recognised shape:
{
"adapter": "software",
"device": { "host": "127.0.0.1", "port": 10002, "options": {} },
"web": { "host": "localhost", "port": 8080 },
"rig": { "console": "32:16", "gig": "Saturday", "catalog": "/path/to/catalog.json", "demoSources": true }
}
Every field is optional; anything omitted takes its default.
adapter— which console family the server drives:software(the PipeWire native mix engine — the real mixer),midas,x32,roland, ormockfor tests. Defaultmock.device.host/device.port— the address of a physical desk, whenadapternames one. Each adapter supplies its own protocol default port when omitted.web.*— the bind address and port, as the lowest layer of the network resolver: persisted Setup value > CLI flag > environment > this file > built-in default (packages/server/src/network-config.ts). So{"web": {"port": 9000}}here moves the server to 9000, but a--web-portor anOPENMIXER_WEB_PORTstill overrides it for that run. Resolution is per field, so setting onlyhosthere leaves the port alone. Values are validated on load — a port out of range stops the boot rather than binding something unexpected, and an unknown key insidewebis rejected rather than ignored. See ports.rig.preset— retired. The console is the only rig; there is no axis to select. A rig axis whose default (bare: the configured adapter and nothing else) could not carry audio meant a server started without this file came up mute and never said so. Three names (bare,demo,console) still parse, so a file written before the change does not fail validation on upgrade — but they are ignored, and the server says so at startup.baresays it loudly, because that file asked for a rig that no longer exists and is getting a whole console instead. Remove the key.rig.console— pins the console size asIN:OUT, e.g."32:16". A malformed value is logged and ignored, falling back to detection: a typo must never stop the desk from booting.rig.gig— a label for the session.rig.catalog— an explicit plugin-catalog path. Unset means the catalog package's own bundled data file.
The file is validated on load. An unknown adapter name — or a rig preset that was never a real one — is an error, not a silent fallback.
Pointing at a different file
openmixer-server --config /etc/openmixer/rig-b.json
or the environment variable OPENMIXER_CONFIG. To change it for the service, use a
drop-in rather than editing the packaged unit:
systemctl --user edit openmixer-server
[Service]
ExecStart=
ExecStart=/usr/bin/openmixer-server --config /etc/openmixer/rig-b.json
The nginx drop-in
Package-owned but marked %config(noreplace) (the nginx drop-in's own %files entry in
packaging/rpm/openmixer.spec), so an
upgrade keeps your edited file and drops the package's new one beside it as
openmixer-web-ui.conf.rpmnew. That is the opposite of the risk you might expect: your
changes are safe, but an upgrade that changes the proxied paths or the upstream will not
reach you. After an upgrade, check for the .rpmnew and merge it:
ls /etc/nginx/conf.d/openmixer-web-ui.conf.rpmnew && \
diff -u /etc/nginx/conf.d/openmixer-web-ui.conf{,.rpmnew}
sudo systemctl reload nginx