WabiLink

WabiLink by WabiOne

Your files, terminals and desktop — over one fast, encrypted link.

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.

Version 1.1.28, released 7 November 2026Windows, macOS and Linuxx86_64 and ARM, Raspberry Pi includedNothing else to install

Who it's for

One app and one encrypted link to every machine you run — at home, for a team, or for the people you help.

Homelab

All your machines, from one app

A server, a few Raspberry Pis, a NAS, a database: each one a card in the app, with its files, a terminal, its desktop and the services behind it.

  • Wakes a machine that is asleep, with Wake-on-LAN
  • Reach services behind it through a tunnel, with no ports opened for them
  • Let an AI assistant such as Claude Code run commands and manage users and shares, through wabilink mcp
Developers and teams

Access to production, without handing out passwords

The database credentials stay on the server. Each person is given a level on each connection — read, write, schema or admin — and the password never reaches their machine.

  • Every database statement and every refusal logged: who, from where, what kind, how it went
  • Terminals, tunnels and the desktop given one person at a time
  • Turn off on a server whatever it should not offer, with one command
IT support

Help someone at their own screen

With the WabiLink server on the machines you look after, see and use their desktop — every monitor, with sound and a shared clipboard — and fix what you find in a terminal or by moving a file.

  • On Linux, the person at the screen is asked before you see their session
  • Reach the login screen of a machine nobody is signed in to
  • Wake a machine that is asleep before you connect

One connection, everything on your server

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.

Fast transfers

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.

Shares and live folders

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.

Terminals

A shell on the server, or a login over SSH, in a tab of the client — with no SSH port reachable from outside.

Tunnels

Reach a database, a web interface or any TCP service near the server through a local port — the administrator decides who may use which.

Remote desktop, at 60–120 fps

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.

Yours, and secure

Your server, your accounts: per-user rights, the server's identity checked by fingerprint, and every byte encrypted. The same app manages it all from your desk.

Get WabiLink

Three quick choices, and you get the download and the instructions for exactly your machine. Version 1.1.28 released 7 November 2026.

1Which system is it for?

WabiLink for Windows

Version 1.1.28

The app you connect with. It comes with everything it needs: no installer, nothing else to set up.

  1. Download it

    Most PCs are x64; take ARM64 for a Snapdragon laptop or a Surface Pro X.

  2. Unpack it

    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.

    Windows protected your PC? WabiLink is not yet known to SmartScreen. Click More info → Run anyway. It asks only the first time.
  3. Connect

    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.

    A server you administer: Server settings, on its card, opens its users, shares and settings, through its admin port (8010). On a PC that runs the server itself, This PC's server, at the top, opens its settings on the spot.

  4. Video for the remote desktop optional

    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.

  5. From the command line optional

    The folder also has wabilink-cli.exe: what the app does, from PowerShell or a script - files, a terminal on the server, tunnels, and the server's desktop (it opens the app's viewer). It uses the app's saved accounts. To type wabilink-cli anywhere, add the folder to your PATH once (the folder you unpacked to):

    [Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";$HOME\Apps\wabilink-client", "User")

    Then, in a new window:

    wabilink-cli profile add work --host server.example.com --user you
    wabilink-cli terminal -p work          # a shell on the server; Enter then ~. leaves one that hangs
    wabilink-cli get -p work -r /Files/project .
    wabilink-cli help

Updating

Close WabiLink, unpack the new .zip over the old folder, and start it again. Your profiles are kept.

Removing

Delete the folder. Profiles and settings are in %LOCALAPPDATA%\WabiLink.

WabiLink Setup for Windows

Version 1.1.28

Installs the WabiLink server on this PC, so others can reach it, and the WabiLink app to manage it. It walks you through setting the server up, and then keeps it up to date by itself. Run it on the PC that will be the server.

  1. Download WabiLink Setup

    The same file works on every Windows 10 and 11 PC, x64 or ARM. While it installs, it downloads the rest (about 110 MB) for this PC, so the PC needs internet.

  2. Open it

    Open the downloaded file. Two things may come first:

    • Windows protected your PC: WabiLink Setup is new to Windows' SmartScreen. Click More info, then Run anyway.
    • Do you want to allow this app to make changes? Click Yes: installing a server needs administrator rights. If you are not an administrator on this PC, Windows asks for an administrator's name and password here.

    Setup opens, and says what it will install. Click Next.

  3. Choose the account the server runs as

    Not sure? Keep the first one.

    • This PC's system account (recommended): everything works, with shared folders anywhere on the PC, terminals and the desktop.
    • An account of its own: safer, because the server can only reach the folders you share with it.
    • A Windows account: the server can reach what that account can, such as its network drives. Type its name and password.

    Click Install. Setup installs the server, opens the firewall for it, and adds the WabiLink app to the Start menu. This takes a minute or two.

  4. Choose who may use it

    Setup then asks how people get access. Pick one; you can switch later.

    • Online, with WabiOne: you manage people and their access in WabiOne's console, in your browser, and they sign in with their WabiOne account. In the console at app.wabione.com, go to Servers → Add server → Get code, type the code into setup, and click Register. Then add people in the console, under People.
    • Offline, on this PC: nothing is sent to WabiOne. Choose a name and password for your own WabiLink account, and a folder to share (the PC's Public folder, unless you pick another), and click Create. Setup then shows the server's fingerprint: note it, to check the first time you connect.

    Or click Skip, and do it later in the WabiLink app, under This PC's server, or by running setup again.

  5. Connect from another computer

    Install the WabiLink app on the computer you connect from (it is there for macOS and Linux too), then:

    • Online: click Sign in at the top right, with your WabiOne account. The server is listed, ready to connect, from anywhere: usually there is nothing to set up on your router.
    • Offline: click New profile and type this PC's address (setup's last page shows it), port 8009, and your account and password. The first time, compare the fingerprint the app shows with the one you noted. To connect from outside your network, forward TCP 8009 on your router to this PC. Never forward 8010.

