
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.
- 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.
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.
| Area | Chrome | Firefox |
|---|---|---|
| Background in Manifest V3 | A 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 webRequest | Not available to regular extensions. Blocking uses declarativeNetRequest rules. | Still available in Manifest V2 and V3, next to declarativeNetRequest. |
| Manifest V2 | No longer runs in current Chrome. | Still supported. |
| API namespace | chrome.*, with promises supported in Manifest V3. | browser.* with promises. chrome.* also works for compatibility. |
| Manifest keys | The 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 review | Chrome 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. |
| Mobile | Chrome 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
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
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
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
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
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.
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.
Yes. Firefox supports both Manifest V2 and V3, and blocking webRequest works in both. In Manifest V3, Firefox runs the background as an event page, not a service worker.
Since November 2025, new Firefox extensions must state in their manifest whether they collect or send personal data, using browser_specific_settings.gecko.data_collection_permissions. Firefox shows this to users at install, and AMO rejects submissions that leave it out. Mozilla said it would extend the rule to all extensions. We fill it in to match what the extension actually does and what your privacy policy says.
To install in release Firefox, yes. Mozilla signs every extension, whether it is listed on addons.mozilla.org or self-distributed. When code is bundled or minified, reviewers may ask for readable source and build steps, and we prepare those in advance.
Often with small changes. Firefox for Android runs extensions from AMO, but some APIs are missing or behave differently on mobile, and popups need a touch-friendly layout. We test on Android phones before you list it for Android.
Porting a working Chrome extension to Firefox typically takes 2โ6 weeks, depending on how much Chrome-only code it has. That is a typical range, not a quote. AMO review time comes on top.
Related reading
Our services
Related services

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.

