The code editor you can take apart. A familiar VS Code experience on top of a Rust core that ships as libraries — swap the editor, replace the terminal, or embed the whole session in your own app.
Ecosystem
| If you want to… | DSCode gives you |
|---|---|
| Edit code, fast | A VS Code-like desktop app with sub-second startup and ~60% less memory |
| Keep your existing extensions | A full Node.js extension host with the vscode.* API, sandboxed by default |
| Build your own tool on top | Six Rust crates — text buffer, LSP, DAP, terminal, extension host, session — that compose any way you like |
| Run an editor headlessly | The same session, workspace, and extension layer with no UI attached |
sandbox-exec, Linux bubblewrap, Windows Job Objects).Download a prebuilt release from the Releases page, or build from source — see Quickstart.
Every subsystem is a separate crate with a clean API. cargo add what you need, ignore the rest. The desktop app itself is just one composition of these crates — yours can be different.
[dependencies]
dscode-core = "0.3" # rope text buffer, app directories
dscode-lsp = "0.3" # LSP client, manager, pool
dscode-dap = "0.3" # Debug Adapter Protocol
dscode-terminal = "0.3" # PTY lifecycle, event sender trait
dscode-extension-host = "0.3" # sandbox, IPC, permissions, rate limiter
dscode-session = "0.3" # workspace, configuration, lifecycle
Beyond Rust: npm i @dscode/monaco-wasm, pip install dscode-core.
use dscode_core::{TextBuffer, AppDirectories};
let buffer = TextBuffer::new("Hello, world!");
println!("{} chars", buffer.len_chars());
let dirs = AppDirectories::resolve(None);
println!("Config dir: {:?}", dirs.config_dir);
use dscode_lsp::{LspManager, LspServerPool, LspServerStrategy};
let pool = LspServerPool::new(LspServerStrategy::OnePerLanguage);
let manager = LspManager::new(pool);
manager.register_server("rust", "rust-analyzer", vec!["--stdio".into()]);
Each crate has optional Tauri integration via a feature flag, so the same crate works in a desktop app or a headless CI runner:
dscode-terminal = { version = "0.3", features = ["tauri"] }
See the Library Guide for the full tour.
| Crate | What it gives you | Install |
|---|---|---|
dscode-core | Rope-based TextBuffer, AppDirectories, CoreError | cargo add dscode-core |
dscode-lsp | LSP client, manager, connection pool | cargo add dscode-lsp |
dscode-dap | Debug Adapter Protocol client, manager, pool | cargo add dscode-dap |
dscode-extension-host | Host manager, IPC, sandbox, permissions, rate limiter, secrets | cargo add dscode-extension-host |
dscode-terminal | Terminal manager, PTY lifecycle, TerminalEventSender trait | cargo add dscode-terminal |
dscode-session | Session manager, extension lifecycle, workspace, configuration | cargo add dscode-session |
| Subsystem | Default | Swap for |
|---|---|---|
| Editor | Monaco (via monaco-wasm) | A WebGL renderer, a Vim core, or a plain textarea |
| Extension host | Node.js + NNG IPC | A Wasm runtime, a Lua engine, or nothing at all |
| Terminal | xterm.js + portable-pty | Alacritty, your own ANSI parser, or a remote SSH session |
| UI framework | Svelte 4 | React, Solid, Vue, or raw DOM |
| Session state | dscode-session with Tauri | The same crate without Tauri, for headless CI |
| Text storage | ropey (dscode-core::TextBuffer) | A gap buffer, a piece table, or a CRDT |
| LSP client | dscode-lsp::LspManager | Direct LspClient use, or a custom protocol handler |
dscode-session without the tauri feature to scan workspaces, run extensions, and emit diagnostics as JSON.TerminalEventSender from dscode-terminal and forward PTY output to a websocket, a log file, or your own renderer.dscode-session with the tauri feature and you have the full IDE session inside your application.dscode-lsp exposes LspClient directly if you'd rather build a bespoke manager.dscode-core::AppDirectories with the CSS-custom-property theme layer to preview themes in real time.Code examples for each are in docs/library-guide.md.
TerminalEventSender, LspClient, TextBuffer) so you can swap implementations without touching the rest of the system.┌──────────────────────────────────────────────────────────────┐
│ Tauri Window (WebKit/Chromium) │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Frontend (Svelte 4 + TypeScript) │ │
│ │ - Monaco Editor │ │
│ │ - Svelte Components (38 components) │ │
│ │ - CSS Custom Properties (VS Code theme compat) │ │
│ │ - ARIA accessibility, focus traps │ │
│ └──────────────────────┬─────────────────────────────────┘ │
│ │ Tauri IPC (invoke/emit) │
│ ┌──────────────────────▼─────────────────────────────────┐ │
│ │ Rust Binary (src-tauri) │ │
│ │ - SessionManager (central coordinator) │ │
│ │ - Tauri Command Handlers (45 modules) │ │
│ │ - Bootstrap, Logging, Monitoring, File Watcher │ │
│ └──────────┬─────────────────────────────────────────────┘ │
└─────────────┼────────────────────────────────────────────────┘
│ depends on
┌─────────────▼────────────────────────────────────────────────┐
│ Cargo Workspace Library Crates │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ dscode-core │ │ dscode-lsp │ │ dscode-dap │ │
│ │ TextBuffer │ │ LspClient │ │ DebugAdapter │ │
│ │ AppDirs │ │ LspManager │ │ DebugManager │ │
│ │ CoreError │ │ LspPool │ │ DapPool │ │
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
│ ┌──────────────────────┐ ┌──────────────┐ │
│ │ dscode-extension-host│ │ dscode-term │ │
│ │ HostManager │ │ TermManager │ │
│ │ IPC + Sandbox │ │ PTY │ │
│ │ Permissions + Rate │ │ EventSender │ │
│ │ Secrets + Validator │ │ TermError │ │
│ └──────────────────────┘ └──────────────┘ │
│ ┌──────────────────────────────────────────────────────────┐│
│ │ dscode-session ││
│ │ ConfigStore, ExtensionLifecycle, Workspace, Documents, ││
│ │ Contributions, EventEmitter, SessionState ││
│ └──────────────────────────────────────────────────────────┘│
└──────────────────────────────────────────────────────────────┘
│ NNG IPC (nanomsg, serde_json)
┌──────────┴────────────┬─────────────┐
│ │ │
┌─▼─────────┐ ┌──────▼────┐ ┌────▼────┐
│ Extension │ │ LSP │ │ Debug │
│ Host │ │ Server │ │ DAP │
│ (Node.js) │ │ │ │ Server │
└───────────┘ └───────────┘ └─────────┘
Frontend — Svelte 4, Monaco Editor, xterm.js, lucide-svelte, CSS custom properties for VS Code theme compatibility.
Backend (Rust) — Tauri 2.1, Tauri Commands + NNG for out-of-process IPC, ropey text buffers, tree-sitter parsing, tower-lsp, git2, portable-pty, tracing, thiserror, ripgrep-based search.
Extension runtime — a real Node.js process, NNG REQ/REP IPC with worker threads, full vscode.* API surface, OS-keyring-backed SecretStorage, deny-by-default sandbox.
cargonpmlibwebkit2gtk-4.1-dev, libssl-dev, libgtk-3-dev, librsvg2-dev, patchelfgit clone https://github.com/dipankar/dscode.git
cd dscode
npm install
npm run tauri:dev # development with hot reload
npm run tauri:build # production bundle
Production artefacts land in:
src-tauri/target/release/bundle/macos/DSCode.appsrc-tauri/target/release/bundle/deb/dscode_*_amd64.debsrc-tauri/target/release/bundle/msi/DSCode_*_x64.msicargo test --workspace # all crate tests
cargo test -p dscode-core # one crate
cargo clippy --workspace -- -D warnings # lint
dscode/
├── Cargo.toml # workspace root
├── crates/
│ ├── dscode-core/ # TextBuffer, AppDirectories
│ ├── dscode-lsp/ # LSP client, manager, pool
│ ├── dscode-dap/ # Debug Adapter Protocol
│ ├── dscode-extension-host/# Extension host management
│ ├── dscode-terminal/ # Terminal manager
│ └── dscode-session/ # Session management
├── src-tauri/ # Tauri binary (the default app)
│ └── src/
│ ├── main.rs
│ ├── bootstrap.rs
│ ├── session/ # SessionManager + IPC
│ └── commands/ # 45 Tauri command modules
├── monaco-wasm/ # Monaco WASM bindings
├── extension-host/ # Node.js extension runtime
├── src/ # Svelte frontend (38 components)
├── packages/ # npm and pypi bindings
└── docs/ # Documentation
DSCode's extension host isn't a compatibility shim — it's a full Node.js runtime speaking the same IPC protocol as VS Code. Extensions are first-class citizens, but they're also sandboxed and observable.
| Extension type | Compatibility | Notes |
|---|---|---|
| Pure JavaScript / TypeScript | Full | ESLint, Prettier, GitLens, etc. |
| Native Node modules | Full | Python extension, C/C++ tools |
| Language providers | Full | 18+ provider types via IPC |
| Webview extensions | Partial | Tauri webview API |
| Electron API users | Partial | Shim layer for common APIs |
| Proprietary (Microsoft) | Reimplement | Copilot, IntelliCode |
Language providers supported with full two-way IPC: Hover, Completion, Diagnostics, SignatureHelp, Rename, CodeLens, CodeActions, Formatting, DocumentHighlights, FoldingRanges, SemanticTokens, DocumentSymbols, WorkspaceSymbols, Definitions, References, DocumentLinks, ColorPresentations, InlineCompletions.
Extras DSCode adds on top of the VS Code API:
package.json. Denied by default.vscode.SecretStorage is backed by the OS-native keyring.sandbox-exec, Linux bubblewrap, Windows Job Objects.package.json cross-validation.See SECURITY.md for the disclosure process.
DSCode is a community project. Contributions are welcome — whether you're fixing a bug, adding a feature, or replacing an entire subsystem.
Adding a new crate
crates/my-crate/ with a Cargo.toml that inherits [workspace.package]."crates/my-crate" to [workspace].members in the root Cargo.toml.README.md with badges, install instructions, and a usage example.examples/ directory with at least one runnable example.cargo publish --dry-run.Replacing a subsystem
Full guidelines in CONTRIBUTING.md.
Rust
51.0%
TypeScript
33.0%
Svelte
13.7%
The code editor you can take apart. A familiar VS Code experience on top of a Rust core that ships as libraries — swap the editor, replace the terminal, or embed the whole session in your own app.
Ecosystem
| If you want to… | DSCode gives you |
|---|---|
| Edit code, fast | A VS Code-like desktop app with sub-second startup and ~60% less memory |
| Keep your existing extensions | A full Node.js extension host with the vscode.* API, sandboxed by default |
| Build your own tool on top | Six Rust crates — text buffer, LSP, DAP, terminal, extension host, session — that compose any way you like |
| Run an editor headlessly | The same session, workspace, and extension layer with no UI attached |
sandbox-exec, Linux bubblewrap, Windows Job Objects).Download a prebuilt release from the Releases page, or build from source — see Quickstart.
Every subsystem is a separate crate with a clean API. cargo add what you need, ignore the rest. The desktop app itself is just one composition of these crates — yours can be different.
[dependencies]
dscode-core = "0.3" # rope text buffer, app directories
dscode-lsp = "0.3" # LSP client, manager, pool
dscode-dap = "0.3" # Debug Adapter Protocol
dscode-terminal = "0.3" # PTY lifecycle, event sender trait
dscode-extension-host = "0.3" # sandbox, IPC, permissions, rate limiter
dscode-session = "0.3" # workspace, configuration, lifecycle
Beyond Rust: npm i @dscode/monaco-wasm, pip install dscode-core.
use dscode_core::{TextBuffer, AppDirectories};
let buffer = TextBuffer::new("Hello, world!");
println!("{} chars", buffer.len_chars());
let dirs = AppDirectories::resolve(None);
println!("Config dir: {:?}", dirs.config_dir);
use dscode_lsp::{LspManager, LspServerPool, LspServerStrategy};
let pool = LspServerPool::new(LspServerStrategy::OnePerLanguage);
let manager = LspManager::new(pool);
manager.register_server("rust", "rust-analyzer", vec!["--stdio".into()]);
Each crate has optional Tauri integration via a feature flag, so the same crate works in a desktop app or a headless CI runner:
dscode-terminal = { version = "0.3", features = ["tauri"] }
See the Library Guide for the full tour.
| Crate | What it gives you | Install |
|---|---|---|
dscode-core | Rope-based TextBuffer, AppDirectories, CoreError | cargo add dscode-core |
dscode-lsp | LSP client, manager, connection pool | cargo add dscode-lsp |
dscode-dap | Debug Adapter Protocol client, manager, pool | cargo add dscode-dap |
dscode-extension-host | Host manager, IPC, sandbox, permissions, rate limiter, secrets | cargo add dscode-extension-host |
dscode-terminal | Terminal manager, PTY lifecycle, TerminalEventSender trait | cargo add dscode-terminal |
dscode-session | Session manager, extension lifecycle, workspace, configuration | cargo add dscode-session |
| Subsystem | Default | Swap for |
|---|---|---|
| Editor | Monaco (via monaco-wasm) | A WebGL renderer, a Vim core, or a plain textarea |
| Extension host | Node.js + NNG IPC | A Wasm runtime, a Lua engine, or nothing at all |
| Terminal | xterm.js + portable-pty | Alacritty, your own ANSI parser, or a remote SSH session |
| UI framework | Svelte 4 | React, Solid, Vue, or raw DOM |
| Session state | dscode-session with Tauri | The same crate without Tauri, for headless CI |
| Text storage | ropey (dscode-core::TextBuffer) | A gap buffer, a piece table, or a CRDT |
| LSP client | dscode-lsp::LspManager | Direct LspClient use, or a custom protocol handler |
dscode-session without the tauri feature to scan workspaces, run extensions, and emit diagnostics as JSON.TerminalEventSender from dscode-terminal and forward PTY output to a websocket, a log file, or your own renderer.dscode-session with the tauri feature and you have the full IDE session inside your application.dscode-lsp exposes LspClient directly if you'd rather build a bespoke manager.dscode-core::AppDirectories with the CSS-custom-property theme layer to preview themes in real time.Code examples for each are in docs/library-guide.md.
TerminalEventSender, LspClient, TextBuffer) so you can swap implementations without touching the rest of the system.┌──────────────────────────────────────────────────────────────┐
│ Tauri Window (WebKit/Chromium) │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Frontend (Svelte 4 + TypeScript) │ │
│ │ - Monaco Editor │ │
│ │ - Svelte Components (38 components) │ │
│ │ - CSS Custom Properties (VS Code theme compat) │ │
│ │ - ARIA accessibility, focus traps │ │
│ └──────────────────────┬─────────────────────────────────┘ │
│ │ Tauri IPC (invoke/emit) │
│ ┌──────────────────────▼─────────────────────────────────┐ │
│ │ Rust Binary (src-tauri) │ │
│ │ - SessionManager (central coordinator) │ │
│ │ - Tauri Command Handlers (45 modules) │ │
│ │ - Bootstrap, Logging, Monitoring, File Watcher │ │
│ └──────────┬─────────────────────────────────────────────┘ │
└─────────────┼────────────────────────────────────────────────┘
│ depends on
┌─────────────▼────────────────────────────────────────────────┐
│ Cargo Workspace Library Crates │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ dscode-core │ │ dscode-lsp │ │ dscode-dap │ │
│ │ TextBuffer │ │ LspClient │ │ DebugAdapter │ │
│ │ AppDirs │ │ LspManager │ │ DebugManager │ │
│ │ CoreError │ │ LspPool │ │ DapPool │ │
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
│ ┌──────────────────────┐ ┌──────────────┐ │
│ │ dscode-extension-host│ │ dscode-term │ │
│ │ HostManager │ │ TermManager │ │
│ │ IPC + Sandbox │ │ PTY │ │
│ │ Permissions + Rate │ │ EventSender │ │
│ │ Secrets + Validator │ │ TermError │ │
│ └──────────────────────┘ └──────────────┘ │
│ ┌──────────────────────────────────────────────────────────┐│
│ │ dscode-session ││
│ │ ConfigStore, ExtensionLifecycle, Workspace, Documents, ││
│ │ Contributions, EventEmitter, SessionState ││
│ └──────────────────────────────────────────────────────────┘│
└──────────────────────────────────────────────────────────────┘
│ NNG IPC (nanomsg, serde_json)
┌──────────┴────────────┬─────────────┐
│ │ │
┌─▼─────────┐ ┌──────▼────┐ ┌────▼────┐
│ Extension │ │ LSP │ │ Debug │
│ Host │ │ Server │ │ DAP │
│ (Node.js) │ │ │ │ Server │
└───────────┘ └───────────┘ └─────────┘
Frontend — Svelte 4, Monaco Editor, xterm.js, lucide-svelte, CSS custom properties for VS Code theme compatibility.
Backend (Rust) — Tauri 2.1, Tauri Commands + NNG for out-of-process IPC, ropey text buffers, tree-sitter parsing, tower-lsp, git2, portable-pty, tracing, thiserror, ripgrep-based search.
Extension runtime — a real Node.js process, NNG REQ/REP IPC with worker threads, full vscode.* API surface, OS-keyring-backed SecretStorage, deny-by-default sandbox.
cargonpmlibwebkit2gtk-4.1-dev, libssl-dev, libgtk-3-dev, librsvg2-dev, patchelfgit clone https://github.com/dipankar/dscode.git
cd dscode
npm install
npm run tauri:dev # development with hot reload
npm run tauri:build # production bundle
Production artefacts land in:
src-tauri/target/release/bundle/macos/DSCode.appsrc-tauri/target/release/bundle/deb/dscode_*_amd64.debsrc-tauri/target/release/bundle/msi/DSCode_*_x64.msicargo test --workspace # all crate tests
cargo test -p dscode-core # one crate
cargo clippy --workspace -- -D warnings # lint
dscode/
├── Cargo.toml # workspace root
├── crates/
│ ├── dscode-core/ # TextBuffer, AppDirectories
│ ├── dscode-lsp/ # LSP client, manager, pool
│ ├── dscode-dap/ # Debug Adapter Protocol
│ ├── dscode-extension-host/# Extension host management
│ ├── dscode-terminal/ # Terminal manager
│ └── dscode-session/ # Session management
├── src-tauri/ # Tauri binary (the default app)
│ └── src/
│ ├── main.rs
│ ├── bootstrap.rs
│ ├── session/ # SessionManager + IPC
│ └── commands/ # 45 Tauri command modules
├── monaco-wasm/ # Monaco WASM bindings
├── extension-host/ # Node.js extension runtime
├── src/ # Svelte frontend (38 components)
├── packages/ # npm and pypi bindings
└── docs/ # Documentation
DSCode's extension host isn't a compatibility shim — it's a full Node.js runtime speaking the same IPC protocol as VS Code. Extensions are first-class citizens, but they're also sandboxed and observable.
| Extension type | Compatibility | Notes |
|---|---|---|
| Pure JavaScript / TypeScript | Full | ESLint, Prettier, GitLens, etc. |
| Native Node modules | Full | Python extension, C/C++ tools |
| Language providers | Full | 18+ provider types via IPC |
| Webview extensions | Partial | Tauri webview API |
| Electron API users | Partial | Shim layer for common APIs |
| Proprietary (Microsoft) | Reimplement | Copilot, IntelliCode |
Language providers supported with full two-way IPC: Hover, Completion, Diagnostics, SignatureHelp, Rename, CodeLens, CodeActions, Formatting, DocumentHighlights, FoldingRanges, SemanticTokens, DocumentSymbols, WorkspaceSymbols, Definitions, References, DocumentLinks, ColorPresentations, InlineCompletions.
Extras DSCode adds on top of the VS Code API:
package.json. Denied by default.vscode.SecretStorage is backed by the OS-native keyring.sandbox-exec, Linux bubblewrap, Windows Job Objects.package.json cross-validation.See SECURITY.md for the disclosure process.
DSCode is a community project. Contributions are welcome — whether you're fixing a bug, adding a feature, or replacing an entire subsystem.
Adding a new crate
crates/my-crate/ with a Cargo.toml that inherits [workspace.package]."crates/my-crate" to [workspace].members in the root Cargo.toml.README.md with badges, install instructions, and a usage example.examples/ directory with at least one runnable example.cargo publish --dry-run.Replacing a subsystem
Full guidelines in CONTRIBUTING.md.
Rust
51.0%
TypeScript
33.0%
Svelte
13.7%