Updating

Nothing to do: it installs a newer version by itself, at night between 03:00 and 05:00 (how). To update at once, run setup again and click Update.

Removing

Settings → Apps → WabiLink Server → Uninstall. Its users, settings and identity are kept, for when it is installed again, unless you tick the box to delete them too.

No desktop, or no internet

Windows Server Core has no desktop for setup: install the server by hand, in PowerShell. A PC with no internet: on another computer, download the server's zip and the app's for that PC (x64 or ARM64), and put them in the same folder as setup before you open it. For IT: setup with no window.

WabiLink Server for Windows

Version 1.1.28

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 easy way: WabiLink Setup. One download that installs the server and the WabiLink app, opens the firewall, and asks who may use the server: everything on this page, in a few clicks. It keeps the server up to date too. What it asks, step by step.

Or install it by hand, in PowerShell

For Windows Server Core, which has no desktop for setup's window, or to see each step. Used WabiLink Setup? Skip to Optional: this PC's desktop below.

  1. Download it and unpack it where it will stay

    The service runs from this folder, so put it somewhere permanent. Open PowerShell as administrator (Win+X → Terminal (Admin)) and run:

    $arch = if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { 'arm64' } else { 'x64' }
    $dl = "C:\Program Files\WabiLink\.download"
    New-Item -ItemType Directory -Force $dl | Out-Null
    curl.exe -fLo "$dl\wabilink-server.zip" "https://link.wabione.com/files/wabilink-server-1.1.28-windows-$arch.zip"
    curl.exe -fLo "$dl\SHA256SUMS" "https://link.wabione.com/files/SHA256SUMS"
    $listed = (Select-String -Path "$dl\SHA256SUMS" -Pattern "^([0-9a-f]{64}) [ *]wabilink-server-1.1.28-windows-$arch\.zip$").Matches[0].Groups[1].Value
    if ((Get-FileHash "$dl\wabilink-server.zip" -Algorithm SHA256).Hash -ne $listed) { throw "The download is not the file SHA256SUMS lists: do not unpack it." } else { Expand-Archive "$dl\wabilink-server.zip" -DestinationPath "C:\Program Files\WabiLink" }
    Remove-Item -Recurse -Force $dl
    cd "C:\Program Files\WabiLink\wabilink-server"

    It takes the x64 or ARM64 build, as this PC is, and unpacks it only if it is the file the site's SHA256SUMS lists. Both are downloaded into the program's own folder, which only administrators can change, not into TEMP, where a program of yours could swap the zip between its check and its unpacking. That list is signed with WabiLink's release key (SHA256SUMS.asc); with gpg installed, gpg --verify SHA256SUMS.asc SHA256SUMS checks it too, against key 2C9F 6909 A29F C1FE 2F95 7F7F ACBA 8605 5D3E BAD2. WabiLink Setup checks both by itself. With no internet on the PC, download it here instead, check it the same way (Get-FileHash against the line for it in SHA256SUMS), right-click it → Properties → Unblock, and unpack it to C:\Program Files\WabiLink:

  2. Install and start the service

    .\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.

  3. Open the firewall

    Clients connect on 8009; Server settings, in the app, 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

Set it up

Decide who may use the server, and what they get. Pick one of the two ways; you can switch later, and unregistering from WabiOne brings back the settings the server had before.

Pick one to see its steps.

  1. Get a code from WabiOne

    Sign in to WabiOne's console at app.wabione.com (no account yet? Create one: it makes your organization). Then Servers → Add server, a name if you like (otherwise this PC's name), and Get code. The code works once, for 15 minutes. From a script or a CI pipeline, with no code to copy, an API token that may register servers registers it instead.

  2. Register this PC with it

    In the same PowerShell, in the server's folder, with the code from the console:

    .\wabilink-service register K7M2-QX9P-4HRT

    The console says Registered, and within seconds the server is online there. .\wabilink-service home shows the organization and the connection.

  3. Give people access, in the console

    On the server's page: People → Add person for each person of your organization who may use it, with their shares; Terminals and desktop, Tunnels and Databases for the rest. Changes reach the server within seconds.

  4. Connect

    In the WabiLink app, Sign in at the top right, with your WabiOne account: your organization's servers appear, ready to connect. There is no address, password or fingerprint to type: WabiOne vouches for the server.

    From outside this PC's network, nothing needs forwarding on the router: WabiOne's rendezvous introduces the app to the server. A few networks (some mobile and carrier networks) don't let that through; from those, forward TCP 8009 to this PC.

WabiOne manages it from now on. On this PC, commands that change its settings are refused, saying so, and the WabiLink app shows them read-only. Its secrets, such as database passwords, stay on the PC. .\wabilink-service unregister takes it back, with the server's own settings as they were.
  1. Add yourself and a share

    .\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.

  2. Connect

    In the WabiLink app, New profile: this PC's address (ipconfig shows it), port 8009, your account and password. Compare the fingerprint it shows the first time with the one above, and accept it.

    To reach it from outside your network, forward TCP 8009 on your router to this PC. Never forward 8010.

  3. Everything else

    More people and their rights, groups, tunnels, databases and every setting: with .\wabilink-service here, or from your desk with Server settings, in the app (port 8010, your account).

