galois-edge reads its configuration from a single KEY=VALUE file. Defaults are baked into the binary; the file overrides defaults; environment variables override the file. A typical install never needs more than the four keys written by galois-edge setup.
The daemon resolves config in this order on startup:
The path passed to --config on the CLI, if any.
${SystemConfigDir}/config.env.
${UserConfigDir}/config.env.
Built-in defaults if no file is found.
Environment variables override the resulting struct as a final layer — they take effect after whichever source above was chosen.
Platform
System dir
User dir
Linux / macOS
/etc/galois-edge/
~/.config/galois-edge/
Windows
C:\ProgramData\galois-edge\
%APPDATA%\galois-edge\
The system path is preferred for service installs; the user path is preferred for per-user development. Both setup and configure set follow the same precedence — they update an existing file in place if one is found, otherwise they write to the user dir (no root required).
# Optional `export` prefix is accepted (sourced shells also work)
export REGISTRATION_TOKEN=glc_XXXXXXXX
Values may be wrapped in single or double quotes. Inline comments are stripped from unquoted values (split on " #"). Booleans accept true / 1 / yes / false / 0 / no (case-insensitive). Comma-separated lists like LAN_INSTRUMENTS strip whitespace around each entry and drop empty values. Unknown keys are preserved on round-trip and forwarded to the Python engine as environment variables — useful for experimental flags like DEMO_MODE=1 or MODBUS_INSTRUMENTS=….
Optional bearer token. When non-empty, the daemon’s gRPC server installs an interceptor that requires authorization: Bearer <token> metadata on every RPC except Ping. Empty disables auth (the network — tailnet or loopback — is the boundary). Auto-populated by setup if the backend returns one. Format convention: glc_internal_<32+ random chars>.
Pre-auth key for joining the tailnet. Auto-populated by setup if the backend returns one.
HEADSCALE_URL
empty
Headscale control URL. Empty → use the public Tailscale control plane.
TSNET_STATE_DIR
empty
Persistent state for the embedded Tailscale node. When empty, start resolves it to ${SystemConfigDir}/tsnet-state at runtime. The directory is created with mode 0700.
Enable the raw-USB transport (pyusb) for vendor-specific non-USBTMC devices (e.g. Signal Recovery lock-in amplifiers). Standard USBTMC devices use PyVISA regardless of this setting.
Every key can be set as an environment variable of the same name. Env vars take precedence over the config file, which is convenient for systemd drop-ins and Kubernetes: