Decoder programming made easy and for everyone.
- Pick a decoder in the left menu (ZIMO MS450, ESU LokSound v4 / v5, RailBOX RB23xx)
- Read and write CVs one at a time (accordion list from the decoder catalog)
- Set the NMRA 3-point speed curve (CV 2 / 6 / 5) plus accel / brake (CV 3 / 4)
- Set the DCC address (short CV 1, or long CV 17/18 and CV 29 bit 5)
- Set master volume 0–100 (mapped to CV 266 / 63 / 203 by decoder)
- Map function keys to lamp outputs (ZIMO MS/MN, ESU LokSound v4 / v5)
- Update RailBOX RB23xx firmware over Soft-AP (F28 + wireless-programmer)
make web-build
make host # native binary at target/release/programming-center
# or, during development:
make dev-backend # Axum on :8092
make dev-web # Vite on :5176, proxies /api to the daemonHealth: GET /healthz. The kiosk stays off until you set "enabled": true.
JSON at $DATA_DIR/etc/bigfred/programming-center/config.json (created on
first start). Hot-reload: a bad file keeps the previous snapshot. Changes
to http / CORS need a process restart.
{
"http": "0.0.0.0:8092",
"enabled": false,
"mode": "bigfred",
"programmingMode": "bigfred",
"bigfred": { "address": "bigfred.local:8080" },
"z21": { "hostname": "192.168.4.1", "port": 21150 },
"ssoClientId": "programming-center",
"redirectUris": [
"http://bigfred.local:8092/auth/callback",
"http://programming-center.local:8092/auth/callback",
"http://localhost:8092/auth/callback"
],
"corsEnabled": false,
"corsOrigins": [],
"idleTimeoutSecs": 86400,
"pomWriteRepeat": true,
"wirelessProgrammer": {
"enabled": true,
"socketConnectRetryInterval": 60
}
}mode: "bigfred"— SSO, proxy, command-station picker (BigFred login).mode: "standalone"— no BigFred sign-in or proxy. CV traffic always goes to Z21 (z21.hostname:port); dcc-bus needs a layout session that standalone does not have.programmingMode: "bigfred"(default with SSO) — CV via dcc-bus.programmingMode: "z21"— CV via UDP toz21.hostname:port. Works with BigFred login in front of a direct Z21.pomWriteRepeat: true(default) — send each POM write twice. POM carries no acknowledgement, so a dropped packet is otherwise silent. Setfalsefor exactly one packet per write.wirelessProgrammer.enabled(default true) — retry IPChelloto wireless-programmer everysocketConnectRetryIntervalseconds (default 60). Connect timeout is 2 s (not in JSON).
bigfred.address is host:port without a scheme. The daemon adds http://
and ws://.
Speed control: ZIMO MS/MN, ESU LokSound 5. Output mapping: ZIMO MS/MN, ESU LokSound v4 / v5. Digital coupler: ESU and ZIMO. RailBOX firmware: RB23xx Soft-AP.
ARCHITECTURE.md. Rust / TypeScript rules: CODING-GUIDELINES.md. License: Apache-2.0.
This project is part of the BigFred ecosystem.

