Extensions
Diode runs VS Code extensions unchanged: the same .vsix, the same extension API, in a separate
extension host process. TypeScript and JavaScript are built in; other languages and tools come
from the store, the same way they do in VS Code.
The store
Section titled “The store”The store at diode-editor.github.io/marketplace is a
curated index, not a mirror of Open VSX: every extension in it has been checked to work in a
terminal, and the latest version of each one is tested against every Diode build. The
.vsix files stay where their authors publish them (Open VSX or GitHub Releases); the index pins
a URL and a sha256 for every version.
Some extensions carry a Partial badge: the extension works, but some of its features need a browser or a GUI and are listed under “Does not work” on its page, before you install it. A typical example: the language server works, the extension’s webview chat or tree views don’t.
Today it has languages (Python, Go, Java, Terraform, Protocol Buffers), linters and formatters (ESLint, Prettier, ruff), themes, Claude Code with a diff tab for proposed edits, and inline completions; the store has the current list.
Installing from inside the editor
Section titled “Installing from inside the editor”Open the Extensions view with Ctrl+Shift+X (or Ctrl+K X in a terminal that can’t deliver
Ctrl+Shift, see Keyboard); it is also under View: Show Extensions in the command
palette. Type in the search box: results come in two groups, Marketplace and Installed.
Enter on a row opens the extension’s page with its description, the support note and the
buttons: Install, Update to x.y.z, Uninstall.
After an install or uninstall, run Reload Window (File menu or the command palette): extensions are loaded at startup, there is no hot reload. The catalog is fetched the first time you open the view; Extensions: Refresh reloads it.
Extensions update themselves, like in VS Code. Shortly after startup (never during it) and then every
12 hours diode checks the registry in the background; extensions with a newer compatible version are
installed, and one notification says Updated N extensions with a Reload Window button. The
window is never reloaded for you. A release is installed only once it is
extensions.autoUpdateDelay hours old (2 by default). Turn it all off with
"extensions.autoUpdate": "off" (outdated extensions are still marked, and
Extensions: Update All Extensions updates them), or stop the checks with
"extensions.autoCheckUpdates": false. To keep one extension at its version, uncheck Auto Update
on its page.
An update by hand is the Update to x.y.z button on the page, or Extensions: Check for Extension Updates and Extensions: Update All Extensions. An open window keeps working with the version it started with: the old files stay on disk and are removed the next time diode starts. The same goes for an uninstall.
To go back to an older version, press Install Specific Version… on the extension page (or run Extensions: Install Specific Version of Extension… from the command palette) and pick one of the versions that work with your build. A version chosen this way is pinned in the profile, like in VS Code: auto-update leaves it alone until you check Auto Update again.
From the command line
Section titled “From the command line”diode --install-extension charliermarsh.ruff # by id, from the storediode --install-extension publisher.name@1.2.3 # exactly this version, pinneddiode --install-extension ./my-extension.vsix # a local .vsixdiode --uninstall-extension charliermarsh.ruffdiode --list-extensionsdiode --disable-extensions . # start without user extensions, keep built-insIds are case-sensitive: golang.go, not golang.Go. Installing by id also installs the
extension’s dependencies. A .vsix from any source installs the same way; whether it works is up to
the API it uses, see below.
Where they live
Section titled “Where they live”Installed extensions go to ~/.diode/extensions (or <user-data-dir>/extensions with
--user-data-dir; --extensions-dir overrides either). Profiles each keep their own list of
extensions, like VS Code profiles: --profile <name> starts with that profile’s set.
What can’t work
Section titled “What can’t work”The ceiling is a terminal: anything that needs a browser is not supported, by design. When an
extension calls createWebviewPanel or registers a webview view or custom editor, the call is a
no-op: no panel opens, the rest of the extension keeps working, and one line in Output →
Extensions says which call it was. A failed activation of one extension never blocks the others;
the error goes to the Extension Host log channel.
Extensions run in their own process. If that process dies, Diode revives the extensions on their next activation event; Reload Window does it immediately.
The exact status of every API member is in the readiness matrix. If an extension you need misses a feature, that page says whether it is planned or impossible.
Publishing to the store
Section titled “Publishing to the store”An extension gets into the index through a pull request to
diode-editor/diode-editor.github.io: one
JSON file per extension under extensions/, with a URL and sha256 for each version. Versions are
immutable, pre-releases are rejected, and the bar is that the extension really works in Diode. The
format and the validator are described in that repository.