Mike Slinn

RustDesk, an open source alternative to TeamViewer

Published 2024-09-20.
Time to read: 3 minutes.

This page is part of the posts collection, categorized under Open Source.

I have used many remote desktop applications over the years. I only access local computers, and do not provide remote access. Some of the products I have used include:

  • X Windows, released in 1984. It is slowly being receding into the background.
  • Microsoft Remote Desktop Connection, released in 1998. This is a half-hearted attempt, with annoying limitations.
  • pcAnywhere, released by Symantec in 1991. Once a leading contender by an industry innovator, discontinued decades ago.
  • GoToMyPC, released in 1998. Some dinosaurs are still breathing their last breaths.
  • VNC, released in 2002. No longer supported by Ubuntu Desktop in its default configuration.
  • TeamViewer, released in 2005. Technically a good product, but the licensing policy makes only viable for enterprises.

Two open-source alternatives exist that seem interesting: RustDesk, written in Rust, and MeshCentral. This article details my experience playing with RustDesk on Windows and Ubuntu. It supports Wayland.

Documentation is frustratingly obtuse. Lots of useless detail, important things not mentioned. Address book vs Favorites.

Installation

I decided to use one of my Ubuntu servers, gojira, to self-host RustDesk Server.

In addition, each computer to be controlled also needs a RustDesk client.

Server

The documented instructions to open the default Ubuntu firewall are flawed. Instead, I typed:

Shell
$ sudo ufw allow ssh
Rules updated
Rules updated (v6) 
$ sudo ufw allow 21114:21119/tcp Rules updated Rules updated (v6)
$ sudo ufw allow 8000/tcp Rules updated Rules updated (v6)
$ sudo ufw allow 21116/udp Rules updated Rules updated (v6)
$ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)?

As I have written many times before, I see no purpose in using Docker. I installed the RustDesk Server without Docker:

Shell
$ wget -O ~/Downloads/rustdesk_server.sh \
  https://raw.githubusercontent.com/techahold/rustdeskinstall/master/install.sh
https://raw.githubusercontent.com/techahold/rustdeskinstall/master/install.sh
--2024-09-20 06:52:49-- https://raw.githubusercontent.com/techahold/rustdeskinstall/master/install.sh
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.110.133, 185.199.109.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13544 (13K) [text/plain]
Saving to: ‘/home/mslinn/Downloads/rustdesk_server.sh’
/home/mslinn/Downloads/rustdesk_server.sh 100%[==================================================>] 13.23K --.-KB/s in 0s
2024-09-20 06:52:49 (41.8 MB/s) - ‘/home/mslinn/Downloads/rustdesk_server.sh’ saved [13544/13544]

$ chmod +x ~/Downloads/rustdesk_server.sh

The installation script has a help message:

Shell
$ ~/Downloads/rustdesk_server.sh --help
usage: install.sh --resolveip --resolvedns "fqdn"
options:
--resolveip Use IP for server name. Cannot use in combination with --resolvedns or -d
--resolvedns "fqdn" Use FQDN for server name. Cannot use in combination with --resolveip or -i
--install-http Install http server to host installation scripts. Cannot use in combination with --skip-http or -n
--skip-http Skip installation of http server. Cannot use in combination with --install-http or -h 

Because my Ubuntu server uses nginx for serving web pages, I used the ‑‑skip-http option.

Shell
$ ~/Downloads/rustdesk_server.sh \
  --resolvedns gojira \
  --install-http
