diff --git a/dockerimg/dockerimg.go b/dockerimg/dockerimg.go
index a92fb92..976a979 100644
--- a/dockerimg/dockerimg.go
+++ b/dockerimg/dockerimg.go
@@ -259,22 +259,30 @@
 		return appendInternalErr(fmt.Errorf("Error splitting ssh host and port: %w", err))
 	}
 
-	cst, err := NewSSHTheather(cntrName, sshHost, sshPort)
-	if err != nil {
-		return appendInternalErr(fmt.Errorf("NewContainerSSHTheather: %w", err))
-	}
+	var sshServerIdentity, sshUserIdentity []byte
 
-	fmt.Printf(`Connect to this container via any of these methods:
+	if err := CheckForInclude(); err != nil {
+		fmt.Println(err.Error())
+		// continue - ssh config is not required for the rest of sketch to function locally.
+	} else {
+		cst, err := NewSSHTheather(cntrName, sshHost, sshPort)
+		if err != nil {
+			return appendInternalErr(fmt.Errorf("NewContainerSSHTheather: %w", err))
+		}
+
+		fmt.Printf(`Connect to this container via any of these methods:
 🖥️  ssh %s
 🖥️  code --remote ssh-remote+root@%s /app -n
 🔗 vscode://vscode-remote/ssh-remote+root@%s/app?n=true
 `, cntrName, cntrName, cntrName)
-
-	defer func() {
-		if err := cst.Cleanup(); err != nil {
-			appendInternalErr(err)
-		}
-	}()
+		sshUserIdentity = cst.userIdentity
+		sshServerIdentity = cst.serverIdentity
+		defer func() {
+			if err := cst.Cleanup(); err != nil {
+				appendInternalErr(err)
+			}
+		}()
+	}
 
 	// Tell the sketch container which git server port and commit to initialize with.
 	go func() {
@@ -283,7 +291,7 @@
 		// the scrollback (which is not good, but also not fatal).  I can't see why it does this
 		// though, since none of the calls in postContainerInitConfig obviously write to stdout
 		// or stderr.
-		if err := postContainerInitConfig(ctx, localAddr, commit, gitSrv.gitPort, gitSrv.pass, cst.serverIdentity, cst.userIdentity); err != nil {
+		if err := postContainerInitConfig(ctx, localAddr, commit, gitSrv.gitPort, gitSrv.pass, sshServerIdentity, sshUserIdentity); err != nil {
 			slog.ErrorContext(ctx, "LaunchContainer.postContainerInitConfig", slog.String("err", err.Error()))
 			errCh <- appendInternalErr(err)
 		}
diff --git a/dockerimg/sshtheater.go b/dockerimg/sshtheater.go
index 35433dd..53a8383 100644
--- a/dockerimg/sshtheater.go
+++ b/dockerimg/sshtheater.go
@@ -110,6 +110,38 @@
 	return cst, nil
 }
 
+func CheckForInclude() error {
+	sketchSSHPathInclude := "Include " + filepath.Join(os.Getenv("HOME"), ".sketch", "ssh_config")
+	defaultSSHPath := filepath.Join(os.Getenv("HOME"), ".ssh", "config")
+	f, _ := os.Open(filepath.Join(os.Getenv("HOME"), ".ssh", "config"))
+	cfg, _ := ssh_config.Decode(f)
+	var sketchInludePos *ssh_config.Position
+	var firstNonIncludePos *ssh_config.Position
+	for _, host := range cfg.Hosts {
+		for _, node := range host.Nodes {
+			inc, ok := node.(*ssh_config.Include)
+			if ok {
+				if strings.TrimSpace(inc.String()) == sketchSSHPathInclude {
+					pos := inc.Pos()
+					sketchInludePos = &pos
+				}
+			} else if firstNonIncludePos == nil && !strings.HasPrefix(strings.TrimSpace(node.String()), "#") {
+				pos := node.Pos()
+				firstNonIncludePos = &pos
+			}
+		}
+	}
+
+	if sketchInludePos == nil {
+		return fmt.Errorf("⚠️  SSH connections are disabled. To enable them, add the line %q to the top of %s before any 'Host' lines", sketchSSHPathInclude, defaultSSHPath)
+	}
+
+	if firstNonIncludePos != nil && firstNonIncludePos.Line < sketchInludePos.Line {
+		fmt.Printf("⚠️  SSH confg warning: The location of the Include statement for sketch's ssh config on line %d of %s may prevent ssh from working with sketch containers. Try moving it to the top of the file (before any 'Host' lines) if ssh isn't working for you.\n", sketchInludePos.Line, defaultSSHPath)
+	}
+	return nil
+}
+
 func removeFromHosts(cntrName string, cfgHosts []*ssh_config.Host) []*ssh_config.Host {
 	hosts := []*ssh_config.Host{}
 	for _, host := range cfgHosts {
