Two Real VS Code Extensions, Built with vsceasy (and What Each Feature Does) A developer built two real VS Code extensions using vsceasy, a CLI and framework that scaffolds projects with a React webview, a typed RPC bridge between the extension host and webview, and file-based routing for panels, commands, menus and tree views. The framework also provides a mini-ORM, an LLM client, editor-surface helpers and a language project type for grammar-based extensions. One of the extensions, Code Trainer, verifies every model-generated exercise by running its tests against both a reference solution (must pass) and a starter (must fail), rejecting and regenerating anything else. That 90-second video isn't a mockup. Every VS Code frame in it is a real screen recording: two extensions I built with vsceasy https://vsceasy.dev , running in VS Code, doing real work. Real keystrokes, real tests, a real local LLM answering. This post walks through what you see in the video and which part of the framework makes each piece possible. vsceasy is a CLI and a small framework for building VS Code extensions. It scaffolds a project with a React webview , a typed RPC bridge between the extension host and the webview, and file-based routing for panels, commands, menus and tree views. On top of that come a mini-ORM, an LLM client, editor-surface helpers ghost text, typing guards, decorations and a language project type for grammar-based extensions. bunx @vsceasy/cli create my-extension That gives you a working extension: a palette command, a webview panel, an RPC contract and a React UI, with package.json contributes wired for you. This is the layout the scaffold generates: src/ extension/extension.ts commands/hello.ts → palette command panels/dashboard.ts → webview panel shared/api.ts → RPC contract webview/panels/dashboard/App.tsx → React UI Drop a file into panels/ , commands/ , menus/ or treeViews/ and the generator registers it and updates contributes . You never hand-edit that block again. The piece I'm happiest with. You declare one interface: // shared/api.ts export interface DashboardApi { listFiles pattern: string : Promise