Optional: this PC's desktop

Let people see and use this PC's screen from WabiLink, in their session. In PowerShell as administrator, in the server's folder (cd "C:\Program Files\WabiLink\Server" if WabiLink Setup installed it), with the name of each WabiLink account that may use it:

.\wabilink-service config set desktop-enabled yes
.\wabilink-service user desktop $env:USERNAME yes

With WabiOne, turn it on in the console instead: Terminals and desktop, and the desktop for each person under People. The rest is the same either way.

That is all it takes on Windows. Viewers see this PC's own screen, UAC prompts included. With nobody signed in - after a restart, or a server with no one at it - it is the login screen, and you sign in from the viewer as at the machine: the viewer's Ctrl+Alt+Del button (the keyboard icon), then a Windows account's password. Where the lock screen asks for no Ctrl+Alt+Del - Windows 11 and 10 by default - press Space or click, as at the PC.

A session the viewer found at the login or lock screen and signed in to is locked again when the last viewer has gone, so it is not left open on the PC's monitor; one that was already open - someone at the PC, being helped - is left as it was. To leave it open instead: .\wabilink-service config set desktop-lock-on-leave no (with WabiOne, in the console). Signing in to an account with a disconnected session brings that session to the screen; the viewer follows it.

For the Ctrl+Alt+Del button, WabiLink lets services send Ctrl+Alt+Del (the SoftwareSASGeneration policy), as remote-support tools do; turning the desktop on sets it, and says so. With a graphics card (NVIDIA, AMD, Intel), the screen is coded on it, at 60 frames a second and more.

This is the PC's own screen, not a Remote Desktop session: someone connected by Remote Desktop is not seen (the screen shows the login screen meanwhile), and signing in as them from the viewer takes their session over and ends their Remote Desktop connection. For a separate session, give yourself a WabiLink tunnel to the PC's Remote Desktop and connect a Remote Desktop app of your own through it.

Is it running?

In the server's folder:

.\wabilink-service status

Its log is in C:\ProgramData\WabiLink\Server\logs; warnings and errors also go to the Application event log, as WabiLink.

Updating

Installed with WabiLink Setup: nothing to do, it updates itself at night (how). Installed by hand, in the server's folder:

$arch = if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { 'arm64' } else { 'x64' }
$dl = "C:\Program Files\WabiLink\.download"
New-Item -ItemType Directory -Force $dl | Out-Null
curl.exe -fLo "$dl\wabilink-server.zip" "https://link.wabione.com/files/wabilink-server-1.1.28-windows-$arch.zip"
curl.exe -fLo "$dl\SHA256SUMS" "https://link.wabione.com/files/SHA256SUMS"
$listed = (Select-String -Path "$dl\SHA256SUMS" -Pattern "^([0-9a-f]{64}) [ *]wabilink-server-1.1.28-windows-$arch\.zip$").Matches[0].Groups[1].Value
if ((Get-FileHash "$dl\wabilink-server.zip" -Algorithm SHA256).Hash -ne $listed) { throw "The download is not the file SHA256SUMS lists: do not unpack it." } else { .\wabilink-service stop; Expand-Archive "$dl\wabilink-server.zip" -DestinationPath "C:\Program Files\WabiLink" -Force; .\wabilink-service start }
Remove-Item -Recurse -Force $dl

Removing

Installed with WabiLink Setup: Settings → Apps → WabiLink Server → Uninstall. Installed by hand:

.\wabilink-service uninstall

Either way the data in C:\ProgramData\WabiLink\Server is kept, unless you delete it too.

WabiLink for macOS

Version 1.1.28

The app you connect with. One command downloads the right version for your Mac and puts it in Applications.

You need: macOS 13 (Ventura) or later, and an administrator account on the Mac (the one you set it up with usually is).
  1. Open Terminal

    Press ⌘+Space, type Terminal and press Return.

  2. Copy these, paste them into Terminal, and press Return

    curl -fsSLO https://link.wabione.com/install-macos.sh
    bash install-macos.sh client

    The first downloads the install script, the second runs it. 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.

  3. Open WabiLink

    Open Applications in Finder (or Launchpad) and double-click WabiLink.

  4. Connect

    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.

    A server you administer: Server settings, on its card, opens its users, shares and settings, through its admin port (8010).

  5. AV1 video optional

    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
  6. From the command line optional

    WabiLink brings its command-line client along: what the app does, from Terminal or a script - files, a terminal on the server, tunnels, and the server's desktop (it opens the app's viewer), with the app's saved accounts. The install command makes it wabilink where it can; otherwise it prints the one command that does:

    sudo mkdir -p /usr/local/bin && sudo ln -sf /Applications/WabiLink.app/Contents/MacOS/wabilink-cli /usr/local/bin/wabilink
    wabilink profile add work --host server.example.com --user you
    wabilink terminal -p work              # a shell on the server; Enter then ~. leaves one that hangs
    wabilink help
Or download it yourself

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.

Updating

Quit WabiLink and paste the same commands again. Your profiles are kept.

curl -fsSLO https://link.wabione.com/install-macos.sh
bash install-macos.sh client

Removing