Installing prerequisites
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Hit:2 https://dl.google.com/linux/chrome/deb stable InRelease
Reading package lists... Done
N: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://dl.google.com/linux/chrome/deb stable InRelease' doesn't support architecture 'i386'
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
curl is already the newest version (8.5.0-2ubuntu10.1).
wget is already the newest version (1.21.4-1ubuntu4).
unzip is already the newest version (6.0-28ubuntu4).
tar is already the newest version (1.35+dfsg-3build1).
dnsutils is already the newest version (1:9.18.24-0ubuntu5).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Installing Rustdesk Server
--2024-09-20 09:53:18-- https://github.com/rustdesk/rustdesk-server/releases/download/1.1.11-1/rustdesk-server-linux-amd64.zip
Resolving github.com (github.com)... 140.82.112.4
Connecting to github.com (github.com)|140.82.112.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/299354666/0285ef87-85f9-441e-b8b8-8efc8c4f977b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20240920%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240920T135318Z&X-Amz-Expires=300&X-Amz-Signature=683d7239fa6fdec771af701f87eabec71c0b1c3d285dae3ab4c29add206fb64f&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Drustdesk-server-linux-amd64.zip&response-content-type=application%2Foctet-stream [following]
--2024-09-20 09:53:18-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/299354666/0285ef87-85f9-441e-b8b8-8efc8c4f977b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20240920%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240920T135318Z&X-Amz-Expires=300&X-Amz-Signature=683d7239fa6fdec771af701f87eabec71c0b1c3d285dae3ab4c29add206fb64f&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Drustdesk-server-linux-amd64.zip&response-content-type=application%2Foctet-stream
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.110.133, 185.199.111.133, 185.199.109.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8539403 (8.1M) [application/octet-stream]
Saving to: `rustdesk-server-linux-amd64.zip'
rustdesk-server-linux-amd64.zip 100%[======================================================================================>] 8.14M 49.2MB/s in 0.2s
2024-09-20 09:53:18 (49.2 MB/s) - `rustdesk-server-linux-amd64.zip' saved [8539403/8539403]
Archive: rustdesk-server-linux-amd64.zip inflating: amd64/hbbr inflating: amd64/hbbs inflating: amd64/rustdesk-utils Rustdesk Relay not ready yet... Tidying up install Grabbing installers 0nI5YTMuUjMy4iNy4CM38yL6MHc0RHaiojIpBXYiwiI98WSqlFWxllTIllSyFXd5x2Kx9WZ3IEdWJFW6JnaTB1Mzc2aWhWRTlEWzRlI6ISeltmIsISO2EjL1IjMuYjMuAzNiojI5FGblJnIsISO2EjL1IjMuYjMuAzNiojI0N3boJye 1) Yes 2) No Please choose if you want to download configs and install HTTP server:
1 --2024-09-20 09:53:29-- https://raw.githubusercontent.com/dinger1986/rustdeskinstall/master/WindowsAgentAIOInstall.ps1 Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 3773 (3.7K) [text/plain] Saving to: `WindowsAgentAIOInstall.ps1'
WindowsAgentAIOInstall.ps1 100%[======================================================================================>] 3.68K --.-KB/s in 0s
2024-09-20 09:53:29 (51.2 MB/s) - `WindowsAgentAIOInstall.ps1' saved [3773/3773]
--2024-09-20 09:53:29-- https://raw.githubusercontent.com/dinger1986/rustdeskinstall/master/linuxclientinstall.sh Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.108.133, 185.199.111.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 3584 (3.5K) [text/plain] Saving to: `linuxclientinstall.sh'
linuxclientinstall.sh 100%[======================================================================================>] 3.50K --.-KB/s in 0s
2024-09-20 09:53:29 (41.5 MB/s) - `linuxclientinstall.sh' saved [3584/3584]
Creating /opt/gohttp Installing Go HTTP Server --2024-09-20 09:53:30-- https://github.com/codeskyblue/gohttpserver/releases/download/1.1.4/gohttpserver_1.1.4_linux_amd64.tar.gz Resolving github.com (github.com)... 140.82.112.4 Connecting to github.com (github.com)|140.82.112.4|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/63852314/3b4f8927-1e46-46b6-873c-6407b36d0f92?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20240920%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240920T135330Z&X-Amz-Expires=300&X-Amz-Signature=c89e7401861bd997f2b31ac3ece124090ea280050f17ef85c4beb2bda49e0e4e&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dgohttpserver_1.1.4_linux_amd64.tar.gz&response-content-type=application%2Foctet-stream [following] --2024-09-20 09:53:30-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/63852314/3b4f8927-1e46-46b6-873c-6407b36d0f92?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20240920%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240920T135330Z&X-Amz-Expires=300&X-Amz-Signature=c89e7401861bd997f2b31ac3ece124090ea280050f17ef85c4beb2bda49e0e4e&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dgohttpserver_1.1.4_linux_amd64.tar.gz&response-content-type=application%2Foctet-stream Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.110.133, 185.199.108.133, ... Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 4864160 (4.6M) [application/octet-stream] Saving to: `gohttpserver_1.1.4_linux_amd64.tar.gz'
gohttpserver_1.1.4_linux_amd64.tar.gz 100%[======================================================================================>] 4.64M --.-KB/s in 0.05s
2024-09-20 09:53:30 (102 MB/s) - `gohttpserver_1.1.4_linux_amd64.tar.gz' saved [4864160/4864160]
Creating /var/log/gohttp Tidying up Go HTTP Server Install Created symlink /etc/systemd/system/multi-user.target.wants/gohttpserver.service  /etc/systemd/system/gohttpserver.service. Your IP/DNS Address is 70.26.225.169 Your public key is TsXISEhVkg33PSjrzXRVtB7eoq+lyuqrJYHNYqXYjIo= Install Rustdesk on your machines and change your public key and IP/DNS name to the above You can access your install scripts for clients by going to http://70.26.225.169:8000 Username is admin and password is YhJkPYNp2P7HmGhN Press any key to finish install

I saved the public key, shown near the end of the above output. The key was stable each time I ran the installation script.

The final message mentioned infiniteremote, which is a RustDesk fork plus some other undocumented stuff. That is weird, especially since there seems to be some hostility between the RustDesk author and the infiniteremote author. I decided to ignore infiniteremote for now.

The end of the above output included this message:

Output
You can access your install scripts for clients by going to http://70.26.225.169:8000
Username is admin and password is YhJkPYNp2P7HmGhN.

Instead of the (external) IP address reported above, I navigated to the local IP address http://gojira:8000, input the above username and password, and saw:

These scripts can be used to install RustDesk on clients. The file with the ps1 filetype is a Windows PowerShell script. The contents were:

WindowsAgentAIOInstall.ps1
$ErrorActionPreference= 'silentlycontinue'
# Assign the value random password to the password variable $rustdesk_pw=(-join ((65..90) + (97..122) | Get-Random -Count 12 | % {[char]$_}))
# Get your config string from your Web portal and Fill Below $rustdesk_cfg="0nI5YTMuUjMy4iNy4CM38yL6MHc0RHaiojIpBXYiwiI98WSqlFWxllTIllSyFXd5x2Kx9WZ3IEdWJFW6JnaTB1Mzc2aWhWRTlEWzRlI6ISeltmIsISO2EjL1IjMuYjMuAzNiojI5FGblJnIsISO2EjL1IjMuYjMuAzNiojI0N3boJye"
################################### Please Do Not Edit Below This Line #########################################
# Run as administrator and stays in the current directory if (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) { Start-Process PowerShell -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`""; Exit; } }
# Checks for the latest version of RustDesk $url = 'https://www.github.com//rustdesk/rustdesk/releases/latest' $request = [System.Net.WebRequest]::Create($url) $response = $request.GetResponse() $realTagUrl = $response.ResponseUri.OriginalString $RDLATEST = $realTagUrl.split('/')[-1].Trim('v') echo "RustDesk $RDLATEST is the latest version."
# Checks the version of RustDesk installed. $rdver = ((Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\RustDesk\").Version)
# Skips to inputting the configuration if the latest version of RustDesk is already installed. if($rdver -eq "$RDLATEST") { echo "RustDesk $rdver is already installed." cd $env:ProgramFiles\RustDesk echo "Inputting configuration now." .\rustdesk.exe --config $rustdesk_cfg .\rustdesk.exe --password $rustdesk_pw $rustdesk_id = .\rustdesk.exe --get-id | Write-Output -OutVariable rustdesk_id echo "All done! Please double check the Network settings tab in RustDesk." echo "" echo "..............................................." # Show the value of the ID Variable echo "RustDesk ID: $rustdesk_id"
# Show the value of the Password Variable echo "Password: $rustdesk_pw" echo "..............................................." echo "" echo "Press Enter to open RustDesk." pause .\rustdesk.exe exit }
if (!(Test-Path C:\Temp)) { New-Item -ItemType Directory -Force -Path C:\Temp > null }
cd C:\Temp echo "Downloading RustDesk version $RDLATEST." powershell Invoke-WebRequest "https://github.com/rustdesk/rustdesk/releases/download/$RDLATEST/rustdesk-$RDLATEST-x86_64.exe" -Outfile "rustdesk.exe" echo "Installing RustDesk version $RDLATEST." Start-Process .\rustdesk.exe --silent-install Start-Sleep -Seconds 10
$ServiceName = 'rustdesk' $arrService = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
if ($arrService -eq $null) { echo "Installing service." cd $env:ProgramFiles\RustDesk Start-Process .\rustdesk.exe --install-service -wait -Verbose Start-Sleep -Seconds 20 }
while ($arrService.Status -ne 'Running') { Start-Service $ServiceName Start-Sleep -seconds 5 $arrService.Refresh() }
# Waits for installation to complete before proceeding. echo "Please wait a few seconds." Start-Sleep -Seconds 10
cd $env:ProgramFiles\RustDesk echo "Inputting configuration now." .\rustdesk.exe --config $rustdesk_cfg .\rustdesk.exe --password $rustdesk_pw $rustdesk_id = .\rustdesk.exe --get-id | Write-Output -OutVariable rustdesk_id echo "All done! Please double check the Network settings tab in RustDesk." echo "" echo "..............................................." # Show the value of the ID Variable echo "RustDesk ID: $rustdesk_id"
# Show the value of the Password Variable echo "Password: $rustdesk_pw" echo "..............................................." echo "" echo "Press Enter to open RustDesk." pause .\rustdesk.exe

