diff --git a/changelog/2025-02-addedLanguagesToDocs.md b/changelog/2025-02-addedLanguagesToDocs.md
new file mode 100644
index 0000000000..f94812f99c
--- /dev/null
+++ b/changelog/2025-02-addedLanguagesToDocs.md
@@ -0,0 +1,6 @@
+---
+tags: [documentation]
+pullRequest: 2859
+---
+
+- Added languages sidebar to documents page. Here you can see the supported scope facets for each language.
diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts
index 49599e44f2..488f87ce3f 100644
--- a/packages/common/src/index.ts
+++ b/packages/common/src/index.ts
@@ -93,6 +93,7 @@ export * from "./types/TreeSitter";
 export * from "./types/tutorial.types";
 export * from "./util";
 export * from "./util/camelCaseToAllDown";
+export * from "./util/capitalize";
 export * from "./util/clientSupportsFallback";
 export * from "./util/CompositeKeyDefaultMap";
 export * from "./util/CompositeKeyMap";
diff --git a/packages/common/src/util/capitalize.ts b/packages/common/src/util/capitalize.ts
new file mode 100644
index 0000000000..7519095d07
--- /dev/null
+++ b/packages/common/src/util/capitalize.ts
@@ -0,0 +1,3 @@
+export function capitalize(str: string) {
+  return str.charAt(0).toUpperCase() + str.slice(1);
+}
diff --git a/packages/cursorless-org-docs/src/css/custom.css b/packages/cursorless-org-docs/src/css/custom.css
index f6b6fa3065..e85ded5046 100644
--- a/packages/cursorless-org-docs/src/css/custom.css
+++ b/packages/cursorless-org-docs/src/css/custom.css
@@ -28,3 +28,23 @@
 .hidden {
   display: none;
 }