Drag WabiLink from Applications to the Bin. Settings are in ~/Library/Application Support/WabiLink.

WabiLink Server for macOS

Version 1.1.28

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.

You need:
  • macOS 13 (Ventura) or later, Apple silicon or Intel;
  • an administrator account on the Mac: sudo asks for its password. Nothing shows as you type it - type it and press Return;
  • for others to reach it, the Mac on and awake: System Settings → Energy (or Battery → Options) → Prevent automatic sleeping when the display is off.

Install it

  1. Open Terminal

    Press ⌘+Space, type Terminal and press Return.

  2. Install the server

    curl -fsSLO https://link.wabione.com/install-macos.sh
    sudo bash install-macos.sh

    The first command downloads the install script; read it if you like (less install-macos.sh) before the second runs it. 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." From then on it updates itself at night (updates).

  3. Let other computers in

    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. On a Mac your organisation manages, its firewall may be theirs to set: ask them to allow the server.

Set it up

Who may use it, and what they get. Pick one way; you can move to the other later: registered with WabiOne, the server starts from what it already had, and unregistered, it gets that back.

Pick one to see its steps.

  1. Get a code from WabiOne

    Sign in to WabiOne's console at app.wabione.com (no account yet? Create one: it makes your organization). Then Servers → Add server, a name if you like (otherwise the Mac's name), and Get code. The code works once, for 15 minutes. From a script or a CI pipeline, with no code to copy, an API token that may register servers registers it instead.

  2. Register this Mac with it

    In Terminal, with the code from the console:

    sudo wabilink-server register K7M2-QX9P-4HRT

    The console says Registered, and within seconds the server is online there. sudo wabilink-server home shows the organization and the connection.

  3. Give people access, in the console

    On the server's page: People → Add person for each person of your organization who may use it, with their shares; Terminals and desktop, Tunnels and Databases for the rest. Changes reach the server within seconds.

    A share is a folder of this Mac. macOS protects Documents, Desktop and Downloads: for a share in one of them, give the server Full Disk Access (System Settings → Privacy & Security → Full Disk Access → +, ⌘+Shift+G, paste /usr/local/wabilink-server/wabilink-server, and turn it on).

  4. Connect

    In the WabiLink app, Sign in at the top right, with your WabiOne account: your organization's servers appear, ready to connect. There is no address, password or fingerprint to type: WabiOne vouches for the server.

    From outside the Mac's network, nothing needs forwarding on the router: WabiOne's rendezvous introduces the app to the server. A few networks (some mobile and carrier networks) don't let that through; from those, forward TCP 8009 to the Mac.

WabiOne manages it from now on. On the Mac, commands that change its settings are refused, saying so, and the WabiLink app shows them read-only. Its secrets, such as database passwords, stay on the Mac. sudo wabilink-server unregister takes it back, with the server's own settings as they were.
  1. Make yourself an account

    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
  2. Share a folder

    The Mac's shared folder, as Files:

    sudo wabilink-server share add "$USER" Files /Users/Shared
    Sharing your Documents, Desktop or Downloads instead

    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"
  3. Note the server's fingerprint

    sudo wabilink-server identity

    The app shows it the first time it connects: it should be the same.

  4. Connect

    In the WabiLink app, New profile: this Mac's address, port 8009, your account and password; compare the fingerprint, and accept it. The address:

    ipconfig getifaddr en0 || ipconfig getifaddr en1

    To reach it from outside your network, forward TCP 8009 on your router to the Mac. Never forward 8010.

  5. Everything else

    More people and their rights, groups, tunnels, databases and every setting: with sudo wabilink-server here, or from your desk with Server settings, in the app (port 8010, your account).

Optional: this Mac's desktop

sudo wabilink-server config set desktop-enabled yes
sudo wabilink-server user desktop "$USER" yes

With WabiOne, turn it on in the console instead: Terminals and desktop, and the desktop for each person under People. The rest is the same either way.

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:

  • Screen & System Audio Recording — to show the screen;
  • Accessibility — for the keyboard and the pointer.

macOS may ask by itself the first time someone connects. After an update it may need turning on again.

With nobody logged in, viewers see the login window and sign in from it as at the Mac: the account, then its password. A session the viewer found at the login window or locked is locked again when the last viewer has gone; one already open is left as it was. To leave it open instead: sudo wabilink-server config set desktop-lock-on-leave no (with WabiOne, in the console). With FileVault on, a restarted Mac waits at FileVault's unlock screen before macOS starts: sign in at the Mac once, or restart it with sudo fdesetup authrestart.

Updating

Nothing to do: it updates itself at night (how). To update at once, the same commands again; the accounts and shares are kept.

curl -fsSLO https://link.wabione.com/install-macos.sh
sudo bash install-macos.sh

Is it running?

sudo launchctl print system/com.wabilink.server | grep state
tail -n 20 /Library/Logs/WabiLink/server.log

Removing

sudo 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.

WabiLink for Linux

Version 1.1.28

