Introduction
vsceasy is a CLI that scaffolds and grows VS Code extensions. It is codegen, not a runtime you ship — your extension has no dependency on vsceasy at run time. The CLI writes plain TypeScript + React into your project; you own and edit it.
What you get
Section titled “What you get”- File-based routing. One file per panel, command, menu, tree view,
subpanel, or status bar item. A
genstep scans the convention directories and writessrc/extension/_registry.tspluspackage.json#contributes. - Typed RPC. A single interface in
src/shared/api.tstypes both the extension handlers and the webview client. Callapi.method(...)— no manual message plumbing. - React webviews. Panels and subpanels render React, themed with VS Code CSS
variables. Optional UI templates (
form,list,dashboard) start you from a working screen. - A mini-ORM.
db init+model addgive you typed entities with a filesystem-backed store.crud addscaffolds a full list + form UI over a model. - Editor-surface primitives. Completions, ghost text, hovers, typing guards (intercept keystrokes, paste and deletions), decorations, and terminals — the same one-file-per-feature convention. See Editor surface.
- A built-in LLM client. Ollama or any OpenAI-compatible endpoint over
fetch, with streaming, JSON mode, model auto-resolution and settings-driven configuration. No SDK dependency. See The LLM client. - Operational helpers. Jobs (interval / daily / event / file watch), runtime helpers (secrets, config, state, notifications, cache, colorize), a test harness, and publish tooling.
When to use it
Section titled “When to use it”Reach for vsceasy when you’re building a webview-heavy extension and want to skip
the boilerplate: panel registration, the RPC bridge, the build pipeline, and the
contributes bookkeeping. You stay in plain VS Code APIs everywhere it matters —
vsceasy just removes the repetitive wiring.
It isn’t only for webviews. create --type language scaffolds a full
language extension (grammar, snippets, file icon,
scoped colors) with no React at all, and --type empty gives you a bare
extension with the same file-based routing. See the
showcase for one of each.
How it fits together
Section titled “How it fits together”flowchart LR CLI["vsceasy CLI"] -->|scaffolds| PROJ["your extension"] PROJ --> GEN["bun run gen"] GEN --> REG["_registry.ts"] GEN --> CONTRIB["package.json#contributes"] REG --> BOOT["bootstrap(registry)"] BOOT --> VSCODE["VS Code on activate"]
Next: Quick start to scaffold a project, or Concepts for the mental model.