My Wife’s Steam Deck Is a Server Now. She Doesn’t Know Yet. 🫠 A developer has turned a Steam Deck into a server node for the BarkVisor homelab platform, enabling it to run VMs and local AI models via Ollama while remaining a gaming device. The walkthrough details installing BarkVisor on SteamOS, including unlocking the OS, installing QEMU components, and setting up agent mode. The project demonstrates repurposing idle handheld hardware for distributed computing. Hey tech adventurers 👋 What if the hardware you already own could become part of your homelab? That spare Linux box. An old Mac. A mini PC sitting under the TV. Or, in my case, my wife’s Steam Deck. 😅 She can’t play 24/7, so when the Deck is idle, I figured its CPU might as well do something useful. So I installed BarkVisor on SteamOS and turned it into another Device in my Home. It can run VMs, join my other Mac and Linux machines, and even run small local AI models with Ollama. And yes, it still plays games. I’m not that terrible of a husband. This post is the “I actually did it on a Steam Deck” walkthrough: practical, step-by-step, and no kernel seminar. The bigger idea, though, is simple: You probably already have a machine that could run BarkVisor. | Role | Machine | Listens | |---|---|---| | Home UI + control | Mac/Linux on the LAN | :7777 HTTP, :7778 mTLS | | Device this tutorial | Steam Deck or similar SteamOS / handheld Linux | :7777 API only, :7778 agent, Ollama :11434 | Example LAN: Home 192.168.10.10 , Deck 192.168.8.133 . You never open the Deck’s :7777 in a browser. Pair once. Then lives in BarkVisor. Same class of machine: Steam Deck and Lenovo Legion Go–style handhelds running SteamOS / Arch-ish Linux. The unlock + pacman bits below are SteamOS / Deck-specific . Adjust paths /home/deck if your user isn’t deck . Switch to Desktop Mode . Set a sudo password if you haven’t passwd . SteamOS root is tiny ~5GB . BarkVisor, models, and VM disks go under /home . Do not fill the root partition. Future-you will thank present-you. Unlock the OS and trust SteamOS package keys once — when pacman complains about unknown trust / GitLab CI Package Builder : sudo steamos-readonly disable sudo pacman-key --init sudo pacman-key --populate archlinux sudo pacman-key --populate holo sudo pacman-key --lsign-key 889B5EBDDD505A683621900DAF1D2199EF0A3CCF Install the VM stack. Arch/SteamOS splits QEMU — qemu-base alone is not enough for BarkVisor’s virtio-gpu-pci , and cloud-init needs mkisofs from cdrtools : sudo pacman -S qemu-base edk2-ovmf \ qemu-hw-display-virtio-gpu qemu-hw-display-virtio-gpu-pci \ cdrtools swtpm Sanity check you want a line with virtio-gpu-pci and a writable /dev/kvm : command -v qemu-system-x86 64 qemu-img mkisofs qemu-system-x86 64 -device help | grep virtio-gpu-pci ls /usr/share/edk2/x64/OVMF CODE.4m.fd ls -l /dev/kvm Do not pipe install.sh into sudo on SteamOS. Use the Linux tarball under home. Agent mode = no SPA on the Deck. The Deck is a worker, not a kiosk. Current release at time of writing: 1.0.0-alpha.3 check GitHub releases https://github.com/pmdroid/barkvisor/releases if you’re reading this from the future . VER=1.0.0-alpha.3 or whatever current release is PREFIX="$HOME/.local/opt/barkvisor" mkdir -p "$PREFIX" "$HOME/.local/share/barkvisor" "$HOME/.local/bin" \ "$HOME/.config/barkvisor" "$HOME/.config/systemd/user" cd /tmp curl -fL -O "https://github.com/pmdroid/barkvisor/releases/download/v${VER}/barkvisor-${VER}-linux-x86 64.tar.gz" curl -fL -O "https://github.com/pmdroid/barkvisor/releases/download/v${VER}/barkvisor-${VER}-linux-x86 64.tar.gz.sha256" sha256sum -c "barkvisor-${VER}-linux-x86 64.tar.gz.sha256" tar -xzf "barkvisor-${VER}-linux-x86 64.tar.gz" SRC="barkvisor-${VER}-linux-x86 64/root/usr/local" install -m 0755 "$SRC/bin/barkvisor" "$PREFIX/bin/barkvisor" ln -sfn barkvisor "$PREFIX/bin/barkvisor-agent" cp -a "$SRC/lib/barkvisor" "$PREFIX/lib/" skip share/barkvisor/frontend — agent mode, no SPA CLI wrapper sets the bundled Swift LD LIBRARY PATH — yes, Swift on a Steam Deck, we’re living deliciously : bash cat "$HOME/.local/bin/barkvisor" << 'EOF' /usr/bin/env bash PREFIX="${HOME}/.local/opt/barkvisor" export LD LIBRARY PATH="${PREFIX}/lib/barkvisor/swift:${PREFIX}/lib/barkvisor/compat${LD LIBRARY PATH:+:$LD LIBRARY PATH}" exec -a "$ basename "$0" " "${PREFIX}/bin/barkvisor" "$@" EOF chmod +x "$HOME/.local/bin/barkvisor" ln -sfn barkvisor "$HOME/.local/bin/barkvisor-agent" grep -q '.local/bin' ~/.bashrc || echo 'export PATH="$HOME/.local/bin:$PATH"' ~/.bashrc export PATH="$HOME/.local/bin:$PATH" Env + user systemd service data on home, no frontend dir : Click to expand: barkvisor.env + barkvisor-agent.service cat "$HOME/.config/barkvisor/barkvisor.env" << EOF BARKVISOR PORT=7777 BARKVISOR DATA DIR=$HOME/.local/share/barkvisor BARKVISOR SOCKET DIR=$XDG RUNTIME DIR/barkvisor HOME=$HOME LD LIBRARY PATH=$HOME/.local/opt/barkvisor/lib/barkvisor/swift:$HOME/.local/opt/barkvisor/lib/barkvisor/compat EOF cat "$HOME/.config/systemd/user/barkvisor-agent.service" << EOF Unit Description=BarkVisor API-only Device daemon After=network-online.target Wants=network-online.target Service Type=simple WorkingDirectory=$HOME/.local/share/barkvisor EnvironmentFile=-$HOME/.config/barkvisor/barkvisor.env ExecStart=$HOME/.local/opt/barkvisor/bin/barkvisor-agent Restart=on-failure RestartSec=3 TimeoutStopSec=8 KillMode=mixed RuntimeDirectory=barkvisor LimitNOFILE=65536 Install WantedBy=default.target EOF systemctl --user daemon-reload systemctl --user enable --now barkvisor-agent.service curl -sS http://127.0.0.1:7777/api/health barkvisor-agent doctor Health should be "status":"ok" . GET http://127.0.0.1:7777/ returning JSON 404 is correct for agent-only. You’re not broken. You’re disciplined. SteamOS / Desktop Mode note: Desktop Mode already has a user session, so the service starts with that session. It will not start in Game Mode unless you enable lingering loginctl enable-linger deck , needs root . On Home the machine that already finished BarkVisor setup : http://