extport

Write one extension. Reach every platform's users.

One push submits to Chrome, Firefox, Edge, and Safari — Safari's Xcode build included — and one dashboard shows what's live, in review, rejected, or stuck. Open source, self-hostable.

Every extension, every store

A browser extension is one of the only app formats that reaches desktop and mobile from a single codebase — but every store has its own console, API, credential type, and review quirks. extport puts them on one page: each extension, each store, the version that's live and the one still in review.

The extport dashboard: a table of extensions with the live or in-review version for Chrome, Firefox, Edge, and Safari
The dashboard behind extport.dev's own extensions — green is live, amber is in review.

Your users, across every store

One anonymous ping a day from your extension — a random id, its version, the UI language — and the Analytics tab draws what no single store console can: weekly actives per store on one chart, and daily actives by version, so you can watch a release roll out before you flip anything that rides on it.

Active users

Weekly actives, one line per store.

010002000300007-2207-2507-2807-3108-0308-0608-0908-1208-1508-18
  • chrome
  • edge
  • firefox
  • safari

Version saturation

Daily actives by version — releases eat the stack from below.

010002000300007-2207-2507-2807-3108-0308-0608-0908-1208-1508-18

How it works

Add one step to the release workflow you already have. The file, version, and extension are inferred from your build output and extport.config.json; push once, and every configured store target picks it up.

The same command runs from the extport CLI on your own machine.

- uses: extport-dev/actions/push@v1
  with:
    store: chrome
    api-key: ${{ secrets.EXTPORT_API_KEY }}

What works today

One push, four stores

Tag a release and extport submits it to the Chrome Web Store, Firefox Add-ons, Edge Add-ons, and the App Store — no store console required.

One dashboard for review status

See what’s live, in review, rejected, or stuck across every store, instead of checking four different consoles by hand.

Analytics across every store

One anonymous ping a day from your extension, and you get weekly actives, installs, and version adoption combined across all four stores.

Licensing

Sell activation codes through your own Stripe Payment Links: extport fulfills the purchase, emails the code, verifies activations via @extport/sdk, revokes on refunds, and gives buyers a self-service portal.

CLI or GitHub Actions

Drop a couple of steps into your existing release workflow, or run the same commands by hand from your own machine.

Credentials, encrypted

Store API keys and signing keys once, encrypted at rest per tenant. Rotate them without touching your CI configuration.

Safari builds, without handing over your signing keys

The CLI and GitHub Action wrap the Xcode build, signing, and upload Safari needs — in your own CI, with Apple credentials extport never sees. Review submission is handled server-side like every other store.

A scaffold that starts you on every platform

One CLI command bootstraps a new extension pre-wired to ship to Chrome, Firefox, Edge, and Safari from day one — bound to a real extension record before you write a line of code.

Free while in beta — and open source

Sign in with GitHub and start publishing — no waitlist. Exact prices will be set during the beta with real users, but the shape is fixed now:

  • The free tier is permanent: 3 extensions, analytics included, and licensing that only ever costs a small percentage of sales you actually make.
  • Paid plans will be about scale — more extensions for bigger fleets — never about unlocking basics.
  • When pricing lands, nothing breaks retroactively: advance notice, and whatever you set up during the beta keeps working.

The source is on GitHub under the Elastic License 2.0 — self-hosting is explicitly allowed.