This repository contains extensions for the Athas editor. Extensions can provide language tooling support (LSP, formatting, linting, snippets), themes, icon themes, keymaps, and more.
Syntax highlighting is bundled in Athas core and is not managed by these extensions.
extensions/
bash/
extension.json # Extension manifest
lua/
extension.json # Extension manifest
tooling.json # Platform-specific tooling (pre-built LSP, formatter, linter binaries)
build.sh # Build script for tooling archives
...
registry.json # Extension registry
index.json # Extension index (for marketplace)
manifests.json # Combined manifests (auto-generated, do not edit manually)
scripts/ # Validation and generation scripts
extension.jsondefines the extension manifest (category, contributions, capabilities, tool references)tooling.json(optional) defines pre-built platform-specific binaries distributed as tarballs- Not every extension has a
tooling.json. Extensions without one rely on runtime-installed tools
-
Create a folder under
extensions/(lowercase, use underscores for multi-word names likec_sharp). -
Add an
extension.jsonmanifest:
{
"$schema": "https://athas.dev/schemas/extension.json",
"id": "athas.mylang",
"name": "MyLang",
"displayName": "MyLang",
"version": "1.0.0",
"description": "MyLang language support with LSP",
"publisher": "Athas",
"engines": {
"athas": ">=0.7.0"
},
"categories": ["Language"],
"contributes": {
"languages": [
{
"id": "mylang",
"extensions": [".ml"],
"filenames": ["MyLangfile"],
"filenamePatterns": ["*.mylang.json"],
"aliases": ["MyLang"]
}
]
}
}-
Add capability entries in
capabilitiesonly for tooling provided by the extension (lsp,formatter,linter, grammar assets as needed). Snippets, commands, themes, icon themes, agents, database providers, and keybindings should be declared undercontributes. -
Regenerate generated files:
bun run scripts/generate-manifests.ts bun run scripts/build-extensions-index.ts
-
Validate your extension:
bun run scripts/validate.ts
| Field | Type | Description |
|---|---|---|
id |
string | Unique identifier (format: publisher.name) |
name |
string | Short name |
version |
string | Semver version |
categories |
string[] | Extension categories (Language, Theme, Snippets, Keymaps, etc.) |
New manifests should prefer the declarative contributes model:
"contributes": {
"languages": [],
"snippets": [],
"themes": [],
"iconThemes": [],
"databaseProviders": [],
"agents": [],
"commands": [],
"keybindings": []
}Top-level arrays such as languages, themes, iconThemes, agents, and databaseProviders
are still supported for existing manifests. Validation, catalog generation, theme/icon packaging,
and database sidecar packaging read both forms.
Language contributions can match by file extension, exact filename, or filename pattern:
{
"id": "jsonc",
"extensions": [".jsonc"],
"filenames": ["tsconfig.json", "jsconfig.json"],
"filenamePatterns": ["tsconfig.*.json", "jsconfig.*.json"]
}Language- Language tooling support (LSP, formatter, linter, snippets, commands)Theme- Editor themesSnippets- Code snippetsKeymaps- Keyboard shortcut presetsFormatter- Code formattersLinter- Code lintersOther- Everything else
"lsp": {
"name": "pyright",
"runtime": "bun",
"package": "pyright",
"packages": ["optional-peer-dependency"],
"args": ["--stdio"]
}Use packages for runtime-managed companion packages that must be installed beside the primary package, such as TypeScript SDK packages required by JavaScript-based language servers.
Supported runtimes: bun, node, python, go, rust, binary
"formatter": {
"name": "black",
"runtime": "python",
"package": "black",
"args": ["--stdin-filename", "${file}", "-"]
}"linter": {
"name": "ruff",
"runtime": "python",
"package": "ruff",
"args": ["check", "--stdin-filename", "${file}", "--output-format", "json", "-"]
}-
Clone this repository alongside the main Athas repo:
athasdev/ athas/ # Main editor repo extensions/ # This repo -
Serve the extensions directory locally:
bunx serve . -
Point the editor to your local server:
VITE_PARSER_CDN_URL=http://localhost:3000/extensions bun run dev
bun run scripts/validate.tsCI runs this automatically on pull requests.