The contents of linuxclientinstall.sh were:

linuxclientinstall.sh
#!/bin/bash
# Assign a random value to the password variable rustdesk_pw=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1)
# Get your config string from your Web portal and Fill Below rustdesk_cfg="0nI5YTMuUjMy4iNy4CM38yL6MHc0RHaiojIpBXYiwiI98WSqlFWxllTIllSyFXd5x2Kx9WZ3IEdWJFW6JnaTB1Mzc2aWhWRTlEWzRlI6ISeltmIsISO2EjL1IjMuYjMuAzNiojI5FGblJnIsISO2EjL1IjMuYjMuAzNiojI0N3boJye"
################################### Please Do Not Edit Below This Line #########################################
# Check if the script is being run as root if [[ $EUID -ne 0 ]]; then echo "This script must be run as root." exit 1 fi
# Identify OS if [ -f /etc/os-release ]; then # freedesktop.org and systemd . /etc/os-release OS=$NAME VER=$VERSION_ID
UPSTREAM_ID=${ID_LIKE,,}
# Fallback to ID_LIKE if ID was not 'ubuntu' or 'debian' if [ "${UPSTREAM_ID}" != "debian" ] && [ "${UPSTREAM_ID}" != "ubuntu" ]; then UPSTREAM_ID="$(echo ${ID_LIKE,,} | sed s/\"//g | cut -d' ' -f1)" fi
elif type lsb_release >/dev/null 2>&1; then # linuxbase.org OS=$(lsb_release -si) VER=$(lsb_release -sr) elif [ -f /etc/lsb-release ]; then # For some versions of Debian/Ubuntu without lsb_release command . /etc/lsb-release OS=$DISTRIB_ID VER=$DISTRIB_RELEASE elif [ -f /etc/debian_version ]; then # Older Debian, Ubuntu, etc. OS=Debian VER=$(cat /etc/debian_version) elif [ -f /etc/SuSE-release ]; then # Older SuSE etc. OS=SuSE VER=$(cat /etc/SuSE-release) elif [ -f /etc/redhat-release ]; then # Older Red Hat, CentOS, etc. OS=RedHat VER=$(cat /etc/redhat-release) else # Fall back to uname, e.g. "Linux <version>", also works for BSD, etc. OS=$(uname -s) VER=$(uname -r) fi
# Checks the latest version of RustDesk RDLATEST=$(curl https://api.github.com/repos/rustdesk/rustdesk/releases/latest -s | grep "tag_name" | awk -F'"' '{print $4}')
# Install RustDesk
echo "Installing RustDesk" if [ "${ID}" = "debian" ] || [ "$OS" = "Ubuntu" ] || [ "$OS" = "Debian" ] || [ "${UPSTREAM_ID}" = "ubuntu" ] || [ "${UPSTREAM_ID}" = "debian" ]; then wget https://github.com/rustdesk/rustdesk/releases/download/${RDLATEST}/rustdesk-${RDLATEST}-x86_64.deb apt-get install -fy ./rustdesk-${RDLATEST}-x86_64.deb >/dev/null elif [ "$OS" = "CentOS" ] || [ "$OS" = "RedHat" ] || [ "$OS" = "Fedora Linux" ] || [ "${UPSTREAM_ID}" = "rhel" ]; then wget https://github.com/rustdesk/rustdesk/releases/download/${RDLATEST}/rustdesk-${RDLATEST}.x86_64.rpm yum localinstall ./rustdesk-${RDLATEST}.x86_64.rpm -y >/dev/null elif [ "${UPSTREAM_ID}" = "suse" ]; then wget https://github.com/rustdesk/rustdesk/releases/download/${RDLATEST}/rustdesk-${RDLATEST}.x86_64-suse.rpm zypper -n install --allow-unsigned-rpm ./rustdesk-${RDLATEST}.x86_64-suse.rpm >/dev/null else echo "Unsupported OS" # here you could ask the user for permission to try and install anyway # if they say yes, then do the install # if they say no, exit the script exit 1 fi
# Run the rustdesk command with --get-id and store the output in the rustdesk_id variable rustdesk_id=$(rustdesk --get-id)
# Apply new password to RustDesk rustdesk --password $rustdesk_pw &> /dev/null
rustdesk --config $rustdesk_cfg
systemctl restart rustdesk
echo "All done! Please double check the Network settings tab in RustDesk." echo "" echo "..............................................." # Check if the rustdesk_id is not empty if [ -n "$rustdesk_id" ]; then echo "RustDesk ID: $rustdesk_id" else echo "Failed to get RustDesk ID." fi
# Echo the value of the password variable echo "Password: $rustdesk_pw" echo "..............................................."

