create scaffolds files, configuration, and starter scripts for the selected template and optionally installs dependencies.
For a file-by-file tour of the generated tree, see What create generates.
When to use create
- Start a new extension from scratch.
- Spin up multiple proof-of-concept ideas quickly.
- Standardize onboarding for your teammates with consistent template defaults.
Create command capabilities
Usage
Using Yarn? The
yarn dlx command requires Yarn 2 or later. Yarn 1 does
not include dlx and fails with a “Command not found” error. On Yarn 1, use
the npm tab (npx) instead.Arguments and flags
When you want the default TypeScript starter, omit
--template entirely. Add --template=<slug> only for another stack from the official examples. --template also accepts a GitHub URL or a ZIP URL, so you can scaffold from any repository.
From 4.1.19, a template URL must use https://. create refuses a plain http:// URL, and a download that redirects to http://, before it writes the project. To allow http:// on a network that you trust, set EXTENSION_ALLOW_HTTP_TEMPLATE=true.
The catalog holds 53 templates in 6 groups: starters, sidebar, content scripts, new tab, toolbar action, and special folders. Run extension create --help for the full list. The default typescript template downloads the catalog archive like every other name. Only the javascript template ships inside the CLI. When you omit --template, EXTENSION_CREATE_TEMPLATE_URL is not set, and the download fails, create falls back to that bundled javascript template and says so, naming the network error, so an offline machine still gets a project. An explicit --template that fails to download fails loudly instead.
A scaffold has one package manager. A starter’s packageManager pin (or a pnpm-workspace.yaml it ships) decides it, otherwise the manager that invoked create does. The packageManager field written to package.json, the --install run, and the printed next steps all name that same manager.
Template corpus pinning
Catalog downloads are pinned to one immutable commit of the examples repository. Two scaffolds of the same version therefore produce the same bytes. Two environment variables override the pin:EXTENSION_CREATE_TEMPLATE_REFpoints at another ref. Set it tomainto restore floating behavior.EXTENSION_CREATE_TEMPLATE_URLpoints at another archive URL entirely. When it is set and that archive cannot be used,createfails and never falls back to the bundled template.
.extension-create.json provenance file into the project. It records the create version, the template, and the source, plus the resolved ref when the template came from the catalog archive, so template drift stays auditable. The bundled javascript starter records "source": "bundled" and no ref.
Machine output with --output json
--output json prints one schema-1 envelope on stdout and routes scaffold progress lines to stderr:
- A successful run prints a
status: "created"frame. ItsvaluecarriesprojectPath,projectName,template, anddepsInstalled. - Failures print
ok: falsewith anerror.code:E_TEMPLATE_NOT_FOUNDfor an unknown catalog name,E_NETWORKfor a failed download (a refused connection, an HTTP error, or a timeout),E_DESTINATION_NOT_EMPTYorE_DESTINATION_NOT_WRITABLEfor destination problems. - A template URL that answers with something other than a ZIP archive, or with a damaged one, fails with
E_REMOTE_ZIP_INVALIDand leaves nothing on disk. - An archive with an entry outside its folder fails with
E_REMOTE_ZIP_INVALIDtoo, from a template URL or fromEXTENSION_CREATE_TEMPLATE_URL.createchecks every entry before it writes one, so the message says the archive was refused, names the entry, and gives no advice to try again. EXTENSION_CREATE_TIMEOUT_MSbounds the whole template fetch, retry included. A fetch that runs out of time fails withE_NETWORKand the reasonNo answer within N seconds.- An
EXTENSION_CREATE_TEMPLATE_URLthat fails never falls back to the bundledjavascripttemplate. A page or a damaged archive fails withE_REMOTE_ZIP_INVALID, and a refused connection, an HTTP error, or a timeout fails withE_NETWORK. The message names the variable, and nothing is left on disk. - A plain
http://template URL withoutEXTENSION_ALLOW_HTTP_TEMPLATE=truefails withE_INVALID_OPTION.
Shared global options
Also supports Global flags.Example commands
Available templates
JavaScript
Minimal bundled starter. Use when you want a clean baseline or are offline.
TypeScript (default)
Typed sidebar starter with
tsconfig.json preconfigured.React
React UI wired for content scripts and popup views.
Vue
Vue UI with single-file component (SFC) support baked in.
Best practices
- Start from a template that matches your UI/runtime needs to reduce setup drift.
- Keep the first run small, then add extra tooling after verifying baseline command flow.

