Community-supported, not official
WSL2 on Windows is a community-supported configuration. NOMAD is officially designed for bare-metal Debian-based Linux. This guide reflects what works in practice, validated on real hardware. If you hit issues that aren't covered here, please post in GitHub Discussions rather than opening a bug report against the install script.
Who this is for
You have a Windows 10 (build 19041 or later) or Windows 11 PC and want to run NOMAD without buying a separate Linux machine or wiping Windows. WSL2 makes that possible — with caveats.
You should have at least 16 GB of RAM (32 GB+ recommended if you want the AI Assistant), and roughly 100 GB of free disk for the OS, NOMAD images, and content libraries.
Will my GPU work?
GPU acceleration for the AI Assistant depends entirely on your GPU vendor.
| GPU vendor | WSL2 acceleration | What to do |
|---|---|---|
| NVIDIA RTX/GTX | Yes — CUDA-on-WSL works | Install the latest Windows NVIDIA driver. That's it. |
| AMD Radeon (any) | No, in practice | CPU-only inference under WSL2. For GPU acceleration, install Ubuntu directly. |
| Intel Arc | No | CPU-only. |
| AMD APU iGPU (780M, 890M) | No | CPU-only. |
The AMD/Intel limits are upstream — ROCm-on-WSL has a narrow allowlist that excludes most consumer cards, and there's no Vulkan-based Ollama path in NOMAD today. Bare-metal Ubuntu is the answer for AMD GPU users.
How does it actually perform?
We ran the NOMAD benchmark on the same Threadripper 3960X chassis in three configurations to give you real numbers, not guesswork.
| GPU | OS | Score | AI tok/s | TTFT |
|---|---|---|---|---|
| RTX 3090 Ti | WSL2 Ubuntu 24.04 | 75.5 | 395.6 | 7 ms |
| RTX 3090 Ti | Bare-metal Ubuntu 24.04 | 73.1 | 468.2 | 5 ms |
| RX 6800 | Bare-metal Ubuntu 24.04 | 73.7 | 216.0 | 13 ms |
The headline: AI inference runs about 18% faster on bare-metal Ubuntu than under WSL2 with the same NVIDIA card. Time-to-first-token drops from 7 ms to 5 ms. Disk writes also speed up because there's no NTFS overlay between the container and your storage.
Composite NOMAD scores all sit within ~2 points of each other, so for general use (Wikipedia, Kolibri, knowledge content), WSL2 is fine. If you're going to be running the AI Assistant heavily, or doing AMD GPU acceleration, bare-metal Ubuntu wins clearly.
Pick your install path
Two install paths work. They differ in whether Docker runs natively in WSL or via Docker Desktop on Windows.
Path A — Native Docker
Best if you don't already have Docker Desktop, or if you want clean Linux mount semantics.
“I'm a Linux person, Windows is just where my hardware lives.”
Path B — Docker Desktop
Best if you already use Docker Desktop for other work, or you want a more Windows-native flow.
“Docker Desktop is already installed and I don't want a second engine.”
Whichever path you pick, the five WSL2 gotchas at the bottom of this page apply equally to both. Read those before you start.
Path A — Native Docker in WSL2
1. Install WSL2 with Ubuntu 24.04
From PowerShell as Administrator on Windows:
$ wsl --install -d Ubuntu-24.04Reboot when prompted, then open Ubuntu from the Start menu and create a Linux username and password.
2. Enable systemd in WSL
Inside Ubuntu, set up /etc/wsl.conf with systemd enabled and the rshared mount fix that WSL2 needs for the disk-collector container:
sudo tee /etc/wsl.conf > /dev/null <<'EOF' [boot] systemd=true command="mount --make-rshared /" EOF
Then from PowerShell:
$ wsl --shutdownReopen Ubuntu. The shutdown is required — closing the terminal isn't enough. WSL only re-reads wsl.conf on a fresh boot.
3. Disable Docker Desktop's WSL integration (if installed)
If Docker Desktop is installed on Windows, its WSL integration will conflict with the apt Docker install you're about to do. Open Docker Desktop, go to Settings → Resources → WSL integration, and uncheck your Ubuntu distro. Click Apply & Restart. If Apply fails, just quit Docker Desktop entirely.
Then run wsl --shutdown from PowerShell again and reopen Ubuntu.
If you don't have Docker Desktop, skip this step.
4. Remove snap-installed Docker (if present)
Snap Docker is sandboxed and can't access /opt, where NOMAD installs. If you have it:
$ sudo snap remove --purge dockerIf snap list | grep docker returns nothing, you're fine.
5. Install Docker
curl -fsSL https://get.docker.com | sudo sh sudo systemctl enable --now docker sudo usermod -aG docker $USER
Close and reopen the Ubuntu shell so the docker group membership takes effect.
6. Run the NOMAD install script
sudo apt-get update && \ sudo apt-get install -y curl && \ curl -fsSL https://raw.githubusercontent.com/Crosstalk-Solutions/project-nomad/refs/heads/main/install/install_nomad.sh -o install_nomad.sh && \ sudo bash install_nomad.sh
Accept the license prompt and let it run. About five minutes for image pulls.
7. Open NOMAD
On the Windows host, open a browser and go to http://localhost:8080.
WSL2 forwards localhost to the WSL distro automatically, so no extra setup is needed for browser access from Windows. To reach NOMAD from another LAN machine, you'll need a netsh portproxy rule on the Windows host (covered later in the gotchas section).
Path B — Docker Desktop with WSL Integration
This path is based on @nielseni6's walkthrough in #260 with minor updates for current install script behavior.
1. Install WSL2 with Ubuntu and enable systemd
Same as Path A steps 1 and 2 — install Ubuntu, set up /etc/wsl.conf with systemd and rshared mount, then wsl --shutdown and reopen.
2. Install Docker Desktop and enable WSL integration
Download Docker Desktop and install with the default options (the WSL2 backend is the default on Windows 11 and recommended on Windows 10).
After install, open Docker Desktop, go to Settings → Resources → WSL integration, and toggle on your Ubuntu distro. This makes docker and docker compose available inside WSL.
3. Download the NOMAD install script
sudo apt-get update && sudo apt-get install -y curl curl -fsSL https://raw.githubusercontent.com/Crosstalk-Solutions/project-nomad/refs/heads/main/install/install_nomad.sh -o install_nomad.sh
4. Patch the script for Docker Desktop
The install script checks systemctl is-active docker to verify Docker is running. With Docker Desktop, the daemon lives on the Windows side — there's no docker.service systemd unit, so the check fails. Replace it with docker info:
sed -i 's|systemctl is-active --quiet docker|docker info \&> /dev/null|g' install_nomad.sh
That's the only change needed.
5. Run the install
$ sudo bash install_nomad.sh6. Open NOMAD
Open http://localhost:8080 in your Windows browser. Done.
Reboot workflow for Path B
After a Windows reboot, Docker Desktop must be running before NOMAD's containers can start. Either enable Docker Desktop to launch at sign-in (Settings → General → Start Docker Desktop when you sign in), or start it manually and then run:
$ sudo bash /opt/project-nomad/start_nomad.shFive WSL2 gotchas that bite both paths
Whichever install path you pick, you'll run into some subset of these. Documented here as a single reference rather than scattered through both walkthroughs.
1. systemd must be enabled
NOMAD's install script and several services assume systemd. WSL2 ships with it disabled by default. If you skipped the wsl.conf step, parts of the install will fail silently or with cryptic errors. wsl --shutdown is required after editing — closing the terminal isn't enough.
2. Don't use snap-installed Docker
If you have Docker via snap install docker, NOMAD's disk-collector container will fail with a misleading read-only file system error. Snap's confinement sandbox can only see /home, not /opt. Remove it with sudo snap remove --purge docker.
3. Mount propagation must be rshared
The disk-collector sidecar mounts /:/host:ro,rslave, which requires / on the host to be a shared mount. WSL2 mounts / as private by default. Run before docker compose up:
$ sudo mount --make-rshared /This doesn't survive wsl --shutdown. Make it permanent with the command="mount --make-rshared /" line in wsl.conf as shown in step 2 of Path A.
4. Port 11434 conflict with native Ollama
If you previously installed Ollama for Windows, or installed Ollama natively in WSL via curl https://ollama.com/install.sh | sh, port 11434 is already taken. NOMAD's nomad_ollama container will fail with failed to bind host port 0.0.0.0:11434/tcp: address already in use.
Find the culprit from PowerShell:
$ netstat -ano | findstr :11434If wslrelay shows up, the conflict is inside WSL. From the Ubuntu shell:
$ sudo systemctl disable --now ollamaIf it's Ollama for Windows, quit it from the system tray. NOMAD will manage its own containerized Ollama.
5. Confirming GPU acceleration (NVIDIA only)
After AI Assistant installs, verify your NVIDIA card is actually accelerating Ollama (vs silently falling back to CPU):
docker exec nomad_ollama nvidia-smi docker logs nomad_ollama 2>&1 | grep -i "library="
library=CUDA in the logs confirms GPU is in use. library=CPU means GPU is visible to the host but not reaching the Ollama container — usually a driver or NVIDIA Container Toolkit version mismatch.
Access NOMAD from other LAN machines
http://localhost:8080 works from your Windows browser automatically. To reach NOMAD from another machine on the LAN, set up a port proxy on the Windows host. From PowerShell as Administrator:
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=127.0.0.1 New-NetFirewallRule -DisplayName "NOMAD 8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
Repeat for each port you want exposed (8090 Kiwix, 8300 Kolibri, etc.). Using 127.0.0.1 as connectaddress works because of WSL2's localhost forwarding — you don't need to chase the WSL distro's internal IP, which can drift across boots.
Community credit
This guide builds on substantial prior work from the NOMAD community.
- @nielseni6 wrote the original step-by-step Docker Desktop + WSL Integration walkthrough in issue #260. Path B above is a direct descendant of their work.
- @charlesmerritt investigated the install_nomad.sh-side WSL2 patches in issue #572. The script-level diagnosis there informed several of the gotchas above.
Get help
Hit a problem this guide doesn't cover? Post in GitHub Discussions with your Windows version, WSL distro version, and the full error you're seeing. Other Windows users are likely watching the discussion forum and may have hit the same thing.
Please don't open bug reports against the install script for WSL2-specific issues — WSL2 isn't officially supported, and we can't triage every Windows configuration. The discussions forum is the right place.