The app you connect with. It brings its own runtime; the system provides fonts, the display and, optionally, video decoders and sound.

  1. Install what it uses from the system

    sudo dnf install fontconfig libICE libSM libicu libdav1d libavcodec-free pulseaudio-utils 'libssl.so.3()(64bit)'

    The last one is OpenSSL 3, which the app needs. Fedora 44 and older already have it; from Fedora 45 it is openssl3-libs, next to OpenSSL 4.

    The video decoders come from EPEL:

    sudo dnf install epel-release
    sudo dnf install fontconfig libICE libSM libicu libdav1d pulseaudio-utils
    sudo apt update
    sudo apt install libfontconfig1 libice6 libsm6 pulseaudio-utils libavcodec-extra
    sudo apt install libicu76 || sudo apt install libicu74 || sudo apt install libicu72
    sudo apt install libdav1d7 || sudo apt install libdav1d6
    sudo pacman -S --needed fontconfig libice libsm icu dav1d ffmpeg libpulse
    sudo zypper install fontconfig libICE6 libSM6 'libicu??' libdav1d7 pulseaudio-utils

    Fontconfig, libICE, libSM and ICU (libicu, which .NET needs), 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.

    On Arch, for now: its FFmpeg (9) is newer than WabiLink reads, so the remote desktop's video comes as AV1 (dav1d) where the server can send it, and as lossless tiles otherwise.

    openSUSE's own FFmpeg decodes no H.264 or HEVC; dav1d decodes AV1. For all three, FFmpeg from the Packman repository (see the server's instructions).

  2. Download it

    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.

  3. Install it for yourself, with a menu entry

    mkdir -p ~/.local/opt ~/.local/bin ~/.local/share/applications
    tar -xzf ~/Downloads/wabilink-client-1.1.28-linux-*.tar.gz -C ~/.local/opt
    ln -sf ~/.local/opt/wabilink-client/wabilink-client ~/.local/bin/wabilink-client
    ln -sf ~/.local/opt/wabilink-client/wabilink-cli ~/.local/bin/wabilink
    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; wabilink is its command-line client.

  4. Connect

    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.

    A server you administer: Server settings, on its card, opens its users, shares and settings, through its admin port (8010).

  5. From the command line optional

    wabilink does what the app does, from a terminal or a script - files, a terminal on the server, tunnels, and the server's desktop (it opens the app's viewer) - with the app's saved accounts. If wabilink is not found, log in again: ~/.local/bin is on the PATH from the next login.

    wabilink profile add work --host server.example.com --user you
    wabilink terminal -p work              # a shell on the server; Enter then ~. leaves one that hangs
    wabilink tunnel -p work db --local-port 5432
    wabilink help

Updating

Close WabiLink and unpack the new version over the old one:

tar -xzf ~/Downloads/wabilink-client-1.1.28-linux-*.tar.gz -C ~/.local/opt

Removing

rm -rf ~/.local/opt/wabilink-client ~/.local/bin/wabilink-client ~/.local/bin/wabilink ~/.local/share/applications/wabilink.desktop

WabiLink Server for Linux

Version 1.1.28

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, which the install script puts in /opt/wabilink and runs as a systemd service under its own wabilink account. The same command updates it.

On AWS? A user data script installs and sets up the server when an EC2 instance first boots: see WabiLink on AWS.

