Mixer Web UI Config
mixer_web is a Phoenix LiveView application (Elixir) that provides the browser-based mixing console. It is database-less — all state comes from the JSON files that shiloh-mixer writes, and from the mixer’s UDP control plane.
Environment variables
All runtime configuration is done via environment variables. There is no separate config file for mixer_web in production — values are injected by the systemd unit or the Coolify deployment environment.
| Variable | Required | Default | Description |
|---|---|---|---|
SECRET_KEY_BASE |
Yes (prod) | — | Secret used to sign/encrypt cookies and LiveView session tokens. Generate with mix phx.gen.secret. Must be at least 64 characters |
PORT |
No | 8889 |
HTTP listen port |
PHX_HOST |
No | "localhost" |
Hostname used in URL generation (affects LiveView websocket path) |
PHX_SERVER |
No | — | Set to any non-empty value to start the HTTP server when running as a Mix release (bin/mixer_web start). Not needed when using mix phx.server |
DNS_CLUSTER_QUERY |
No | — | DNS-based cluster discovery query. Leave unset for single-node deployments |
HTTP listener
In production, mixer_web binds to all interfaces (0.0.0.0) on the configured port. The default port is 8889.
http://stg-srv001.bq.shilohbv.com:8889/
Origin checking is disabled (check_origin: false) so the LiveView WebSocket works regardless of which hostname you use to reach the server — localhost, IP address, or hostname all work without reconfiguration.
Security posture
mixer_web is designed for LAN-only use. It has:
- No authentication
- No TLS (plain HTTP)
- No database
- Origin checking disabled
Do not expose it directly to the internet. If remote access is needed, use WireGuard or an authenticated reverse proxy.
Mixer connection
mixer_web connects to shiloh-mixer’s control plane at 127.0.0.1:19997 (the default control_port). This address is compiled into the application configuration and is not currently overridable via environment variable — mixer_web must run on the same host as shiloh-mixer, or the mixer’s control_bind must be set and mixer_web’s compiled-in control address updated accordingly.
State files
mixer_web reads the JSON state files that shiloh-mixer writes. File paths are configured in shiloh-mixer.toml — mixer_web polls these files for meter data, gain state, scenes, relay assignments, and MIDI state. Both processes must agree on the paths.
Default paths (set in shiloh-mixer.toml):
| File | Default |
|---|---|
| Peak meters | /home/shiloh/mixer-state/meters.json |
| Gains / scene | /home/shiloh/mixer-state/gains.json |
| Named scenes | /home/shiloh/mixer-state/scenes.json |
| Relay assignments | /home/shiloh/mixer-state/relay-assignments.json |
| MIDI state | /home/shiloh/mixer-state/midi-state.json |
Running in development
cd server/mixer_web
mix deps.get
mix phx.server
The dev server binds to 0.0.0.0:8889 with hot-reload enabled. No SECRET_KEY_BASE is required in development — a static value is baked into config/dev.exs.
Running as a release
# Build the release
MIX_ENV=prod mix assets.deploy
MIX_ENV=prod mix release
# Start it
SECRET_KEY_BASE=$(mix phx.gen.secret) \
PORT=8889 \
PHX_HOST=stg-srv001.bq.shilohbv.com \
PHX_SERVER=true \
_build/prod/rel/mixer_web/bin/mixer_web start
In practice, the systemd unit on stg-srv001 sets these variables and manages the process lifecycle.