JUP

Share USB devices across your LAN.

Plug a gamepad into a Raspberry Pi in the living room, use it from a Windows VM in the basement. Or a USB stick in the bedroom — wherever. JUP makes it a two-click operation.

Built on top of usbip, glued together with a Go agent, a Bun backend, and a tiny Vue UI.

How it works

Every machine runs the same Go agent, in one of two modes: server (exposes its USB devices) or client (can attach remote USB devices locally). A central backend coordinates which device goes where.

[RPi #1 — living room]        [RPi #2 — bedroom]
  agent (server mode)           agent (server mode)
  usbip-host                    usbip-host
  USB devices                   USB devices
          │                             │
          └──────────┐    ┌─────────────┘
                     │    │
                [JUP backend]
                (Bun + Vue UI)
                     │
          ┌──────────┼──────────┐
          │                     │
  [agent client mode]   [agent client mode]
   gaming rig            Windows VM
   vhci-hcd              usbipd-win
          │                     │
  local USB devices     local USB devices

Device detection is done via udev; when you plug something in, the UI updates in real time. Clicking "Mount" sends a WebSocket message to the target machine, which runs usbip attach and the device shows up locally — as if it were plugged in there.

Install

Download the release for your platform, install it, edit the config, start the service.

Debian / Raspberry Pi OS arm64 · amd64

jup-agent_0.2.0_arm64.deb · jup-agent_0.2.0_amd64.deb

sudo apt install ./jup-agent_0.2.0_arm64.deb
sudo nano /etc/jup/config.yaml
sudo systemctl enable --now jup-agent

Fedora / RHEL amd64 · aarch64

jup-agent-0.2.0-1.x86_64.rpm · jup-agent-0.2.0-1.aarch64.rpm

sudo dnf install ./jup-agent-0.2.0-1.x86_64.rpm
sudo nano /etc/jup/config.yaml
sudo systemctl enable --now jup-agent

Windows 10 / 11 amd64

jup-agent-0.2.0-windows-amd64.zip

# Prerequisite for client mode: install usbip-win2
# (provides the Windows USB/IP driver + usbip.exe CLI).
Expand-Archive jup-agent-0.2.0-windows-amd64.zip
cd jup-agent-0.2.0-windows-amd64
# Open PowerShell as Administrator:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\install-service.ps1
notepad C:\ProgramData\jup\config.yaml
Start-Service jup-agent

Backend linux · amd64

jup-backend-linux-x64 · single binary, bundled Bun runtime

Running the backend

The backend is a single compiled binary (bundled Bun runtime). Run it in a container, a small VM, or on a Raspberry Pi — anywhere reachable by the agents on your LAN.

# one-file binary, ~100 MB, no runtime deps
JUP_PORT=3000 JUP_WEB_DIST=./web-dist ./jup-backend

Then open http://<backend>:3000/ in a browser. No authentication in the MVP — don't expose this to the internet.

Why "janky"?

Started as a way to use a gamepad from a living-room Pi in a Windows gaming VM in the basement — which itself started as an attempt to play Subnautica in VR via ALVR on a Meta Quest 2 talking to an Intel Arc B570. As these things go.

It turns out usbip already solves the hard parts. JUP is just a coordinator that makes it nice to use.