Install it

  1. Install it

    curl -fsSLO https://link.wabione.com/install.sh
    sudo sh install.sh

    The first command downloads the install script; read it if you like (less install.sh) before the second runs it. It 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).

    Or add the repository by hand
    sudo curl -fsSLo /etc/pki/rpm-gpg/RPM-GPG-KEY-wabilink https://link.wabione.com/wabilink.asc
    gpg --show-keys /etc/pki/rpm-gpg/RPM-GPG-KEY-wabilink
    sudo curl -fsSLo /etc/yum.repos.d/wabilink.repo https://link.wabione.com/wabilink.repo
    sudo dnf install wabilink-server

    The second command shows what is in the key file: go on only if it shows one key (one pub line), and its fingerprint is 2C9F6909A29FC1FE2F957F7FACBA86055D3EBAD2. A file with another key in it, or a second one, is not WabiLink's alone. The repository then checks every package against that file, never a key fetched again later; and the server's own updates check against the key it carries, whatever the file holds.

    sudo install -d -m 0755 /etc/apt/keyrings
    sudo curl -fsSLo /etc/apt/keyrings/wabilink.asc https://link.wabione.com/wabilink.asc
    gpg --show-keys /etc/apt/keyrings/wabilink.asc
    echo "deb [signed-by=/etc/apt/keyrings/wabilink.asc] https://link.wabione.com/deb stable main" | sudo tee /etc/apt/sources.list.d/wabilink.list
    sudo apt update && sudo apt install wabilink-server

    The third command shows what is in the key file: go on only if it shows one key (one pub line), and its fingerprint is 2C9F6909A29FC1FE2F957F7FACBA86055D3EBAD2. apt then checks WabiLink's packages against that file alone; and the server's own updates write the key it carries over it.

  2. Install what it uses from the system

    The server brings its own runtime. From the system it needs OpenSSL 3, and for its optional parts: ssh for login terminals, the X11 and PipeWire libraries for this machine's desktop, pacat for its sound, and FFmpeg and SVT-AV1 for video. The packages for other distributions bring these by themselves; here, install them once:

    sudo pacman -S --needed openssl openssh libx11 libxext libxtst libxfixes libxrandr pipewire libpulse
    sudo zypper install libopenssl3 openssh-clients libX11-6 libXext6 libXtst6 libXfixes3 libXrandr2 libpipewire-0_3-0 pulseaudio-utils libavcodec62

    glibc, OpenSSL 3 (libssl.so.3) and systemd; for the optional parts ssh, libX11, libXext, libXtst, libXfixes, libXrandr, libpipewire-0.3, pacat, FFmpeg's libavcodec.so.59 to .62, and SVT-AV1 2.0 to 3.x (libSvtAv1Enc.so.2 or .3).

    Video coding on Arch, for now: Arch's FFmpeg (9) and SVT-AV1 (4) are newer than this server reads, so this machine's desktop is sent as lossless tiles: sharp, but it needs a fast link (a home network is fine). Files, terminals and tunnels are not affected.
    Video on openSUSE: its own FFmpeg codes only AV1 on the graphics card (NVIDIA RTX 40 and later, AMD RX 7000 and later, Intel Arc), and its SVT-AV1 (4) is newer than this server reads. Other machines send the desktop as lossless tiles, which need a fast link. For H.264 and HEVC from any recent graphics card, use FFmpeg from the Packman repository (a community repository, not openSUSE's own):
    sudo zypper ar -cfp 90 https://ftp.gwdg.de/pub/linux/misc/packman/suse/openSUSE_Tumbleweed/ packman
    sudo zypper dup --from packman --allow-vendor-change
    On Leap, use openSUSE_Leap_15.6 in place of openSUSE_Tumbleweed.
  3. Install it

    curl -fsSLO https://link.wabione.com/install.sh
    sudo sh install.sh

    The first command downloads the install script; read it if you like (less install.sh) before the second runs it. It downloads the newest server for this machine's processor (x86_64, ARM64 or 32-bit ARM), checks it against the published checksums, and puts it in /opt/wabilink. It creates the wabilink account and /var/lib/wabilink, the systemd service, and the agent for this machine's desktop. It does not start the server yet. wabilink-server version says which version is installed.

    Or install the archive by hand

    uname -m says which: x86_64, aarch64 (ARM64) or armv7l (32-bit ARM).

    Check it first: the list of checksums, signed with WabiLink's release key, and the archive against it.

    cd ~/Downloads
    curl -fsSLO https://link.wabione.com/files/SHA256SUMS
    curl -fsSLO https://link.wabione.com/files/SHA256SUMS.asc
    curl -fsSL https://link.wabione.com/wabilink.asc | gpg --import
    gpg --verify SHA256SUMS.asc SHA256SUMS
    sha256sum --ignore-missing -c SHA256SUMS

    gpg should say Good signature, from key 2C9F 6909 A29F C1FE 2F95 7F7F ACBA 8605 5D3E BAD2, and sha256sum OK for the archive. Anything else: do not install it.

    sudo mkdir -p /opt/wabilink
    sudo tar --no-same-owner -xzf ~/Downloads/wabilink-server-1.1.28-linux-$(uname -m).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 starts the service now and at every boot. --no-same-owner makes the files root's: without it, tar run as root keeps whatever account the archive names, and that account could change the server. Set up the desktop agent by hand too (this machine's desktop, below). To update, run the install script: it takes over an install made by hand.

  4. Start it

    sudo systemctl enable --now wabilink

    It starts now and at every boot, and updates itself at night (updates). systemctl status wabilink shows it running; journalctl -u wabilink -f follows its log.

  5. Open the firewall

    Clients connect on 8009. Server settings, in the app, use 8010: open that only to where you administer from - below, the local network 192.168.1.0/24; put in yours (ip -4 addr shows it).

    sudo firewall-cmd --permanent --add-port=8009/tcp
    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="8010" protocol="tcp" accept'
    sudo firewall-cmd --reload

    If ufw is on (sudo ufw status):

    sudo ufw allow 8009/tcp
    sudo ufw allow from 192.168.1.0/24 to any port 8010 proto tcp

    There is no firewall on by default. If you set one up with nftables or iptables, allow TCP 8009, and 8010 from your own network only.

    If a firewall is on (firewalld, ufw, nftables), allow TCP 8009, and 8010 from your own network only; the firewalld and ufw commands are as on Fedora and Ubuntu.

Set it up

Who may use it, and what they get. Pick one way; you can move to the other later: registered with WabiOne, the server starts from what it already had, and unregistered, it gets that back.

Pick one to see its steps.

  1. Get a code from WabiOne

    Sign in to WabiOne's console at app.wabione.com (no account yet? Create one: it makes your organization). Then Servers → Add server, a name if you like (otherwise the machine's host name), and Get code. The code works once, for 15 minutes. From a script or a CI pipeline, with no code to copy, an API token that may register servers registers it instead.

  2. Register this machine with it

    With the code from the console:

    sudo wabilink-server register K7M2-QX9P-4HRT

    The console says Registered, and within seconds the server is online there. sudo wabilink-server home shows the organization and the connection.

  3. Give people access, in the console

    On the server's page: People → Add person for each person of your organization who may use it, with their shares; Terminals and desktop, Tunnels and Databases for the rest. Changes reach the server within seconds.

    A share is a folder of this machine, and the server 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; sudo wabilink-server share check says which shares' folders it cannot use.

  4. Connect

    In the WabiLink app, Sign in at the top right, with your WabiOne account: your organization's servers appear, ready to connect. There is no address, password or fingerprint to type: WabiOne vouches for the server.

    From outside this machine's network, nothing needs forwarding on the router: WabiOne's rendezvous introduces the app to the server. A few networks (some mobile and carrier networks) don't let that through; from those, forward TCP 8009 to this machine.

