diff --git a/packages/vscode/src/client.ts b/packages/vscode/src/client.ts
index e0ba54842..12f94f000 100644
--- a/packages/vscode/src/client.ts
+++ b/packages/vscode/src/client.ts
@@ -6,6 +6,8 @@ import "./fill/environmentService";
 import "./fill/vscodeTextmate";
 import "./fill/codeEditor";
 import "./fill/mouseEvent";
+import "./fill/menuRegistry";
+import "./fill/workbenchRegistry";
 import { PasteAction } from "./fill/paste";
 import "./fill/dom";
 import "./vscode.scss";
diff --git a/packages/vscode/src/fill/menuRegistry.ts b/packages/vscode/src/fill/menuRegistry.ts
new file mode 100644
index 000000000..c1f41f472
--- /dev/null
+++ b/packages/vscode/src/fill/menuRegistry.ts
@@ -0,0 +1,21 @@
+import { logger } from "@coder/logger";
+import { IDisposable } from "vs/base/common/lifecycle";
+import * as actions from "vs/platform/actions/common/actions";
+import { ToggleDevToolsAction } from "vs/workbench/electron-browser/actions";
+
+// Intercept appending menu items so we can skip items that won't work.
+const originalAppend = actions.MenuRegistry.appendMenuItem.bind(actions.MenuRegistry);
+actions.MenuRegistry.appendMenuItem = (id: actions.MenuId, item: actions.IMenuItem | actions.ISubmenuItem): IDisposable => {
+	if (actions.isIMenuItem(item)) {
+		switch (item.command.id) {
+			case ToggleDevToolsAction.ID: // There appears to be no way to toggle this programmatically.
+				logger.debug(`Skipping unsupported menu item ${item.command.id}`);
+
+				return {
+					dispose: (): void => undefined,
+				};
+		}
+	}
+
+	return originalAppend(id, item);
+};
diff --git a/packages/vscode/src/fill/windowsService.ts b/packages/vscode/src/fill/windowsService.ts
index 6945e8d4a..5f68d98dc 100644
--- a/packages/vscode/src/fill/windowsService.ts
+++ b/packages/vscode/src/fill/windowsService.ts
@@ -87,7 +87,7 @@ class WindowsService implements IWindowsService {
 	}
 
 	public toggleDevTools(_windowId: number): Promise<void> {
-		throw new Error("not implemented");
+		throw new Error("Toggling developer tools from JavaScript is not supported.");
 	}
 
 	public closeWorkspace(_windowId: number): Promise<void> {
diff --git a/packages/vscode/src/fill/workbenchRegistry.ts b/packages/vscode/src/fill/workbenchRegistry.ts
new file mode 100644
index 000000000..85e628400
--- /dev/null
+++ b/packages/vscode/src/fill/workbenchRegistry.ts
@@ -0,0 +1,23 @@
+import { logger } from "@coder/logger";
+import { IDisposable } from "vs/base/common/lifecycle";
+import { Registry } from "vs/platform/registry/common/platform";
+import { IWorkbenchActionRegistry, Extensions } from "vs/workbench/common/actions";
+import { SyncActionDescriptor } from "vs/platform/actions/common/actions";
+import { ContextKeyExpr } from "vs/platform/contextkey/common/contextkey";
+import { ToggleDevToolsAction } from "vs/workbench/electron-browser/actions";
+
+// Intercept adding workbench actions so we can skip actions that won't work.
+const registry = Registry.as<IWorkbenchActionRegistry>(Extensions.WorkbenchActions);
+const originalRegister = registry.registerWorkbenchAction.bind(registry);
+registry.registerWorkbenchAction = (descriptor: SyncActionDescriptor, alias: string, category?: string, when?: ContextKeyExpr): IDisposable => {
+	switch (descriptor.id) {
+		case ToggleDevToolsAction.ID: // There appears to be no way to toggle this programmatically.
+			logger.debug(`Skipping unsupported workbench action ${descriptor.id}`);
+
+			return {
+				dispose: (): void => undefined,
+			};
+	}
+
+	return originalRegister(descriptor, alias, category, when);
+};