WabiLink connects you to your own server: move files at full speed, open a terminal, reach services behind its firewall, and use its desktop with sound — from Windows, macOS or Linux.
The client logs in once; files, terminals, tunnels and the desktop all travel over that session, encrypted end to end. Only one port needs to be open.
Files go over several connections at once and are put back together, so a long or lossy link is used to the full. Transfers resume where they stopped.
Browse the server's shares like a local disk. Folders update as they change, and a file opened from the server is saved back to it.
A shell on the server, or a login over SSH, in a tab of the client — with no SSH port reachable from outside.
Reach a database, a web interface or any TCP service near the server through a local port — the administrator decides who may use which.
The server's own desktop, built in: coded on its graphics card where it has one, sharp when still, every monitor, sound in step with the picture, and a clipboard that carries text, images and files.
Your server, your accounts: per-user rights, the server's identity checked by fingerprint, and every byte encrypted. An admin tool manages it all from your desk.
Three quick choices, and you get the download and the instructions for exactly your machine. Version 1.1.6 released 6 October 2026.
The app you connect with. It comes with everything it needs: no installer, nothing else to set up.
Most PCs are x64; take ARM64 for a Snapdragon laptop or a Surface Pro X.
Right-click the downloaded .zip → Extract All…, and choose where it should
live, for example C:\Users\you\Apps. Then open the wabilink-client folder and run
WabiLink.exe.
Right-click WabiLink.exe → Pin to Start to find it again.
Click New profile and fill in the server's address (port 8009), your account and
password. The first time, WabiLink shows the server's fingerprint: compare it with what the server's
administrator got from wabilink-server identity, and accept it.
The server's desktop is decoded on your graphics card with Windows' own decoders. For HEVC install Microsoft's HEVC Video Extensions, and on Windows 10 the free AV1 Video Extension, from the Microsoft Store. Without them, WabiLink picks a codec you do have.
Close WabiLink, unpack the new .zip over the old folder, and start it again. Your profiles are kept.
Delete the folder. Profiles and settings are in %LOCALAPPDATA%\WabiLink.
Manages a WabiLink server from your desk: users and their rights, shares, the remote desktop, and the server's settings.
Most PCs are x64; take ARM64 for an ARM laptop.
Right-click the .zip → Extract All…, open the wabilink-admin
folder and run WabiLink Admin.exe. If SmartScreen warns: More info → Run anyway.
Use the server's address and its admin port, 8010, with an administrator account —
one created with user add NAME --admin on the server.
8010.Runs as a Windows service: it starts with Windows, restarts if it stops, and shows this PC's own desktop to the people you allow.
The service runs from this folder, so put it somewhere permanent. Open PowerShell as administrator (Win+X → Terminal (Admin)) and run:
Get-Item $HOME\Downloads\wabilink-server-*-windows-*.zip | Unblock-File
Expand-Archive -Path $HOME\Downloads\wabilink-server-*-windows-*.zip -DestinationPath "C:\Program Files\WabiLink"
cd "C:\Program Files\WabiLink\wabilink-server"
.\wabilink-service install --start
It runs as LocalSystem; its data and logs are in C:\ProgramData\WabiLink\Server.
.\wabilink-service status says whether it is running.
.\wabilink-service user add $env:USERNAME --admin # asks for a password, twice
.\wabilink-service share add $env:USERNAME Files C:\Users\Public
.\wabilink-service identity # the fingerprint clients will be shown
Your WabiLink account is named as your Windows account, with a password of its own; Files is the PC's Public folder. Write down the fingerprint: you will compare it the first time you connect.
Clients connect on 8009; the admin tool on 8010, which this opens to your local network only:
New-NetFirewallRule -DisplayName "WabiLink" -Direction Inbound -Protocol TCP -LocalPort 8009 -Action Allow
New-NetFirewallRule -DisplayName "WabiLink Admin" -Direction Inbound -Protocol TCP -LocalPort 8010 -RemoteAddress LocalSubnet -Action Allow
Let users see and use this PC's screen from WabiLink, in their session:
.\wabilink-service config set desktop-enabled yes
.\wabilink-service user desktop $env:USERNAME yes
That is all on Windows: with nobody logged in, the viewer shows the login screen. With a graphics card, the screen is coded on it.
.\wabilink-service stop
Expand-Archive -Path $HOME\Downloads\wabilink-server-*-windows-*.zip -DestinationPath "C:\Program Files\WabiLink" -Force
.\wabilink-service start.\wabilink-service uninstall
The data in C:\ProgramData\WabiLink\Server is kept; delete it too to remove everything.
The app you connect with. One command downloads the right version for your Mac and puts it in Applications.
Press ⌘+Space, type Terminal and press Return.
curl -fsSL https://alexander-miglis.github.io/wabilink-packages/install-macos.sh | bash -s client
It finds out whether your Mac has Apple silicon or Intel, downloads the newest WabiLink for it, checks it, and puts WabiLink in Applications. It says when it is done.
Open Applications in Finder (or Launchpad) and double-click WabiLink.
Click New profile: the server's address (port 8009), your account and password. The first
time, WabiLink shows the server's fingerprint: compare it with what the server's administrator got from
wabilink-server identity, and accept it.
H.264 and HEVC are decoded by macOS itself. For AV1, the best codec for a slow link, install dav1d with Homebrew:
brew install dav1d
Apple silicon (M1 and later) or Intel: Apple menu → About This Mac.
Open the .zip (Safari may already have) and drag WabiLink into Applications. The first time,
Control-click it → Open → Open; on macOS 15 and later, open it, then System Settings
→ Privacy & Security → Open Anyway.
Quit WabiLink and paste the same command again. Your profiles are kept.
curl -fsSL https://alexander-miglis.github.io/wabilink-packages/install-macos.sh | bash -s clientDrag WabiLink from Applications to the Bin. Settings are in ~/Library/Application Support/WabiLink.
Manages a WabiLink server's users, shares and settings.
Press ⌘+Space, type Terminal and press Return.
curl -fsSL https://alexander-miglis.github.io/wabilink-packages/install-macos.sh | bash -s admin
WabiLink Admin is then in Applications.
The server's address and admin port, 8010, with an administrator account (user add NAME --admin on the server).
Drag WabiLink Admin into Applications. The first time, Control-click it → Open → Open (on macOS 15: Privacy & Security → Open Anyway).
Runs as a service: it starts when the Mac starts, before anyone logs in, and restarts if it stops. Copy each box into Terminal as it is - nothing in them needs changing.
sudo asks for its password. Nothing shows as you type it - type it
and press Return;Press ⌘+Space, type Terminal and press Return.
curl -fsSL https://alexander-miglis.github.io/wabilink-packages/install-macos.sh | sudo bash
It downloads the newest server for your Mac, checks it, installs it in /usr/local/wabilink-server, and starts it
as a service. It ends with "… is installed, running, and starts at every boot."
Your WabiLink account, named as your Mac account, and an administrator. It asks for a password for it, twice - one for WabiLink, which may be different from the Mac's:
sudo wabilink-server user add "$USER" --admin
The Mac's shared folder, as Files:
sudo wabilink-server share add "$USER" Files /Users/Shared
macOS protects those folders: the server may read them only once allowed. System Settings →
Privacy & Security → Full Disk Access → +, press
⌘+Shift+G, paste
/usr/local/wabilink-server/wabilink-server, and turn it on. Then, for example:
sudo wabilink-server share add "$USER" Documents "$HOME/Documents"
sudo wabilink-server identity
The app shows it the first time it connects: it should be the same.
Only if the Mac's firewall is on (System Settings → Network → Firewall):
Options… → +, ⌘+Shift+G,
paste /usr/local/wabilink-server/wabilink-server, and set it to Allow incoming connections.
Other computers connect to this Mac's address, which this shows:
ipconfig getifaddr en0 || ipconfig getifaddr en1
sudo wabilink-server config set desktop-enabled yes
sudo wabilink-server user desktop "$USER" yes
Then allow it twice, once, in System Settings → Privacy & Security - in each, +,
⌘+Shift+G, paste
/usr/local/wabilink-server/wabilink-server, and turn it on:
macOS may ask by itself the first time someone connects. After an update it may need turning on again.
The same command again: the newest version, the accounts and shares kept.
curl -fsSL https://alexander-miglis.github.io/wabilink-packages/install-macos.sh | sudo bashsudo launchctl print system/com.wabilink.server | grep state
tail -n 20 /Library/Logs/WabiLink/server.logsudo wabilink-server uninstall-launchd
sudo rm -rf /usr/local/wabilink-server /usr/local/bin/wabilink-server
The accounts and settings stay in /Library/Application Support/WabiLink; delete that too to remove everything.
The app you connect with. It brings its own runtime; the system provides fonts, the display and, optionally, video decoders and sound.
sudo dnf install fontconfig libICE libSM libdav1d libavcodec-free pulseaudio-utils
The video decoders come from EPEL:
sudo dnf install epel-release
sudo dnf install fontconfig libICE libSM libdav1d pulseaudio-utils
sudo apt update
sudo apt install libfontconfig1 libice6 libsm6 pulseaudio-utils libavcodec-extra
sudo apt install libdav1d7 || sudo apt install libdav1d6
sudo pacman -S --needed fontconfig libice libsm dav1d ffmpeg libpulse
sudo zypper install fontconfig libICE6 libSM6 libdav1d7 pulseaudio-utils
Fontconfig, libICE and libSM (any desktop has them), and for the remote desktop's video dav1d
(libdav1d.so.7) and FFmpeg's libavcodec; for its sound pacat or aplay.
dav1d and libavcodec decode the remote desktop's video; without them it is sent as lossless tiles, which needs a faster link.
For a Raspberry Pi 3, 4 or 5 with the 64-bit Raspberry Pi OS take ARM64; the 32-bit system has no WabiLink app.
Most PCs are x86_64; ARM boards and laptops take ARM64. uname -m says which.
mkdir -p ~/.local/opt ~/.local/bin ~/.local/share/applications
tar -xzf ~/Downloads/wabilink-client-*-linux-*.tar.gz -C ~/.local/opt
ln -sf ~/.local/opt/wabilink-client/wabilink-client ~/.local/bin/wabilink-client
cat > ~/.local/share/applications/wabilink.desktop <<EOF
[Desktop Entry]
Type=Application
Name=WabiLink
Comment=Files, terminals, tunnels and desktop of your server
Exec=$HOME/.local/opt/wabilink-client/wabilink-client
Terminal=false
Categories=Network;FileTransfer;RemoteAccess;
EOF
WabiLink is now in your applications menu, and wabilink-client starts it from a terminal.
Click New profile: the server's address (port 8009), your account and password. Compare
the fingerprint shown the first time with the server's wabilink-server identity.
Close WabiLink and unpack the new version over the old one:
tar -xzf ~/Downloads/wabilink-client-*-linux-*.tar.gz -C ~/.local/optrm -rf ~/.local/opt/wabilink-client ~/.local/bin/wabilink-client ~/.local/share/applications/wabilink.desktopManages a WabiLink server's users, shares and settings.
sudo dnf install fontconfig libICE libSMsudo apt install libfontconfig1 libice6 libsm6sudo pacman -S --needed fontconfig libice libsmsudo zypper install fontconfig libICE6 libSM6Fontconfig, libICE and libSM: any desktop has them.
Take ARM64, for the 64-bit Raspberry Pi OS.
mkdir -p ~/.local/opt ~/.local/bin ~/.local/share/applications
tar -xzf ~/Downloads/wabilink-admin-*-linux-*.tar.gz -C ~/.local/opt
ln -sf ~/.local/opt/wabilink-admin/wabilink-admin ~/.local/bin/wabilink-admin
cat > ~/.local/share/applications/wabilink-admin.desktop <<EOF
[Desktop Entry]
Type=Application
Name=WabiLink Admin
Exec=$HOME/.local/opt/wabilink-admin/wabilink-admin
Terminal=false
Categories=Network;System;
EOF
The server's address and admin port, 8010, with an administrator account (user add NAME --admin on the server).
Installed from WabiLink's signed package repository, so it
updates with the rest of the system. It runs as a systemd service under its own wabilink account.
There are no packages for this distribution yet: the server comes as a
self-contained archive, installed as a systemd service under its own wabilink account.
curl -fsSL https://alexander-miglis.github.io/wabilink-packages/install.sh | sudo sh
This adds the repository and its signing key, then installs wabilink-server with what its optional parts
use: ssh for login terminals, the libraries of the remote desktop, and SVT-AV1 for AV1 video where the system has it.
It does not start the server yet.
It picks the 64-bit or 32-bit package by itself (Raspberry Pi 2 and later).
sudo curl -fsSLo /etc/yum.repos.d/wabilink.repo https://alexander-miglis.github.io/wabilink-packages/wabilink.repo
sudo dnf install wabilink-serversudo install -d -m 0755 /etc/apt/keyrings
sudo curl -fsSLo /etc/apt/keyrings/wabilink.asc https://alexander-miglis.github.io/wabilink-packages/wabilink.asc
echo "deb [signed-by=/etc/apt/keyrings/wabilink.asc] https://alexander-miglis.github.io/wabilink-packages/deb stable main" | sudo tee /etc/apt/sources.list.d/wabilink.list
sudo apt update && sudo apt install wabilink-serveruname -m says which: x86_64, aarch64 (ARM64) or armv7l (32-bit ARM).
It needs glibc, OpenSSL 3 and systemd from the system: sudo pacman -S --needed openssl: sudo zypper install libopenssl3.
sudo mkdir -p /opt/wabilink
sudo tar -xzf ~/Downloads/wabilink-server-*-linux-*.tar.gz -C /opt/wabilink --strip-components=1
sudo /opt/wabilink/wabilink-server install-systemd
sudo ln -sf /opt/wabilink/wabilink-server /usr/local/bin/wabilink-server
This creates the wabilink account and /var/lib/wabilink, and starts the service now and at every boot.
sudo wabilink-server user add "$USER" --admin # asks for a password, twice
sudo mkdir -p /srv/files && sudo chown wabilink: /srv/files
sudo wabilink-server share add "$USER" Files /srv/files
sudo wabilink-server identity # the fingerprint clients will be shown
The service runs as wabilink: it needs to read each share's folder, and write where people upload. For a
folder of your own, sudo setfacl -R -m u:wabilink:rwX,d:u:wabilink:rwX /path gives it access.
sudo systemctl enable --now wabilink
systemctl status wabilink shows it running; journalctl -u wabilink -f follows its log.
Clients connect on 8009. The admin tool uses 8010: open that only to where you administer from.
sudo firewall-cmd --permanent --add-port=8009/tcp
sudo firewall-cmd --reloadIf ufw is on (sudo ufw status):
sudo ufw allow 8009/tcpThere is no firewall on by default. If you set one up with nftables or iptables, allow TCP 8009.
If a firewall is on (firewalld, ufw, nftables), allow TCP 8009.
sudo wabilink-server config set desktop-enabled yes
sudo wabilink-server user desktop "$USER" yes
Viewers see the session of whoever is logged in at the machine - locked or not, as on its monitor; unlock it from the viewer.
sudo wabilink-server desktop-setup "$USER"
starts a locked headless GNOME session for you at every boot.sudo wabilink-server config set desktop-user "$USER".sudo raspi-config → Advanced Options → Wayland → X11. The screen is sent as lossless tiles.With the system's updates:
sudo dnf upgrade --refreshA running server restarts by itself.
With the system's updates:
sudo apt update && sudo apt upgradeA running server restarts by itself.
sudo tar -xzf ~/Downloads/wabilink-server-*-linux-*.tar.gz -C /opt/wabilink --strip-components=1
sudo systemctl restart wabilinksudo dnf remove wabilink-serverThe data in /var/lib/wabilink is kept.
sudo apt remove wabilink-serverThe data in /var/lib/wabilink is kept.
sudo wabilink-server uninstall-systemd
sudo rm -rf /opt/wabilink /usr/local/bin/wabilink-serverThe data in /var/lib/wabilink is kept.
Every download is listed with its SHA-256 in SHA256SUMS. The Linux packages and repositories are signed with wabilink.asc.
To check a download, in the folder it is in:
curl -fsSLO https://alexander-miglis.github.io/wabilink-packages/files/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS # macOS: shasum -a 256 --ignore-missing -c SHA256SUMS
The signing key's fingerprint: 2C9F6909A29FC1FE2F957F7FACBA86055D3EBAD2