WabiOne manages it from now on. On this machine, commands that change its settings are refused, saying so, and the WabiLink app shows them read-only. Its secrets, such as database passwords, stay here. sudo wabilink-server unregister takes it back, with the server's own settings as they were.
  1. Add yourself and a share

    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.

  2. Connect

    In the WabiLink app, New profile: this machine's address (hostname -I shows it), port 8009, your account and password. Compare the fingerprint it shows the first time with the one above, and accept it.

    To reach it from outside your network, forward TCP 8009 on your router to this machine. Never forward 8010.

  3. Everything else

    More people and their rights, groups, tunnels, databases and every setting: with sudo wabilink-server here, or from your desk with Server settings, in the app (port 8010, your account).

Optional: this machine's desktop

Lets the people you choose see and use this machine's screen from WabiLink (Server Desktop), inside their encrypted WabiLink session: no other port is opened. Turn it on, and give it to each account that may use it:

sudo wabilink-server config set desktop-enabled yes
sudo wabilink-server user desktop "$USER" yes

With WabiOne, turn it on in the console instead: Terminals and desktop, and the desktop for each person under People. What this machine needs for it, below, is the same either way.

A small agent runs in each desktop session and offers its screen to the server. The install script sets it up, as the packages for other distributions do. Installed by hand, set it up once:

sudo tee /etc/systemd/user/wabilink-desktop-agent.service >/dev/null <<'EOF'
[Unit]
Description=WabiLink desktop agent
PartOf=graphical-session.target
After=graphical-session.target

[Service]
ExecStart=/opt/wabilink/wabilink-server desktop-agent
Restart=on-failure
RestartSec=5

[Install]
WantedBy=graphical-session.target
EOF
sudo systemctl --global enable wabilink-desktop-agent.service

It starts in every desktop session from the next login on; in the session you are in now, at once with systemctl --user start wabilink-desktop-agent.

Viewers then see whoever is logged in at the machine - locked or not, as on its monitor - and unlock it from the viewer with that account's password. GNOME shows that the screen is shared while someone looks. If someone is working in that session, they are asked first, in a notification naming who asks and from where: Allow or Deny, and no answer in 30 seconds is a no.

A login screen of your own (GNOME 46 and later: Fedora 40, Ubuntu 24.04, Debian 13, RHEL 10 and newer): give an account desktop-login as well, and a viewer with nobody at the screen - or no screen at all - gets a login screen of its own. It logs in there as any account of this machine, with that account's password, and may log out: the next connection gives a new login screen. Each WabiLink account sees only its own.

sudo wabilink-server user desktop-login "$USER" yes
sudo wabilink-server login-probe        # whether this machine can
Without that, lock, don't log out. GNOME doesn't share the login screen on the machine's own screen, so once everyone has logged out there is nothing to show until someone logs in at the machine. Lock instead (Super+L): the viewer shows the lock screen, and you unlock it from there.

