# Starters and templates

> The five starter cards, the template links and the terminal command that seed a code.extension.dev workspace from a working extension.

Canonical: https://docs.extension.dev/code/starters
This page as Markdown: https://docs.extension.dev/code/starters.md
Section: Code
Siblings: [AI generation](https://docs.extension.dev/code.md) · [Terminal](https://docs.extension.dev/code/terminal.md) · [Chat mode](https://docs.extension.dev/code/chat-mode.md) · [Live preview](https://docs.extension.dev/code/preview.md) · [Select to edit](https://docs.extension.dev/code/select-to-edit.md) · [The Code tab](https://docs.extension.dev/code/code-tab.md) · [Build console](https://docs.extension.dev/code/build-console.md) · [Checkpoints](https://docs.extension.dev/code/checkpoints.md) · [Drafts](https://docs.extension.dev/code/drafts.md) · [Firefox engine](https://docs.extension.dev/code/firefox-engine.md) · [Download and run locally](https://docs.extension.dev/code/download-and-run.md) · [Share links](https://docs.extension.dev/code/share.md) · [Publish and import](https://docs.extension.dev/code/publish.md) · [Generation allowance](https://docs.extension.dev/code/allowance.md) · [Settings and sign-in](https://docs.extension.dev/code/settings.md)
Map of every page: https://docs.extension.dev/llms.txt · Whole corpus: https://docs.extension.dev/llms-full.txt

---

# Starters and templates

A starter seeds the workspace with a working extension before the first
prompt, so the agent edits something that already builds. Reach for one when
you know the surface you want, or when you want a template from the catalog
opened as your own project.

## Quick start

```text
template list
```

Type that in the terminal and the slugs the workspace can seed print. Then
run `template action` to seed the toolbar popup, or click the **Toolbar
popup** card on an empty workspace. The files land, the build runs, and the
popup opens in the preview.


## How it works

### The five cards

An empty workspace shows five starter cards. Each card carries one sentence
that it sends as the first ask, and the router resolves that sentence to the
closest template:

| Card | The sentence it sends | Resolves to |
| --- | --- | --- |
| Toolbar popup | Build an extension with a toolbar popup that shows a counter I can increment and reset, and remembers the count. | `action` |
| Content script | Build a content script that highlights every link on the current page and shows how many it found. | `content` |
| Side panel | Build an extension with a side panel that lists the current page's headings as a clickable table of contents. | `javascript` |
| DevTools panel | Build an extension that adds a DevTools panel listing every open tab with its title and URL. | `devtools` |
| New tab page | Build an extension that overrides the new tab page with a large clock and a search box. | `newtab` |

A card whose template is not proven seedable is hidden. The strip ends with a
**More templates** card that opens the catalog on templates.extension.dev.

### Links that seed a workspace

| Address | What it does |
| --- | --- |
| `/?template=<slug>` | Seeds the workspace from that catalog template |
| `/?artifact=gen_<id>` | Opens a published artifact's files as your own project |
| `/?prompt=<text>` | Fills the prompt box and sends nothing |
| `/?prompt=<text>&source=starter` | Routes the sentence to a template and seeds it, the way a card does |
| `/drafts/<id>` | Reopens a saved draft |

When a link carries more than one of these, the draft wins, then the
artifact, then the template. `?prompt=` alone never chooses a seed, so one
link can carry a template and a first sentence together.

Every page in the [template catalog](/templates/) has an **Open in
code.extension.dev** button, which is the `?template=` link.

### The `template` command

In the terminal, `template <slug>` seeds the named template, and the same
command with a few words seeds the closest match to them. `template list` prints the
slugs the workspace can seed. The command replaces the project and resets
the conversation, so it refuses on a workspace that already holds a project
you claimed.

### Which templates are offered

The catalog pins 59 templates. Each one was seeded, built and booted in the
preview, and the result is recorded with the compiler version that measured
it. 51 pass and one passes in part. Cards, `template list` and the word match
offer only those, so a seed never starts from a template that cannot build
here.

## Reference

| Command | What it does |
| --- | --- |
| `template <slug>` | Seeds the workspace from that template |
| `template <words>` | Seeds the closest template to the words, or prints the three closest slugs |
| `template list` | Prints every slug the workspace can seed |

| Limit | Value |
| --- | --- |
| Templates pinned in the catalog | 59 |
| Templates proven seedable | 52, of which 51 pass in full |
| Closest slugs named on a miss | 3 |

## When it fails

- **A template link opens on the prompt box with a sentence naming the
  slug.** The slug is not in the seedable set. The message says there is no
  seedable template by that name and points you to templates.extension.dev,
  or to the prompt box below it.
- **`template <words>` prints three slugs and exits.** No template matched
  closely enough. Run `template <slug>` with one of the three.
- **`template` refuses because the workspace holds a project.** Seeding
  replaces the project and resets the conversation. Choose **New project**
  from the project switcher in the header first, then run it again.
- **A card is missing from the strip.** Its template is not proven seedable
  with the current compiler, so the card is hidden until it is.

## Next

- [Templates](/templates/) for the catalog the cards and links draw from
- [Terminal](/code/terminal) for the agent that edits the seed
- [Chat mode](/code/chat-mode) for how a first prompt picks a template
- [Drafts](/code/drafts) for where a seeded project lives
