Skip to content

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

PartWhat you set
Color sectionsFrame, toolbar, tabs, and the new tab page
TintsHue shifts applied to buttons and the frame
WallpaperUpload the frame and new tab artwork
PresetsComplete themes to start from
Palette generatorA 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

ExportWhat you get
Install directlyThe theme applied to your browser now
Chrome ZIPA store-ready Chrome package
Firefox ZIPA separate package, Firefox themes use a different manifest shape
Copy manifestThe 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_verify against 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