diff --git a/.github/codeql-config.yml b/.github/codeql-config.yml
new file mode 100644
index 000000000000..690b8e5a92e0
--- /dev/null
+++ b/.github/codeql-config.yml
@@ -0,0 +1,4 @@
+name: "code-server CodeQL config"
+
+paths-ignore:
+  - lib/vscode
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 8d97f1eead30..4ec51d013758 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -9,6 +9,7 @@ updates:
       # GitHub always delivers the latest versions for each major
       # release tag, so handle updates manually
       - dependency-name: "actions/*"
+      - dependency-name: "github/codeql-action/*"
 
   - package-ecosystem: "npm"
     directory: "/"
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
new file mode 100644
index 000000000000..3b41e3d9b2ad
--- /dev/null
+++ b/.github/workflows/codeql-analysis.yml
@@ -0,0 +1,33 @@
+name: "Code Scanning"
+
+on:
+  push:
+    branches: [main]
+  pull_request:
+    # The branches below must be a subset of the branches above
+    branches: [main]
+  schedule:
+    # Runs every Monday morning PST
+    - cron: "17 15 * * 1"
+
+jobs:
+  analyze:
+    name: Analyze
+    runs-on: ubuntu-20.04
+
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v2
+
+      # Initializes the CodeQL tools for scanning.
+      - name: Initialize CodeQL
+        uses: github/codeql-action/init@v1
+        with:
+          config-file: ./.github/codeql-config.yml
+          languages: javascript
+
+      - name: Autobuild
+        uses: github/codeql-action/autobuild@v1
+
+      - name: Perform CodeQL Analysis
+        uses: github/codeql-action/analyze@v1