Engineering service

Firefox extension development

We build Firefox extensions and bring existing Chrome extensions to Firefox from the same codebase. We handle the parts that differ: the background script, the extension ID, Mozilla signing and AMO review, Firefox for Android, and policies for company-wide rollout.

See what's included
  • 11+ years of experience
  • 300+ projects delivered
  • Remote team, clients worldwide
  • NDA on request

Overview

What it is and when it fits

Firefox extensions use Mozilla's own WebExtensions implementation, which is largely compatible with Chrome's but not identical. The differences show up in the background script, a few API details, the manifest and the way Mozilla reviews and signs code.

We usually build the Firefox version next to your Chrome build from one codebase, or Firefox-first when that is where your users are. The code changes for a port are often small. More of the time goes into testing in Firefox itself and getting through AMO review without back-and-forth.

Who this is for

  • Teams that have a Chrome extension and want a Firefox version from the same codebase.
  • Ad-blocking, privacy and security products that need blocking webRequest, which Chrome no longer allows.
  • Developers whose AMO submission is stuck on a request for source code or build instructions.
  • Companies that need a Firefox extension installed on employee machines through Firefox policies.

How it works

Architecture at a glance

How a Firefox extension is put together

Popup, sidebar, options

The interface users see. Talks to the background through messages.

Event page (background)

Handles events and network rules, including blocking webRequest. Firefox unloads it when idle, so state must live in storage.

Content script

Runs inside pages you choose. Can read and change the page, in an isolated JavaScript world.

Firefox WebExtensions APIs

browser.* with promises: tabs, storage, scripting, alarms, webRequest, declarativeNetRequest

Web page

Content you do not control. Treat everything from it as untrusted input.

The parts match a Chrome extension. The difference is the background: in Manifest V3, Firefox runs it as an event page, a background script it unloads when idle, rather than a service worker.

What we offer

What's included

Chrome-to-Firefox ports

Your Chrome extension adjusted for Firefox from the same codebase: the background script, manifest keys and a thin API layer where the two browsers differ.

Firefox manifest and extension ID

browser_specific_settings.gecko set up with a stable extension ID and the data_collection_permissions declaration that AMO now requires for new extensions.

Request blocking with webRequest

For ad blockers, privacy and security tools: blocking webRequest listeners that inspect and cancel requests in code, which Firefox still supports.

Firefox for Android support

Testing and interface changes so the extension works on Firefox for Android, a mobile browser that runs extensions from AMO.

AMO submission and source review

Submission for signing on addons.mozilla.org, a readable source archive and build steps when your code is bundled or minified, and answers to reviewer questions.

Managed Firefox deployment

Enterprise policies that force-install the extension and push its settings to company machines, through policies.json, Group Policy or macOS profiles.

Deliverables

What you get

  • 01

    One repository, two build targets

    One source tree and one build command that produce both the Chrome package and the Firefox package.

  • 02

    Compatibility report

    Every API and manifest key your extension uses, marked as supported, different or missing in Firefox, with what we did about each.

  • 03

    Signed Firefox build

    A build signed by Mozilla, either listed on addons.mozilla.org or self-distributed with your own update URL.

  • 04

    Reviewer source package

    A source archive and step-by-step build instructions that let an AMO reviewer reproduce your package exactly.

  • 05

    Policy file for IT

    A sample policies.json that installs and configures the extension on managed machines, where company rollout applies to you.

  • 06

    Release checklist

    How to version, build, sign and publish both builds, so updates reach Chrome and Firefox users together.

Compare

Chrome and Firefox extensions: the differences

Most extension code is shared. These are the places where the two browsers diverge, including two capabilities Chrome removed and Firefox kept: Manifest V2 and blocking webRequest.

Chrome and Firefox extensions: the differences
AreaChromeFirefox
Background in Manifest V3A service worker that the browser stops when idle.An event page, a non-persistent background script. It is also unloaded when idle, so state still belongs in storage.
Blocking webRequestNot available to regular extensions. Blocking uses declarativeNetRequest rules.Still available in Manifest V2 and V3, next to declarativeNetRequest.
Manifest V2No longer runs in current Chrome.Still supported.
API namespacechrome.*, with promises supported in Manifest V3.browser.* with promises. chrome.* also works for compatibility.
Manifest keysThe extension ID is assigned by the store.The ID is set in browser_specific_settings.gecko.id. New extensions must also declare their data collection in data_collection_permissions.
Store and reviewChrome Web Store.addons.mozilla.org (AMO) or self-distribution. Builds must be signed by Mozilla to install in release Firefox, and reviewers may ask for readable source when code is bundled or minified.
MobileChrome extensions run on desktop.Firefox for Android also runs extensions from AMO.

Why it matters

What this gives you

Firefox users without a second codebase

Fixes and features reach Chrome and Firefox users in the same release, from one source tree.

Filtering features Chrome no longer allows

Privacy, security and ad-blocking products can keep request-level blocking for their Firefox users.

Fewer stalls in AMO review

Reviewers get a reproducible source package and a complete data-collection declaration from the first submission.

Private releases when you need them

Signed, self-distributed builds let you ship to customers or employees without a public AMO listing.

Our approach

How a Firefox extension project runs

  1. Compatibility review

    We go through the APIs and manifest keys your extension uses and note which ones Firefox supports, changes or lacks.

    You get: A list of differences and what to do about each

  2. Shared codebase

    We set up one source tree with a shared core and small per-browser manifest and API differences, so fixes reach both builds.

    You get: A project that builds for each browser

  3. Build and test in Firefox

    We test in Firefox desktop, and on Firefox for Android when you target it: event page unloading, permission prompts and content scripts on your target sites.

    You get: A working Firefox build

  4. Sign and submit

    We fill in the data-collection declaration, prepare the source archive if needed, submit for signing and answer reviewer questions with you.

    You get: A signed build and a submitted listing

  5. Maintain both builds

    We document the release steps so future Chrome and Firefox updates go out from the same source.

    You get: Release notes for your team

When this is not the right fit

  • Your extension depends on Chrome-only APIs with no Firefox equivalent. We will tell you early what to drop or rebuild.
  • You want to install the extension in release Firefox without Mozilla signing. Release Firefox only installs signed extensions.
  • You want a Firefox-based browser with built-in features. That is custom Firefox browser development, a separate service.

Tech stack

Technologies we use

The engines, APIs and tools we use on this service.

WebExtensions APIbrowser.* namespaceEvent pageswebRequest (blocking)browser_specific_settingsaddons.mozilla.org (AMO)web-ext CLIFirefox for AndroidFirefox enterprise policiesTypeScript

FAQ

Common questions

Usually yes. The core logic is shared, and the differences are small: the manifest, the background model and a few API behaviors. We keep those in a thin layer so the shared code stays the same.

Start a project

Get your extension signed and live on Firefox

Send us your Chrome extension or your Firefox requirements. We will map the differences and the path to one shared codebase.

Send a project brief