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 this theme | The unpacked theme folder written to a folder you choose |
| Export ZIP | A store-ready Chrome package |
| Export Firefox ZIP | A separate package, Firefox themes use a different manifest shape |
| Export manifest.json | The manifest as a file |
| Copy manifest JSON | The same manifest on your clipboard |
Install this theme writes files, it does not install. The last step stays yours: open chrome://extensions, turn on Developer mode, click Load unpacked, and choose the folder. The button appears only in a browser that can write a folder from a page, which today means Chromium. Elsewhere the ZIP downloads instead.
The Firefox package carries only the keys Gecko renders, and the builder preview is always Chrome. Nothing on the page shows how Firefox will paint the theme.
Publishing
Publish uploads the theme to your account, then opens an /import URL where you name the repository and choose public or private. Nothing is created until you confirm there. The upload itself needs you signed in, so publishing signed out asks you to sign in first. Publishing carries about 6 MB of images and refuses a theme above that.
From the created project it submits to stores like any extension, and that submission is a separate step you start yourself. 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
- There is no Install button. The browser cannot write a folder from a page. Firefox and Safari do not, so take the ZIP and unzip it yourself.
- The Chrome ZIP does not load in Firefox. The manifest shapes differ. Export the Firefox ZIP separately, never reuse the Chrome one.
- The Firefox theme looks nothing like the preview. The preview is Chrome, and the Firefox package drops the keys Gecko cannot render. The page lists what it dropped.
- 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. - Export is blocked. The theme has no name, or the version is not 1 to 4 numbers between 0 and 65535. Chrome refuses those manifests, so the builder refuses them first.
- Publish asks for a sign-in. Building and exporting work signed out. The theme is uploaded to your own account, so publishing needs a session before anything is uploaded.
- Publish says the theme is too large. The upload carries about 6 MB of images. Shrink the new tab background or the frame image.
- 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