Getting Started
Build extensions for SrcNexus Code Editor to add commands, themes, formatters, editor enhancements, and more.
What Extensions Can Do
Extensions run in isolated JavaScript environments and communicate with the editor through an SDK. With extensions, you can:
- Add commands to the command palette and bind them to actions
- Create themes with custom editor and app colors
- Register formatters for code formatting
- Extend the editor with CodeMirror 6 plugins (keymaps, decorations, linting)
- Add UI elements like status bar items, drawer icons, and bottom sheets
- Access APIs for file system, terminal, storage, network, and more
- Provide snippets for quick code insertion
The packages you will use
Extension development uses three npm packages, all published by SrcNexus:
| Package | Role |
|---|---|
@srcnexus/create-extension | Scaffolds the project (npm create @srcnexus/extension) |
@srcnexus/ext-sdk | The SDK your code imports (editor.*) |
srcnexus | CLI that deploys the finished extension |
See CLI & npm Packages for install commands and versions.
Getting Started
Using the CLI
Run the scaffolding tool to generate a ready-to-go extension project. It is published on npm as @srcnexus/create-extension:
npm create @srcnexus/extension
The CLI will prompt you for an extension name, language (JavaScript or TypeScript), and other options. You can also run it non-interactively:
npm create @srcnexus/extension -- --name "My Extension" --lang ts -y
This generates manifest.json, build.js, and an entry point (src/main.ts or src/main.js) with a sample command already wired up.
Using the Create Extension extension
Install the Create Extension extension from the store. It provides a guided setup directly inside the editor.
Build and Install
The generated build.js uses esbuild to bundle your extension. Run:
npm run build
The generated package.json already depends on @srcnexus/ext-sdk, so npm install pulls the SDK and its TypeScript types for you.
This bundles your TypeScript/JavaScript source into dist/main.js. No manual zipping is needed — when you publish through the extension manager, the app automatically packages the required files (manifest.json, icon.png, and the bundled JS) into a distributable archive.
For CodeMirror plugins, uncomment the CM build section in build.js.
The extension runtime
Extension code runs in an embedded JavaScript engine, not in a browser and not in Node.js. That means a lot of globals you may reach for by habit simply are not there.
Available
- Standard ECMAScript:
JSON,Math,Date,Promise,Map,Set,RegExp, typed arrays,async/await console.log/warn/error/info— forwarded to the extension log panelfetch()andHeaders, polyfilled by the SDK on top of the host network layerrequire()for sibling modules inside your extension bundle- Everything under
editor.*from the SDK
Not available
atob,btoa,TextEncoder,TextDecoder— calling them throwsReferenceError. See File System API for drop-in replacements.window,documentand the rest of the DOM — use a webview if you need UIlocalStorage/sessionStorage— use Storage API instead- Node built-ins (
fs,path,process,Buffer) — use File System API instead setIntervaltimers that outlive the extension — clean up inonDispose
Anything you bundle is compiled into a single file by esbuild, so npm packages are fine as long as they do not touch the DOM or Node built-ins at runtime.
Next Steps
- Manifest Reference — Full schema for
manifest.json - Commands API — Register commands and hooks
- Themes — Create custom themes
- Contribution Points — All contribution types
- Permissions — Declare required permissions
- Publishing — Publish to the extension store
- CLI & npm Packages —
srcnexus,@srcnexus/create-extension,@srcnexus/ext-sdk