After a restart, nobody is logged in yet. Two ways to have a desktop there from the start:

  • Logged in at boot, locked (any distribution with GDM, GNOME's login screen): GDM logs the account in on the machine's own screen, and WabiLink locks it at once, as Windows shows its locked console. A viewer unlocks it with the account's password; so can someone at the machine.
    sudo wabilink-server desktop-setup "$USER" --login
    sudo systemctl reboot
  • Always on, with no monitor (where GDM includes GNOME's headless session - desktop-setup says if not): a separate GNOME session for the account, started at boot on a 1920×1080 virtual monitor, locked while no one looks and again after each viewer. Don't use it for an account that also logs in at the machine: GNOME runs one session per account at a time.
    sudo wabilink-server desktop-setup "$USER"

To undo either: sudo wabilink-server desktop-setup --off. desktop-setup changes the server's settings too, so with WabiOne, run it before registering.

Which desktops: GNOME on Wayland, and any desktop in an X11 session. KDE Plasma, Sway and other Wayland desktops are not supported yet: log in to their X11 session where they still offer one (the choice on the login screen).

Raspberry Pi OS's own desktop (labwc) is not supported yet: switch it to X11 with sudo raspi-config → Advanced Options → Wayland → X11. The screen is sent as lossless tiles.

Video from the graphics card: with a graphics card, the screen is coded on it - 60 frames a second and more. It needs the card's own driver: NVIDIA's driver for NVIDIA cards (RPM Fusion's akmod-nvidia) (sudo ubuntu-drivers install), and the VA-API driver for AMD and Intel - for H.264 and HEVC on AMD and Intel, RPM Fusion's mesa-va-drivers-freeworld, since Fedora's own leaves them out. The viewer's stats panel (the chart button) says what codes the screen, and why.

Updating

Nothing to do: it updates itself at night (how). To update at once, with the system's updates:

sudo dnf upgrade --refresh

A running server restarts by itself.

Updating

Nothing to do: it updates itself at night (how). To update at once, with the system's updates:

sudo apt update && sudo apt upgrade

A running server restarts by itself.

Updating

Nothing to do: it updates itself at night (how). To update at once:

curl -fsSLO https://link.wabione.com/install.sh
sudo sh install.sh

The same commands as installing: the newest version replaces the old one, and a running server restarts. The accounts, shares and identity in /var/lib/wabilink are kept. It takes over an install made by hand too, its files made root's. Desktop agents restart as the new version by themselves.

Is it running?

systemctl status wabilink
journalctl -u wabilink -n 50       # its log; -f to follow it
sudo ss -ltnp | grep -E ':(8009|8010)'

The last shows the ports it listens on. From another computer, the app connecting is the test that counts.

Removing

sudo wabilink-server desktop-setup --off     # only if you used desktop-setup
sudo dnf remove wabilink-server

The accounts, shares and identity in /var/lib/wabilink are kept for a reinstall; to remove everything, also sudo rm -rf /var/lib/wabilink.

Removing

sudo wabilink-server desktop-setup --off     # only if you used desktop-setup
sudo apt remove wabilink-server

The accounts, shares and identity in /var/lib/wabilink are kept for a reinstall; to remove everything, also sudo rm -rf /var/lib/wabilink.

Removing

sudo wabilink-server desktop-setup --off     # only if you used desktop-setup
sudo systemctl --global disable wabilink-desktop-agent.service
sudo rm -f /etc/systemd/user/wabilink-desktop-agent.service
sudo wabilink-server uninstall-systemd
sudo rm -rf /opt/wabilink /usr/local/bin/wabilink-server

The accounts, shares and identity in /var/lib/wabilink are kept for a reinstall; to remove everything, also sudo rm -rf /var/lib/wabilink and sudo userdel wabilink.

WabiLink on AWS

A user data script sets the server up on an EC2 instance when it first boots - nothing to log in to the instance for. Registered with WabiOne by an API token, it needs no code copied from the console: a release script or a CI pipeline adds servers on its own.

Never put a token or a password in user data. Any program on the instance can read it, and so can anyone who can view the instance in the console. The script reads it from SSM Parameter Store instead, with the instance's own role.

The instance's system

How it is set up

Pick both to see the steps.

When something doesn't work

The usual causes, and what to do. Commands on the server need sudo on Linux and macOS, and an administrator prompt on Windows (.\wabilink-service in place of wabilink-server).

The app cannot connect

  • Is the server running? Linux: systemctl status wabilink; macOS: sudo launchctl print system/com.wabilink.server | grep state; Windows: .\wabilink-service status.
  • Is port 8009 open in the server's firewall - and on AWS, its security group; from outside your network, forwarded on the router?
  • The right address? On the server: hostname -I (Linux), ipconfig getifaddr en0 (macOS), ipconfig (Windows).

The fingerprint is not the one you expected

Compare it with wabilink-server identity on the server. If they differ, don't accept it: something between you and the server is pretending to be it. If the server was reinstalled without its data, it has a new identity - accept the new one only once the server itself shows it to you.

The password is refused

Set a new one on the server: wabilink-server user passwd NAME. After too many failed tries an account is locked; wabilink-server user unlock NAME clears that.

A share can't be opened, or uploads fail

On Linux the server runs as the wabilink account, which must be able to read the folder, and write where people upload: sudo setfacl -R -m u:wabilink:rwX,d:u:wabilink:rwX /path. On macOS, Documents, Desktop and Downloads need Full Disk Access for /usr/local/wabilink-server/wabilink-server.

A setting was changed, and nothing happened

It was run without sudo: settings belong to the service. Run it again with sudo (on Windows, from an administrator prompt). Settings take effect at once; no restart is needed.

Server settings will not open

It uses port 8010, which the firewall must allow from where you are, and an account made with --admin (or wabilink-server user admin NAME yes).

Server Desktop is greyed out, or says it isn't offered

The desktop is off, or the account may not use it: wabilink-server config set desktop-enabled yes and wabilink-server user desktop NAME yes. The client must be 1.1 or later.

"GNOME does not let its screen be shared here"

Nobody is logged in at the Linux machine, and GNOME doesn't share its login screen. Lock rather than log out; after a restart, log in at the machine once, or set up desktop-setup NAME --login (see the Linux server guide).

"The server's built-in desktop has nothing to show"

No desktop agent runs in a session on that Linux machine. In the session on its screen: systemctl --user status wabilink-desktop-agent, and if it is disabled, systemctl --user enable --now wabilink-desktop-agent. A server installed from the .tar.gz needs the agent set up once (the guide's desktop step).

A black screen in the viewer

The screen is blanked or locked: press a key or move the mouse in the viewer, and unlock it with that account's password. On a Mac, black or no keys means its permissions are off: Screen & System Audio Recording and Accessibility for the server, which an update can turn off again.

The desktop is slow or blurry

The chart button in the viewer's bar shows the codec, frames a second, and why that codec was picked. Lossless tiles need a fast link; for video, the server needs its graphics card's driver (or SVT-AV1), and the viewer its decoders - see the optional steps in your system's guide.

Where the logs are

Linux: journalctl -u wabilink, and the desktop agent's journalctl --user -u wabilink-desktop-agent. macOS: /Library/Logs/WabiLink/server.log. Windows: C:\ProgramData\WabiLink\Server\logs, and the Application event log.

Checksums and signatures

Every download is listed with its SHA-256 in SHA256SUMS, signed in SHA256SUMS.asc. That list, the Linux packages and the repositories are signed with wabilink.asc.

To check a download, in the folder it is in:

curl -fsSLO https://link.wabione.com/files/SHA256SUMS -O https://link.wabione.com/files/SHA256SUMS.asc -O https://link.wabione.com/wabilink.asc
gpg --show-keys wabilink.asc
gpg --import wabilink.asc && gpg --verify SHA256SUMS.asc SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS          # macOS: shasum -a 256 --ignore-missing -c SHA256SUMS

The signing key's fingerprint: 2C9F6909A29FC1FE2F957F7FACBA86055D3EBAD2. Go on only if gpg --show-keys shows that one key and no other, and gpg --verify says Good signature with that fingerprint.