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.tomlmixer_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.