+
+.card {
+  border: 1px solid rgba(0, 0, 0, 0.175);
+  margin-bottom: 1rem;
+}
+
+.card-header {
+  background-color: #f8f9fa;
+  border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+  padding: 0.5rem 1rem;
+  cursor: pointer;
+}
+
+.card-body {
+  padding: 1rem;
+}
+
+.facet-name {
+  font-weight: 600;
+}
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/ScopeSupport.tsx
deleted file mode 100644
index d291f722d1..0000000000
--- a/packages/cursorless-org-docs/src/docs/user/languages/ScopeSupport.tsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import {
-  ScopeSupportFacetLevel,
-  languageScopeSupport,
-  scopeSupportFacets,
-  type ScopeSupportFacet,
-} from "@cursorless/common";
-import React from "react";
-
-interface Props {
-  languageId: string;
-}
-
-export default function ScopeSupport({ languageId }: Props) {
-  const scopesSorted = [...scopeSupportFacets].sort();
-  const scopeSupport = languageScopeSupport[languageId] ?? {};
-
-  const supportedScopes = scopesSorted.filter(
-    (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supported,
-  );
-  const supportedLegacyScopes = scopesSorted.filter(
-    (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supportedLegacy,
-  );
-  const unsupportedScopes = scopesSorted.filter(
-    (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.unsupported,
-  );
-  const unspecifiedScopes = scopesSorted.filter(
-    (facet) => scopeSupport[facet] == null,
-  );
-
-  return (
-    <>
-      {getContentForSupportLevel(
-        supportedScopes,
-        "Supported facets",
-        "These facets are supported",
-      )}
-      {getContentForSupportLevel(
-        supportedLegacyScopes,
-        "Supported Legacy facets",
-        "These facets are supported with the legacy implementation and should be migrated to the new implementation",
-      )}
-      {getContentForSupportLevel(
-        unsupportedScopes,
-        "Unsupported facets",
-        "These facets are not supported yet and needs a developer to implement them",
-      )}
-      {getContentForSupportLevel(
-        unspecifiedScopes,
-        "Unspecified facets",
-        <>
-          These facets are unspecified <br />
-          <i>
-            Note that in many instances we actually do support these scopes, but
-            we have not yet updated `languageScopeSupport` to reflect this fact
-          </i>
-        </>,
-      )}
-    </>
-  );
-}
-
-function getContentForSupportLevel(
-  facets: ScopeSupportFacet[],
-  title: string,
-  description: React.ReactNode,
-) {
-  if (facets.length === 0) {
-    return null;
-  }
-  return (
-    <div>
-      <h3>{title}</h3>
-      <p>{description}</p>
-
-      <ul>
-        {facets.map((facet) => (
-          <li>{facet}</li>
-        ))}
-      </ul>
-    </div>
-  );
-}
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/_category_.json b/packages/cursorless-org-docs/src/docs/user/languages/_category_.json
deleted file mode 100644
index e7b327b868..0000000000
--- a/packages/cursorless-org-docs/src/docs/user/languages/_category_.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "className": "hidden"
-}
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/c.mdx b/packages/cursorless-org-docs/src/docs/user/languages/c.mdx
index 561b32b48f..ce075f921b 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/c.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/c.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # C
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx b/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx
index a430ed47e4..55c123d0c4 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Clojure
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/Language.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/Language.tsx
similarity index 55%
rename from packages/cursorless-org-docs/src/docs/user/languages/Language.tsx
rename to packages/cursorless-org-docs/src/docs/user/languages/components/Language.tsx
index 811d3377ee..1fa19d671d 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/Language.tsx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/components/Language.tsx
@@ -1,10 +1,10 @@
 import React from "react";
-import ScopeSupport from "./ScopeSupport";
+import { ScopeSupport } from "./ScopeSupport";
 
 interface Props {
   languageId: string;
 }
 
-export default function Language({ languageId }: Props) {
+export function Language({ languageId }: Props) {
   return <ScopeSupport languageId={languageId} />;
 }
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx
new file mode 100644
index 0000000000..fc344857a4
--- /dev/null
+++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx
@@ -0,0 +1,80 @@
+import {
+  ScopeSupportFacetLevel,
+  languageScopeSupport,
+  scopeSupportFacets,
+} from "@cursorless/common";
+import React from "react";
+import { ScopeSupportForLevel } from "./ScopeSupportForLevel";
+
+interface Props {
+  languageId: string;
+}
+
+export function ScopeSupport({ languageId }: Props): JSX.Element {
+  const scopesSorted = [...scopeSupportFacets].sort();
+  const scopeSupport = languageScopeSupport[languageId] ?? {};
+
+  const supportedScopes = scopesSorted.filter(
+    (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supported,
+  );
+  const supportedLegacyScopes = scopesSorted.filter(
+    (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supportedLegacy,
+  );
+  const unsupportedScopes = scopesSorted.filter(
+    (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.unsupported,
+  );
+  const unspecifiedScopes = scopesSorted.filter(
+    (facet) => scopeSupport[facet] == null,
+  );
+
+  return (
+    <>
+      <h2>Scopes</h2>
+
+      <ScopeSupportForLevel
+        facets={supportedScopes}
+        title="Supported facets"
+        subtitle="These facets are supported"
+        expanded
+      />
+
+      <ScopeSupportForLevel
+        facets={supportedLegacyScopes}
+        title="Supported Legacy facets"
+        subtitle="These facets are supported with the legacy implementation and should be migrated to the new implementation"
+      />
+
+      <ScopeSupportForLevel
+        facets={unsupportedScopes}
+        title="Unsupported facets"
+        subtitle="These facets are not supported yet and needs a developer to implement them"
+        description={
+          <>
+            We would happily accept{" "}
+            <a href="https://www.cursorless.org/docs/contributing/adding-a-new-scope">
+              contributions
+            </a>
+          </>
+        }
+      />
+
+      <ScopeSupportForLevel
+        facets={unspecifiedScopes}
+        title="Unspecified facets"
+        subtitle="These facets are unspecified"
+        description={
+          <>
+            Note that in many instances we actually do support these scopes and
+            facets, but we have not yet updated 'languageScopeSupport' to
+            reflect this fact.
+            <br />
+            We would happily accept{" "}
+            <a href="https://www.cursorless.org/docs/contributing/adding-a-new-scope">
+              contributions
+            </a>
+          </>
+        }
+      />
+    </>
+  );
+}
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx
new file mode 100644
index 0000000000..1026ea64d9
--- /dev/null
+++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx
@@ -0,0 +1,119 @@
+import {
+  camelCaseToAllDown,
+  capitalize,
+  groupBy,
+  type ScopeSupportFacet,
+  type ScopeSupportFacetInfo,
+  scopeSupportFacetInfos,
+  type ScopeType,
+  type SimpleScopeTypeType,
+} from "@cursorless/common";
+import React, { useState } from "react";
+
+interface Props {
+  facets: ScopeSupportFacet[];
+  title: string;
+  subtitle: string;
+  description?: React.ReactNode;
+  expanded?: boolean;
+}
+
+export function ScopeSupportForLevel({
+  facets,
+  title,
+  subtitle,
+  description,
+  expanded: expandedProp,
+}: Props): JSX.Element | null {
+  const [expanded, setExpanded] = useState(expandedProp ?? false);
+
+  if (facets.length === 0) {
+    return null;
+  }
+
+  const renderBody = () => {
+    if (!expanded) {
+      return null;
+    }
+
+    const facetInfos = facets.map(
+      (facet): AugmentedFacetInfo => ({
+        facet,
+        ...scopeSupportFacetInfos[facet],
+      }),
+    );
+    const scopeGroups: Map<string, AugmentedFacetInfo[]> = groupBy(
+      facetInfos,
+      (facetInfo) => serializeScopeType(facetInfo.scopeType),
+    );
+    const scopeTypes = Array.from(scopeGroups.keys()).sort();
+
+    return (
+      <div className="card-body">
+        {description && <p>{description}</p>}
+
+        {scopeTypes.map((scopeType) => {
+          const facetInfos = scopeGroups.get(scopeType) ?? [];
+          return (
+            <div key={scopeType}>
+              <h4>{prettifyScopeType(scopeType)}</h4>
+              <ul>
+                {facetInfos.map((facetInfo) => {
+                  return (
+                    <li key={facetInfo.facet}>
+                      <span className="facet-name" title={facetInfo.facet}>
+                        {prettifyFacet(facetInfo.facet)}
+                      </span>
+                      : {facetInfo.description}
+                    </li>
+                  );
+                })}
+              </ul>
+            </div>
+          );
+        })}
+      </div>
+    );
+  };
+
+  return (
+    <div className="card">
+      <div className="card-header" onClick={() => setExpanded(!expanded)}>
+        <h3>{title}</h3>
+        {subtitle}
+      </div>
+
+      {renderBody()}
+    </div>
+  );
+}
+
+interface AugmentedFacetInfo extends ScopeSupportFacetInfo {
+  facet: ScopeSupportFacet;
+}
+
+function prettifyScopeType(scopeType: string): string {
+  return capitalize(camelCaseToAllDown(scopeType));
+}
+
+function prettifyFacet(facet: ScopeSupportFacet): string {
+  const parts = facet.split(".").map(camelCaseToAllDown);
+  if (parts.length === 1) {
+    return capitalize(parts[0]);
+  }
+  const isIteration = parts[parts.length - 1] === "iteration";
+  if (isIteration) {
+    parts.pop();
+  }
+  const name = capitalize(parts.slice(1).join(" "));
+  return isIteration ? `${name} (iteration)` : name;
+}
+
+function serializeScopeType(
+  scopeType: SimpleScopeTypeType | ScopeType,
+): string {
+  if (typeof scopeType === "string") {
+    return scopeType;
+  }
+  return scopeType.type;
+}
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx b/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx
index f4fd89dd05..86f2175a9d 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # C++
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx b/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx
index 2352ae98c8..64cbda64f4 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # C#
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/css.mdx b/packages/cursorless-org-docs/src/docs/user/languages/css.mdx
index c68e63f9cd..cb6de3f8a9 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/css.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/css.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # CSS
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx b/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx
index fe37a25c4f..7b18b06670 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx
@@ -1,5 +1,5 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
-# dart
+# Dart
 
 <Language languageId="dart"></Language>
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/go.mdx b/packages/cursorless-org-docs/src/docs/user/languages/go.mdx
index f4da2f5dec..3c0b9c041e 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/go.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/go.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Go
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/html.mdx b/packages/cursorless-org-docs/src/docs/user/languages/html.mdx
index 603c34f00d..34304c31e1 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/html.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/html.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # HTML
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/java.mdx b/packages/cursorless-org-docs/src/docs/user/languages/java.mdx
index bc895469cb..77d64f7276 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/java.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/java.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Java
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx b/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx
index 66b80498ab..4a86aa892d 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Javascript
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx b/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx
index 6f9b4b8779..72272270cc 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Javascript react
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/json.mdx b/packages/cursorless-org-docs/src/docs/user/languages/json.mdx
index 732709bfe9..076ad1aebb 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/json.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/json.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # JSON
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx b/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx
index a83af5d7bd..d9d32c3ac5 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # JSON with comments (JSONC)
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx b/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx
index 03614b7850..5e5cb9851a 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # JSON lines (JSONL)
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx b/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx
index c56cfbccfa..2122e8b23b 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Latex
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx b/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx
index f0722123cf..f76d593649 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Lua
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx b/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx
index 4b53715921..e6a256e223 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Markdown
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/php.mdx b/packages/cursorless-org-docs/src/docs/user/languages/php.mdx
index f46cb45e51..9551cb922e 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/php.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/php.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # PHP
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/python.mdx b/packages/cursorless-org-docs/src/docs/user/languages/python.mdx
index f84d93f9b2..250536d69d 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/python.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/python.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Python
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx b/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx
index 434490a711..9f9215458b 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Ruby
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx b/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx
index f4bd8d55ab..d0b1f73959 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Rust
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx b/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx
index 921ad69194..ffba794182 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Scala
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx b/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx
index 2c6e3d7a44..cca1d1e187 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Tree sitter query language (scm)
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx b/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx
index 44891422a4..e86ec7e2a3 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # SCSS
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx b/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx
index 9072d500ed..47c6cc1c98 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Talon
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx b/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx
index 855dfa95f1..c8588b5f63 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Typescript
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx b/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx
index e8af5501f9..fe16d1c820 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Typescript react
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx b/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx
index a6176bec74..b61d67a423 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # XML
 
diff --git a/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx b/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx
index b44892f5ac..9ba23a4a87 100644
--- a/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx
+++ b/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx
@@ -1,4 +1,4 @@
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # Yaml
 
diff --git a/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts b/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts
index e20fbe3649..57c3b6e82c 100644
--- a/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts
+++ b/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts
@@ -14,7 +14,7 @@ export function updateLanguageMdxConfig(
   }
 
   const expected = `
-import Language from "./Language";
+import { Language } from "./components/Language";
 
 # ${languageId}
 
diff --git a/packages/test-case-recorder/src/TestCaseRecorder.ts b/packages/test-case-recorder/src/TestCaseRecorder.ts
index d70ace7e79..fb6dd24c6b 100644
--- a/packages/test-case-recorder/src/TestCaseRecorder.ts
+++ b/packages/test-case-recorder/src/TestCaseRecorder.ts
@@ -12,6 +12,7 @@ import type {
   TextEditorOptions,
 } from "@cursorless/common";
 import {
+  capitalize,
   DEFAULT_TEXT_EDITOR_OPTIONS_FOR_TEST,
   extractTargetedMarks,
   getKey,
@@ -507,10 +508,6 @@ function camelize(str: string) {
     .join("");
 }
 
-function capitalize(str: string) {
-  return str.charAt(0).toUpperCase() + str.slice(1);
-}
-
 async function readJsonIfExists(
   path: string,
 ): Promise<RecordTestCaseCommandOptions> {