diff --git a/README.md b/README.md
index 8ad9a86..9ff4e55 100644
--- a/README.md
+++ b/README.md
@@ -51,6 +51,19 @@ on follow-up connections to the same server.
 
 To disable this feature entirely, pass the `--skipsync` flag.
 
+### Custom settings directories
+
+If you're using an alternate release of VS Code such as VS Code Insiders, you
+must specify your settings directories through the `VSCODE_CONFIG_DIR` and
+`VSCODE_EXTENSIONS_DIR` environment variables.
+
+The following will make `sshcode` work with VS Code Insiders:
+
+```bash
+export VSCODE_CONFIG_DIR="$HOME/.config/Code - Insiders/User"
+export VSCODE_EXTENSIONS_DIR="$HOME/.vscode-insiders/extensions"
+```
+
 ### Sync-back
 
 By default, VS Code changes on the remote server won't be synced back
diff --git a/main.go b/main.go
index 7548eba..67782b8 100644
--- a/main.go
+++ b/main.go
@@ -11,7 +11,6 @@ import (
 	"os/exec"
 	"os/signal"
 	"path/filepath"
-	"runtime"
 	"strconv"
 	"strings"
 	"text/tabwriter"
@@ -66,6 +65,11 @@ func main() {
 	flag.Usage = func() {
 		fmt.Printf(`Usage: %v [FLAGS] HOST [DIR]
 Start VS Code via code-server over SSH.
+
+Environment variables:
+		`+vsCodeConfigDirEnv+`	use special VS Code settings dir.
+		`+vsCodeExtensionsDirEnv+`	use special VS Code extensions dir.
+
 More info: https://github.com/codercom/sshcode
 
 Arguments:
@@ -336,27 +340,3 @@ func rsync(src string, dest string, sshFlags string, excludePaths ...string) err
 
 	return nil
 }
-
-func configDir() (string, error) {
-	var path string
-	switch runtime.GOOS {
-	case "linux":
-		path = os.ExpandEnv("$HOME/.config/Code/User/")
-	case "darwin":
-		path = os.ExpandEnv("$HOME/Library/Application Support/Code/User/")
-	default:
-		return "", xerrors.Errorf("unsupported platform: %s", runtime.GOOS)
-	}
-	return filepath.Clean(path), nil
-}
-
-func extensionsDir() (string, error) {
-	var path string
-	switch runtime.GOOS {
-	case "linux", "darwin":
-		path = os.ExpandEnv("$HOME/.vscode/extensions/")
-	default:
-		return "", xerrors.Errorf("unsupported platform: %s", runtime.GOOS)
-	}
-	return filepath.Clean(path), nil
-}
diff --git a/settings.go b/settings.go
new file mode 100644
index 0000000..ad962a3
--- /dev/null
+++ b/settings.go
@@ -0,0 +1,46 @@
+package main
+
+import (
+	"os"
+	"path/filepath"
+	"runtime"
+
+	"golang.org/x/xerrors"
+)
+
+const (
+	vsCodeConfigDirEnv     = "VSCODE_CONFIG_DIR"
+	vsCodeExtensionsDirEnv = "VSCODE_EXTENSIONS_DIR"
+)
+
+func configDir() (string, error) {
+	if env, ok := os.LookupEnv(vsCodeConfigDirEnv); ok {
+		return os.ExpandEnv(env), nil
+	}
+
+	var path string
+	switch runtime.GOOS {
+	case "linux":
+		path = os.ExpandEnv("$HOME/.config/Code/User/")
+	case "darwin":
+		path = os.ExpandEnv("$HOME/Library/Application Support/Code/User/")
+	default:
+		return "", xerrors.Errorf("unsupported platform: %s", runtime.GOOS)
+	}
+	return filepath.Clean(path), nil
+}
+
+func extensionsDir() (string, error) {
+	if env, ok := os.LookupEnv(vsCodeExtensionsDirEnv); ok {
+		return os.ExpandEnv(env), nil
+	}
+
+	var path string
+	switch runtime.GOOS {
+	case "linux", "darwin":
+		path = os.ExpandEnv("$HOME/.vscode/extensions/")
+	default:
+		return "", xerrors.Errorf("unsupported platform: %s", runtime.GOOS)
+	}
+	return filepath.Clean(path), nil
+}