Check Server Status

Shell
$ sudo systemctl status rustdeskrelay.service
● rustdeskrelay.service - Rustdesk Relay Server
     Loaded: loaded (/etc/systemd/system/rustdeskrelay.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-09-20 06:58:27 EDT; 3h 43min ago
   Main PID: 1690805 (hbbr)
      Tasks: 27 (limit: 76799)
     Memory: 1.3M (peak: 3.3M)
        CPU: 1.679s
     CGroup: /system.slice/rustdeskrelay.service
             └─1690805 /opt/rustdesk/hbbr
Sep 20 06:58:27 gojira systemd[1]: Started rustdeskrelay.service - Rustdesk Relay Server.

$ sudo systemctl status rustdesksignal.service ● rustdesksignal.service - Rustdesk Signal Server Loaded: loaded (/etc/systemd/system/rustdesksignal.service; enabled; preset: enabled) Active: active (running) since Fri 2024-09-20 06:58:27 EDT; 3h 44min ago Main PID: 1690414 (hbbs) Tasks: 28 (limit: 76799) Memory: 1.9M (peak: 3.3M) CPU: 6.892s CGroup: /system.slice/rustdesksignal.service └─1690414 /opt/rustdesk/hbbs
Sep 20 06:58:27 gojira systemd[1]: Started rustdesksignal.service - Rustdesk Signal Server.

Updating Server

To update RustDesk, download and run update.sh.

Windows Client

Scripted Installation

I ran the PowerShell script. Output was:

PowerShell Script Output
RustDesk 1.3.0 is the latest version.
Downloading RustDesk version 1.3.0.
Installing RustDesk version 1.3.0.
Please wait a few seconds.
Inputting configuration now.
All done! Please double check the Network settings tab in RustDesk.
............................................... RustDesk ID: 374303146 Password: miQNPLBpCexq ...............................................
Press Enter to open RustDesk. Press Enter to continue...:

Unfortunately, this configured the client to search for the server using the external IP address (http://70.26.225.169:8000), not the local IP address (http//gojira:8000).

Manual Installation

Download the Windows client and run it on each Windows machine.

RustDesk clients must be configured to use a local server. To open the RustDesk client settings, click on the menu button [ ⋮ ] next to the ID.

Initial RustDesk client settings
Initial RustDesk client settings

You can either set up a local DNS server that provides the IP address for the local RustDesk server, or define the IP address in /etc/hosts in *nix clients, or in %SYSTEM32%\Drivers\etc\hosts for Windows clients.

It would seem that one would want to export the client settings to a file to make setting up other clients easier. Unfortunately, I could not discover where the exported settings could be found. However, I did learn where the settings are stored:

Windows
%AppData%\Rustdesk\config\RustDesk2.toml
Mac
/System/Volumes/Data/Users/you_user_id/Library/Preferences/com.carriez.RustDesk/

My address book is served from http://gojira:21114/api/login.

The address book server for my configuration is accessed at http://gojira:21114/api/login.

* indicates a required field.

Please select the following to receive Mike Slinn’s newsletter:

You can unsubscribe at any time by clicking the link in the footer of emails.

Mike Slinn uses Mailchimp as his marketing platform. By clicking below to subscribe, you acknowledge that your information will be transferred to Mailchimp for processing. Learn more about Mailchimp’s privacy practices.