Build a theme
You want to build a browser theme without hand-writing a manifest. A theme is the one extension shape that ships no code: its entire payload is a manifest and a handful of images, so one color in the wrong slot breaks the whole extension and no runtime throws an error.
themes.extension.dev resolves a theme the way Chrome resolves it and paints the result as you edit. What is painted in the builder is what Chrome paints.
What the builder covers
| Part | What you set |
|---|---|
| Color sections | Frame, toolbar, tabs, and the new tab page |
| Tints | Hue shifts applied to buttons and the frame |
| Wallpaper | Upload the frame and new tab artwork |
| Presets | Complete themes to start from |
| Palette generator | A full palette derived from a seed color |
The builder warns on accessibility problems as you choose, low contrast between tab text and frame being the usual one. It also imports an existing theme, so a theme built elsewhere can be corrected here.
Exporting
| Export | What you get |
|---|---|
| Install directly | The theme applied to your browser now |
| Chrome ZIP | A store-ready Chrome package |
| Firefox ZIP | A separate package, Firefox themes use a different manifest shape |
| Copy manifest | The raw manifest, for a repository you already have |
Publishing
Publish posts the theme to the artifact pipeline and returns an /import URL. Opening it creates a real GitHub repository from the theme, connected as a project, and requires a session. From there it submits to stores like any extension. See Publishing.
Verifying one
The MCP server ships extension_theme_verify, which checks a theme manifest against the colors Chrome actually paints. A regression shows up as a diff rather than as two screenshots someone compares by eye.
When it fails
- The Chrome ZIP does not load in Firefox. The manifest shapes differ. Export the Firefox ZIP separately, never reuse the Chrome one.
- The installed theme does not match the builder. Run
extension_theme_verifyagainst the manifest. It diffs what the manifest declares against what Chrome paints, slot by slot. - Publish asks for a sign-in. Building and exporting work signed out. Publish creates a GitHub repository through /import, and that write needs a session.
- The builder flags a contrast warning. Fix it before shipping, that pair of colors is what every tab title renders in. The palette generator produces passing combinations from your seed color.
Next
- Import for what the publish link hands off to
- Publishing for the store submission
