extro

Introduction

Extro is a framework for building Chrome extensions with React, file-based entrypoints, and automatic Manifest V3 generation.

Extro brings the Next.js authoring experience to Chrome extensions. Drop a file under src/app/, and Extro figures out the rest: the manifest, the routing, the bundling, the dev loop.

src/app/popup/page.tsx
export default function Popup() {
  return <h1>This file is your popup.</h1>
}

That file alone is a working extension surface. No manifest entry, no bundler config, no HTML shell. The same convention covers every Manifest V3 surface:

page.tsx

What you get

  • File-based entrypoints. Every surface (popup, options, sidepanel, content, background) is a file. The build picks them up automatically, with no manual entry config.
  • Manifest V3, generated. Permissions, host matches, CSP, icons, content script matches, all inferred from your tree and extro.config.ts. Full escape hatch when you need it.
  • Type-safe React routing. Hash-based router for popup, options, and sidepanel. Dynamic [id] segments, layouts, error boundaries, search params, and the hooks you'd expect.
  • Real HMR. Popup, options, and sidepanel get full React Fast Refresh with state preservation. Content scripts soft-remount without reloading the host page.
  • One Vite plugin. No custom bundler, no per-surface build configs. Vite handles the dev server; the Extro plugin handles entries, virtual modules, and assets.

Why

Chrome extensions have always been a step backwards in DX. Manifest V3 made it worse: split bundles per surface, brittle CSP, content scripts that can't reach your dev server, no first-class HMR story.

Existing tools (CRXJS, Plasmo) help, but the seams show. Extro takes the position that the framework should disappear into a single Vite plugin and a convention. src/app/popup/page.tsx is your popup, full stop.

How to use these docs

The docs are split into two sections:

  • Guide (you are here): ordered pages that teach Extro the way you build with it, from install to a production bundle. Read it top to bottom the first time.
  • API Reference: one templated page per public API, for lookup. Guide pages link into it; it links back to the Guide for concepts.

Status

Pre-1.0. The API surface is small and stabilizing. Routing, manifest generation, and the dev loop work end-to-end on the example extension.

On this page