Self-host on one Linux box
The smallest real install is one Linux machine, one systemd unit, SQLite in a file, and no public port. Everything below uses the release tarball, so the box itself needs no Go toolchain and no container runtime.
1. Build or download the tarball
Section titled “1. Build or download the tarball”The server ships as one self-contained tarball per architecture, wfx-server-linux-amd64.tar.gz
and wfx-server-linux-arm64.tar.gz, with a checksums.txt. A tagged release attaches them on GitHub; from a
checkout of the repository (Go, Node and Task installed) you build them
yourself:
task release # writes bin/release/wfx-server-linux-{amd64,arm64}.tar.gzCopy the one for your machine to the box, then:
sudo useradd --system --create-home --shell /bin/bash wfxsudo mkdir -p /opt/wfnexus && sudo tar xzf wfx-server-linux-amd64.tar.gz -C /opt/wfnexussudo ln -s /opt/wfnexus/bin/wfx-linux /usr/local/bin/wfxThe tarball holds bin/wfx-server-linux, bin/wfx-linux, bin/wfx-runner-linux, the built UI
in ui/, workflows/, templates/, skills/, registries.json and a commented
config.example.yaml.
2. A systemd unit
Section titled “2. A systemd unit”[Unit]Description=wfnexus serverAfter=network-online.target
[Service]User=wfxWorkingDirectory=/opt/wfnexusEnvironment=WFX_ROOT=/opt/wfnexusEnvironment=WFX_UI_DIR=/opt/wfnexus/uiExecStart=/opt/wfnexus/bin/wfx-server-linuxRestart=on-failure
[Install]WantedBy=multi-user.targetsudo systemctl daemon-reload && sudo systemctl enable --now wfnexusjournalctl -u wfnexus -fWith no config file and no WFX_MODE, the server runs in local mode:
- it listens on
127.0.0.1:8090(WFX_ADDRchanges it); - runs and state go to SQLite at
~/.local/share/wfnexus/wfnexus.dbof thewfxuser; - artifacts go to a folder under
~/.local/share/wfnexus/; - the env store’s encryption key is written on first boot to
~/.config/wfnexus/secret.key, unlessWFX_SECRET_KEYholds one. Back it up with the database; without it the stored values cannot be opened.
A file at ~/.config/wfx/config.yaml (or wherever WFX_CONFIG points) sets the same things;
an environment variable always wins over the file. mode: server switches to Postgres and S3.
The boot log says what is wired before it serves: every workflow it loaded, any it skipped as
NOT LOADED with the reason, and the doctor’s view of providers and keys.
3. A model key
Section titled “3. A model key”Keys go in the encrypted env store, not in the unit file:
sudo -iu wfxwfx env set OPENROUTER_API_KEY # read without echoing, stored encryptedwfx doctor # default provider, its key, and one real test callPoint the server at a provider with WFX_DEFAULT_PROVIDER (or model.provider in the config),
and give it a fallback with WFX_FALLBACK_PROVIDERS. See
Providers and models.
4. Let your team in over SSH
Section titled “4. Let your team in over SSH”Still as the wfx user, authorise each teammate’s public key for the tunnel only:
wfx team add alice ./alice.pubOn each laptop:
wfx context add team --url http://127.0.0.1:8090 --via ssh://wfx@server.example.com --accept-host-keywfx doctorwfx uiThe details, including the 15-minute idle close and wfx status, are on
Remote access over SSH.
Tools and config without rebuilding
Section titled “Tools and config without rebuilding”Run the server through carry (carry run -- /opt/wfnexus/bin/wfx-server-linux with CARRY_REPO
set) and install tools or change config from your laptop with carry tool add / carry put /
carry env set. See Tools and config with carry.
Adding machines
Section titled “Adding machines”Steps that need another OS, a GPU or a logged-in agent CLI run on a
worker: wfx workers prints the join line, and wfx-runner on the
other machine connects outbound only.