JavaScript
The JavaScript starter is a sidebar panel plus a content script, written in plain JavaScript. Start from it when you want a working extension in JavaScript before you change a line.
The toolbar icon opens the panel, and the panel shows the title of the page you are on. The content script adds an "Open sidebar" button to every page, inside a shadow root so page styles stay out. The background worker opens the panel when you click that button. There are no types and no framework. The sidebar is one function that builds DOM nodes, and the content script is one file.
| Surfaces | Sidebar, content script, action, background |
| Language | Plain JavaScript |
| Browsers | Chrome, Edge, Firefox |
| Source | extension-js/examples/javascript |
| Catalog page | templates.extension.dev/javascript |
From the terminal
One command creates the project and installs its dependencies. Then dev opens a browser with the extension loaded.
npx extension@latest create my-javascript --template javascript
cd my-javascript
npm run devFrom an agent
With the MCP server installed, one sentence does the same. The agent calls extension_create with this template, then extension_dev to run it.
Create a JavaScript extension called my-javascript and run itFrom the catalog
The catalog page runs the template live in the page, with its instructions and source one tab away. One click turns it into a private repository of your own. That click lands on Import with the template preselected.
Files
src/background.js
src/content/ContentApp.js
src/content/scripts.js
src/content/styles.css
src/images/
src/manifest.json
src/sidebar/index.html
src/sidebar/page-title.js
src/sidebar/scripts.js
src/sidebar/SidebarApp.js
src/sidebar/styles.csssrc/manifest.json declares the action, the side panel, the content script's <all_urls> match and the background worker. The sidebar folder is the panel, the content folder runs on the page, and images holds the icons the manifest declares.
When it fails
[Extension.js] Requires Node.js >= 22.12. The CLI checks the runtime before any command and exits. Upgrade to Node.js 22.12 or newer. Bun 1.2 and Deno 2.5 or newer also pass the check.- The "Open sidebar" button does nothing in Firefox. Firefox opens a sidebar only from a toolbar click, so the Firefox build shows a hint in place of the button. Click the toolbar icon instead.
Next
- The other starters: TypeScript, React, Preact, Vue, Svelte
- Import a repository once the template is yours
extension_createfor every input the agent can set