diff --git a/client/devkit_client/__init__.py b/client/devkit_client/__init__.py
index 3cd7e63cb417cde0265355d8693db435883e5860..591de352fbba1dea81f5485da03bd7b359628a81 100644
--- a/client/devkit_client/__init__.py
+++ b/client/devkit_client/__init__.py
@@ -248,6 +248,10 @@ def locate_external_tools():
         return g_external_tools
     if sys.platform != 'win32':
         g_external_tools = (None, 'ssh', 'rsync', None)
+        for tool in g_external_tools:
+            if tool is not None:
+                if shutil.which(tool) is None:
+                    raise Exception(f'{tool} not found - please install.')
         return g_external_tools
 
     cygpath = _locate_external_tool('cygpath.exe')
diff --git a/client/devkit_client/gui2/gui2.py b/client/devkit_client/gui2/gui2.py
index 0e9aa58f002ced9f3e945d28c11937930279da28..e84255fb453af21a54b919bb319366a7ceca910a 100644
--- a/client/devkit_client/gui2/gui2.py
+++ b/client/devkit_client/gui2/gui2.py
@@ -1076,6 +1076,7 @@ class DevkitsWindow(ToolWindow):
         self.add_by_ip_text = ''
         self.add_by_ip_port = '{}'.format(devkit_client.DEFAULT_DEVKIT_SERVICE_HTTP)
         self.steam_client_args = None
+        self.first_draw = True
         # Hook into status updates to refresh the command line arguments
         self.devkit_commands.signal_steamos_status.connect(self.on_steamos_status)
         # Indicates whether Valve internal services are available
@@ -1203,6 +1204,20 @@ class DevkitsWindow(ToolWindow):
             return
 
         # === draw =========================================================================
+        if self.first_draw:
+            try:
+                devkit_client.locate_external_tools()
+            except Exception as e:
+                failed_future = concurrent.futures.Future()
+                failed_future.set_exception(e)
+                self.modal_wait = ModalWait(
+                    self.viewport,
+                    self.toolbar,
+                    'ERROR',
+                    failed_future
+                )
+            self.first_draw = False
+
         (_, opened) = imgui.begin(self.BUTTON_NAME, True, imgui.WINDOW_NO_COLLAPSE)
         if not opened:
             self.visible = False