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 this themeThe unpacked theme folder written to a folder you choose
Export ZIPA store-ready Chrome package
Export Firefox ZIPA separate package, Firefox themes use a different manifest shape
Export manifest.jsonThe manifest as a file
Copy manifest JSONThe 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_verify against 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

Extension.dev sponsors Extension.js, the open source framework it builds on.
Privacy · Terms · Cookies