
or:

RustDesk in combination with Tailscale/Headscale offers a near-perfect and completely free Remote Access solution for homelab enthusiasts.
This is so far the best tool I’ve found to remotely connect to ARM-based Linux desktops (e.g. Oracle Free Tier Ampère Instances with up to 4vCores and 24GB RAM or any of Apple’s M1/M2/M3/M4/… systems). For Intel-/AMD-based Linux desktops, however, I still prefer Cendio’s ThinLinc (on high resolution displays with the following workaround). For a matrix of client/server matches that worked best for me, see: overview of my favourite RDP client<->server combinations.
In combination with Tailscale (and if self-hosting is preferred/important Headscale) it offers secure and easy GUI access to computer and virtualised desktops in a homelab (plus cloud) setup:

No server is needed for direct peer-to-peer connections (e.g. with tailscale full domain names or with internal IPs in homelab):

NB: Don’t forget to enable 2-Factor-Authentication.

Related external posts/reviews/tutorials:
The following combinations have worked best for me:
[last update: 14/05/2025]
| Remote Desktops | Windows Desktop | Mac Desktop | Linux Desktop Intel-/AMD-based | Linux Desktop ARM64 / aarch64 |
| Clients | ||||
| Windows Client | Windows RDP (builtin) | RustDesk | ThinLinc* | RustDesk |
| Mac Client | Windows App | RustDesk | ThinLinc* | RustDesk |
| Linux Client | RustDesk | RustDesk | ThinLinc* | RustDesk |
| iOS/iPad Client | Windows App | RustDesk | RustDesk | RustDesk |
| Android Client (untested) | Remote Desktop App | RustDesk | RustDesk | RustDesk |
* on high-resolution/Retina displays: use this workaround
If you’d like to enable external access to resources in your homelab or in your cloud environment, please don’t forget to choose a reasonably secure setup:
For month I’ve been trying to get this to work and I finally found a solution, which is a lot easier than I initially thought it would be.
Problem: If you want to connect remotely to a Linux desktop (running ThinLinc server) via ThinLinc* client, it has often been impossible to get the remote desktop working at the native resolution of a 4K display (3840×2160). In my case the highest possible resolution to choose from in the remote systems’ display settings was 1920×1080, resulting in a blurred linux desktop. While ThinLinc still offered a superior remote desktop experience to all tools tested, the blurred display kept bugging me. My aim was to get the sharpest and most responsive Cendio ThinLinc sessions on high-resolution displays possible.
NB. The following workaround also helped me solve display resolution problems with other remote desktop clients (e.g. NoMachine, VNC variants).
[Update 19/02/2025]: The best alternative to ThinLinc for connections to ARM-based linux and macOS remote desktops (e.g. RasperyPI, Oracle Free Tier Ampère Instances, Apple’s M1/M2/M3/M4) is RustDesk, which is available for all platforms and allows peer-to-peer connections (ip<->ip) without the need for a server if used in small homelab situations. Unfortunately, thinlinc server is only available for Intel-/AMD-based systems.
RustDesk does offer superior handling of display resolutions, however, for remote desktops on Intel-/AMD-based platforms thinlinc is by far the best solution for connections to Linux desktops. In these cases, I prefer to use the following workaround (also see overview of my favourite RDP client<->server combinations)
(might also work on other high-resolution displays)
Right-click on Windows-Desktop and choose: “Display settings”. Scroll down to scaling and make sure that your system does not use “custom scaling”. Choose 100% from the drop-down menu. Alternatively, you can navigate to Windows Settings > System > Display settings to find the same menu.
(Screenshots are from a German version of Windows 11)

NB: If you are using more than one display, make sure to adjust scaling to 100% on all screens you intend to use for your remote connection. Also make sure that there is no “custom scaling” enabled.
On macOS, display scaling can be set under: System Preferences/Displays:
Choose the setting labelled “More Space” for native retina display’s resolution.

NB: If you are using more than one display, make sure to adjust scaling to 100% on all screens you intend to use for your remote connection.
(Don’t be discouraged by the tiny icons and font size, you can switch back to your normal scaling as soon as your thinlinc session is over.)



Related external posts:
Quick step-by-step guide:
Get a random sample of 100 lines per text file on Mac OSX:
Steps 1 to 4 only have to be followed once per computer. After that only steps 6 & 8 are needed.
ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
Source: http://brew.sh/ (for further documentation)
If it asks you to install “Commandline developer tools”, say YES (might take a while).
Instead of test.txt you can use your query results and instead of 2, you can enter the size of your sample.
Explanation of the different parts of the command:
| shuffle command | sample size (display shuffled lines, up to the line number specified by -n switch) | name of file you want to shuffle (lines) | write output into file | name of output file |
| gshuf | -n SAMPLESIZE | test.txt | > | out.txt |
An easy way to navigate to a particular folder: type cd [space] into the terminal window, drag&drop the folder you want to work in from your Finder into the Terminal and press RETURN/ENTER.
Other basic folder/directory navigation from Terminal window:
Source: http://www.cheatography.com/davechild/cheat-sheets/linux-command-line/
Example:
| test.txt | gshuf -n 2 test.txt |
| line 1: Aarau
line 2: Basel line 3: Bern line 4: Luzern line 5: Olten line 6: St. Gallen line 7: Zürich |
Command for a sample of 100:
cd path_to_folder_with_file_you_want_to_shuffle
gshuf -n 100 results.txt > random_sample1.txt