Use this guide when you want to run orca serve on a Linux machine without a
desktop session, such as an Ubuntu VPS or a remote build box.
orca serve starts the Orca runtime without opening the desktop window. On
Linux, the packaged AppImage still needs the libraries that Electron expects at
startup. Current Orca builds can start Xvfb automatically for orca serve when
no DISPLAY is set, but Xvfb must be installed first. When DISPLAY is set,
Orca uses that display instead of starting a competing Xvfb process.
Install the AppImage runtime dependency and Xvfb:
sudo apt-get update
sudo apt-get install -y curl libfuse2 xvfbDownload and make the AppImage executable:
sudo mkdir -p /opt/orca
sudo curl -L https://github.com/stablyai/orca/releases/latest/download/orca-linux.AppImage \
-o /opt/orca/orca-linux.AppImage
sudo chmod +x /opt/orca/orca-linux.AppImageIf Xvfb was installed somewhere other than /usr/bin, confirm systemd can
find it later:
command -v XvfbStart with a foreground run before creating a service:
LIBGL_ALWAYS_SOFTWARE=1 /opt/orca/orca-linux.AppImage serve --port 6768For remote clients, pass the address they should use to reach this server. A Tailscale address is usually the safest option for private servers:
LIBGL_ALWAYS_SOFTWARE=1 /opt/orca/orca-linux.AppImage serve \
--port 6768 \
--pairing-address 100.64.1.20The command prints the runtime endpoint and pairing URL. Stop it with Ctrl+C.
Create a dedicated service user and install directory. Run the service as this user instead of root so the AppImage can keep Chromium's sandbox enabled.
sudo useradd --system --create-home --shell /usr/sbin/nologin orca
sudo chown -R orca:orca /opt/orcaFor most hosts, one orca serve service is enough because Orca starts Xvfb on
display :99 when no display exists:
# /etc/systemd/system/orca-serve.service
[Unit]
Description=Orca runtime server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=orca
WorkingDirectory=/home/orca
Environment=LIBGL_ALWAYS_SOFTWARE=1
ExecStart=/opt/orca/orca-linux.AppImage serve --port 6768 --pairing-address 100.64.1.20
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetReplace 100.64.1.20 with the LAN, Tailscale, tunnel, or public hostname that
clients should use.
Enable the service:
sudo systemctl daemon-reload
sudo systemctl enable --now orca-serve.service
sudo journalctl -u orca-serve.service -fIf you prefer to own the virtual display lifecycle in systemd, run Xvfb as a
separate service and set DISPLAY=:99 for Orca.
# /etc/systemd/system/orca-xvfb.service
[Unit]
Description=Virtual X display for Orca
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/Xvfb :99 -screen 0 1280x1024x24 -nolisten tcp
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetIf command -v Xvfb returned a different path, update ExecStart to that
absolute path.
Then add the display dependency to the Orca service:
# /etc/systemd/system/orca-serve.service
[Unit]
Description=Orca runtime server
After=network-online.target orca-xvfb.service
Wants=network-online.target orca-xvfb.service
[Service]
Type=simple
User=orca
WorkingDirectory=/home/orca
Environment=DISPLAY=:99
Environment=LIBGL_ALWAYS_SOFTWARE=1
ExecStart=/opt/orca/orca-linux.AppImage serve --port 6768 --pairing-address 100.64.1.20
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetEnable both units:
sudo systemctl daemon-reload
sudo systemctl enable --now orca-xvfb.service orca-serve.serviceOn a headless host, you do not need to open the desktop UI just to run the server. Invoke the AppImage directly:
/opt/orca/orca-linux.AppImage serve --helpIf you later install the desktop CLI from Orca settings, use that CLI for normal shell workflows. Keep the AppImage path in systemd so service restarts do not depend on an interactive shell profile.
dlopen(): error loading libfuse.so.2: installlibfuse2.Missing X server or $DISPLAY: installxvfb, or start the managed Xvfb service and setDISPLAY=:99.Xvfb not found: confirmcommand -v Xvfband use that absolute path in the systemd unit.- GPU or DRI warnings on a VPS: keep
LIBGL_ALWAYS_SOFTWARE=1in the service environment. - Chromium sandbox errors: confirm the service is running as the non-root
orcauser and that/opt/orcais readable by that user. - Clients cannot connect: make sure
--pairing-addressis an address reachable from the client, and make sure firewalls allow the selected--port. - Diagnosing other missing libraries: extract the AppImage without launching it
with
./orca-linux.AppImage --appimage-extract, then runldd squashfs-root/orcato list any shared libraries the host is missing.