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, or mock for tests. Default mock.
  • device.host / device.port — the address of a physical desk, when adapter names 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-port or an OPENMIXER_WEB_PORT still overrides it for that run. Resolution is per field, so setting only host here 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 inside web is 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. bare says 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 as IN: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