Browser Extension Development Company

Browser extensions sit closer to the user than any other software you build. They watch the page, read the DOM, modify the experience, and stay one tab away from every workflow your users live in.
RaftLabs builds Chrome, Edge, Firefox, and Safari extensions for productivity tools, AI assistants, sales prospecting tools, dev tools, CRM integrations, and consumer utilities, with Manifest V3 architecture from day one and store submission handled end to end.

See our work
  • Chrome, Edge, Firefox, and Safari extensions built from a single Manifest V3 codebase

  • Manifest V3 architecture from day one, service workers and declarativeNetRequest, no V2 rewrites later

  • Chrome Web Store submission and review process handled end to end, including rejection appeals

  • AI assistant, productivity, and CRM-integrated extensions that live inside the workflows your users already use

Recent outcomes

Voice AI · Research

Text-based interviews converted to automated phone calls

6× deeper insights

AI Automation · Ops

Manual invoice OCR across 40+ gas stations

20k+ txns day one

Loyalty · Retail

SuperValu & Centra loyalty platform with receipt validation

1,062 users in 4 weeks

SaaS · Logistics

Multi-carrier shipping hub for Indonesian eCommerce

2,000+ shipments yr 1
4.9 / 5 on ClutchSee all work

Recognition

Sound familiar?

  • Extension rejected by the Chrome Web Store review team and the rejection email reads like a riddle?

  • Internal team needs a browser extension to automate a workflow but nobody on the team has built one before?

In short

RaftLabs is a browser extension development company that builds Chrome, Edge, Firefox, and Safari extensions on Manifest V3 from a single shared codebase. We build AI assistant extensions, sales and CRM extensions, productivity tools, dev tools, and consumer utilities, and we handle Chrome Web Store and Add-ons store submission end to end including the review and appeals process. Most extension projects launch in 6-12 weeks at a fixed cost, with full source code ownership transferred to the client.

Trusted by

Vodafone
Nike
Microsoft
Cisco
T-Mobile
Aldi
Heineken
GE

Extensions live closer to the user than any other software

Web apps run inside their own tab. Mobile apps run inside their own icon. Extensions run inside every tab the user opens. That proximity is the whole point. It's also the reason browsers police them carefully, and why building one well means understanding the security model, the permission system, and the review process before you write the first line of code, not after.

Most teams that try to build an extension internally underestimate one of three things: how much of the work is store policy compliance rather than application logic, how much the Manifest V3 service worker model changes the assumptions you can make about background state, or how different the Safari distribution model is from Chrome. We build extensions for a living and treat all three as first-class concerns from day one.

Capabilities

What we build

Chrome extension development

Production Chrome extensions built on Manifest V3 with a clean service worker architecture, declarativeNetRequest for any network-level behaviour, and content scripts isolated from page JavaScript via the standard isolated world. Popup UI built in React or Svelte with TypeScript throughout, sharing types between the service worker, the content scripts, and the popup so the IPC bridge between them is type-checked at compile time rather than discovered at runtime.

Permission model designed around the principle of least privilege from day one. Optional permissions requested at point of use via chrome.permissions.request rather than declared upfront in the manifest, which both improves the install experience (users see a shorter permission list on install) and reduces the rejection risk during Web Store review. host_permissions scoped to the specific origins the extension actually operates on, not <all_urls> unless the extension genuinely needs to run everywhere. CSP configured to disallow inline scripts and remote code execution, which both improves security and is now a hard requirement for MV3 store submission.

Chrome Web Store submission handled end to end. We write the store listing copy, produce the screenshots and the promo tile at the required dimensions, draft a privacy policy that accurately reflects what the extension does with user data, and submit through your developer account (or set up the developer account if you don't have one). If the first submission is rejected, we read the rejection email, identify the specific policy section cited, revise the submission, and resubmit, typically within 48 hours.

Edge and Firefox extension development

Edge and Firefox extensions built from the same Manifest V3 codebase as the Chrome build, with the smallest possible per-browser delta. Edge accepts a Chrome MV3 build almost verbatim because it's a Chromium fork: the same manifest, the same content scripts, the same service worker. We submit through the Microsoft Partner Center to the Edge Add-ons store, which reviews extensions on a separate but similar policy to the Chrome Web Store.

Firefox needs slightly more care. The WebExtensions API uses the browser.* namespace where Chrome uses chrome.*, which we resolve cleanly with the webextension-polyfill so the application code stays unified. Firefox's MV3 implementation supports event-page-style background scripts as well as service workers, which we use when the extension needs persistent state that's hard to reconstitute on every service worker wake. Permission declarations differ in small ways (Firefox requires host_permissions to be granted at install time rather than via optional runtime requests in some scenarios) and we handle those per-manifest rather than per-codebase.

Firefox add-on review by Mozilla is generally faster than the Chrome Web Store but stricter on remote code execution and obfuscation. Mozilla reviewers will read minified source if the extension uses a bundler, and they expect unminified source provided alongside the submission for the review to complete. We ship source maps and unminified source as part of the submission package by default.

Safari Web Extensions for macOS and iOS

Safari Web Extensions built as macOS and iOS apps via Xcode, wrapping the same Manifest V3 codebase used for Chrome and Firefox in a native Swift shell. This is the part of cross-browser extension development that surprises teams the most: Safari extensions don't distribute through a web store, they distribute through the Mac App Store and the iOS App Store as native apps that happen to contain an extension. That means an Apple Developer Program membership ($99/year) is required, the app review process applies (which is slower and stricter than browser extension review), and the build pipeline involves Xcode and notarisation as well as the standard webpack or vite bundle.

We handle the Safari conversion as a defined scope: Xcode project setup, the Swift wrapper that loads the extension into Safari, the iOS Safari extension shell for mobile, code signing with your Apple Developer certificate, notarisation, and submission through App Store Connect. The shared TypeScript codebase stays the source of truth, so when you ship a feature update it propagates to Chrome, Edge, Firefox, and Safari from one set of commits rather than four separate codebases drifting apart over time.

AI assistant and productivity extensions

Browser extensions that put an AI assistant inside the user's existing workflow rather than asking them to context-switch to a separate tab. Sidebar UI injected via content scripts that opens beside whatever page the user is on, with the page content available as context to the model. Selection-based prompting where the user highlights text on any page and triggers a prompt from a keyboard shortcut or context menu. Output insertion back into the page via DOM manipulation, supporting editable surfaces like Gmail composers, Google Docs, Notion, Linear, and Salesforce text fields, each of which has its own quirks for programmatic text insertion.

LLM API calls routed through a backend service rather than direct from the extension, for three reasons: API keys never ship in the extension bundle (where they'd be trivially extractable), usage limits and cost controls live server-side, and the backend can cache prompts and responses to reduce both latency and cost. The backend exposes a thin auth-protected API to the extension and handles the actual model calls, prompt construction, and response streaming back to the extension via Server-Sent Events or WebSockets.

Productivity extensions follow the same architecture: tab management, snippet expansion, form auto-fill, screenshot annotation, link organisation. The shared pattern is a small, focused extension that does one thing well, lives in the toolbar or sidebar without getting in the way, and respects user data by storing as much as possible locally via chrome.storage rather than syncing to a server the user didn't ask for.

Sales and CRM browser extensions

Extensions for sales prospecting, CRM integration, and pipeline workflows that live where the sales team already works. LinkedIn prospecting extensions that enrich profile data, push contacts into Salesforce or HubSpot with one click, and log activity automatically. Gmail and Outlook sidebar extensions that surface CRM context (deal stage, last contact, owner) next to every email thread without the rep switching tabs. Browser-based dialer integrations for sales engagement platforms (Outreach, Salesloft, Apollo) that turn any phone number on a page into a click-to-call.

Architecture for sales extensions has two patterns we use depending on the integration. For CRMs with public OAuth APIs (Salesforce, HubSpot, Pipedrive), we use OAuth 2.0 with PKCE so the extension authenticates the user against the CRM directly without needing a server-side credential exchange, and the access token is stored encrypted in chrome.storage.local with refresh handled in the service worker. For sales platforms without public APIs or with rate-limited APIs that don't scale per-user, we route through a backend that holds the platform credentials and proxies requests on behalf of the user, with the extension authenticating against our backend rather than the third-party platform directly.

Data sync designed around the reality that sales reps work fast: prospect data is loaded eagerly when the user opens LinkedIn or Gmail rather than on demand, so the sidebar surfaces context within 200ms of the page rendering rather than after a second of spinner. Background sync via service worker keeps the local cache fresh without blocking the UI. Bulk operations (push 50 prospects to the CRM at once) queued in the service worker and processed with exponential backoff on rate-limit errors so the operation completes successfully even when the CRM throttles.

Extension store submission and approval

End-to-end submission handling for Chrome Web Store, Microsoft Edge Add-ons, Firefox Add-ons (AMO), and the Mac and iOS App Stores for Safari Web Extensions. Each store has its own policy framework, its own review criteria, and its own appeals process, and the differences are material. We've shipped enough extensions across all four to know which submission will pass on the first round and which will need a revision cycle before approval.

The submission package for Chrome includes: a privacy policy that accurately reflects the extension's data practices, a justification for every requested permission (the "Why do you need this permission?" field is required for any sensitive permission and is the most common rejection trigger when filled in vaguely), store listing copy that describes the single purpose of the extension without overpromising, screenshots at the required resolution showing the extension actually in use, and a promo tile if the extension is going on the front page of any category. We write all of it.

If a submission is rejected, the rejection email cites a specific policy section number. We read the cited policy, identify the change required in the manifest or the listing, make the revision, and resubmit. Most rejections we encounter are resolved on the next review cycle, within 48-72 hours of the original rejection. For extensions previously rejected by other developers before we took the project over, we audit the rejection history first to understand the pattern and address the underlying cause rather than just the cited symptom.

Tell us what your extension needs to do. We'll scope it and handle the store submission.

Browsers to support, the workflow it lives inside, and the data it touches. We'll design the permission model and give you a fixed cost.

Frequently asked questions

Manifest V3 is the current extension platform across Chrome, Edge, and Firefox. Manifest V2 is being retired, Chrome stopped accepting new MV2 submissions in 2024 and is phasing out existing MV2 extensions through 2025-2026. The difference is architectural, not cosmetic. MV2 used long-running background pages that stayed in memory the whole time the browser was running. MV3 replaces those with service workers that the browser starts and stops on demand, which means any state you used to hold in a background page now has to live in storage (chrome.storage.local or session). MV2 used blocking webRequest listeners that could rewrite or cancel network requests in real time. MV3 replaces that with declarativeNetRequest, a declarative rules engine where you register the rules ahead of time and the browser enforces them, which is faster and more private but stricter about what you can do. If your extension was built on MV2, the migration isn't a config change, it's a rewrite of the background logic, the network interception layer, and often the storage model. We build new extensions on MV3 from day one and migrate MV2 extensions to MV3 as a scoped project rather than a quick patch.

One codebase, multiple browsers, with the smallest possible per-browser delta. Chrome, Edge, and Firefox all consume Manifest V3 with the WebExtensions API, so the same content scripts, service worker, and popup UI run across the three with minor manifest differences. Edge accepts a Chrome build almost verbatim. Firefox needs a small number of API substitutions (browser.* vs chrome.* namespace, polyfilled via webextension-polyfill) and slightly different permission declarations. Safari is the outlier. Safari Web Extensions ship as macOS or iOS apps via Xcode, with the WebExtensions code wrapped in a native Swift shell, and they require an Apple Developer Program membership for distribution through the Mac App Store and iOS App Store. We build the core extension logic once in TypeScript, share content scripts and the popup UI across all four browsers, and maintain per-browser manifest files and the Safari Xcode wrapper as the only platform-specific pieces. That keeps maintenance cost down as the product evolves.

The review process has two stages. The automated scan checks for malware signatures, banned API usage, and obvious policy violations. The human review reads your store listing, tests the extension in a clean Chrome profile, and checks that the extension does what the listing says it does, with the permissions it requests, and no more. Reviews typically take 1-3 business days for established developer accounts and 1-3 weeks for new accounts on first submission. The most common rejection reasons we see and resolve are: requested permissions that aren't justified by the described functionality (asking for host_permissions on <all_urls> when the extension only needs to run on one site), a privacy policy that doesn't match what the extension actually does with user data, a single-purpose violation where the extension tries to bundle several unrelated features, remotely hosted code being executed (MV3 prohibits this, all code must ship in the package), and store listing screenshots or descriptions that overpromise what the extension does. When an extension is rejected, the rejection email cites the specific policy section. We've handled enough reviews to know what each policy section actually means in practice and how to revise the submission to pass on the next round, usually within 48 hours of the original rejection.

A focused single-browser extension, one core feature, popup UI, content scripts, and Chrome Web Store submission, typically runs $15,000-$35,000. Cross-browser builds (Chrome, Edge, Firefox from one codebase) add roughly 15-25%. Adding Safari Web Extensions (which requires the Xcode native shell and Apple Developer Program distribution) adds another $8,000-$15,000 on top. Extensions with backend services (AI assistants calling LLM APIs, CRM extensions syncing with Salesforce or HubSpot, sales tools with their own data layer) are scoped including the backend. We give you a fixed cost before any code is written, not a time-and-materials estimate.

Most extensions ship in 6-12 weeks from project start to store submission. A focused single-purpose extension on one browser can ship in 4-6 weeks. Cross-browser extensions with backend services typically run 10-14 weeks. The Chrome Web Store review adds 1-3 days for established developer accounts and 1-3 weeks for first-time submissions, which we factor into the launch date rather than treating it as an afterthought. We start with a 1-week discovery to confirm the permission model and the Manifest V3 architecture before writing application code, because a misjudged permission scope is the most common reason extensions get rejected or have to be rebuilt mid-project.

Work with us

Tell us what you need. We'll tell you what it would take.

We scope Browser Extension Development Company in 30 minutes. You walk away with a clear cost, timeline, and approach. No commitment required.

  • Scope and cost agreed before work starts. No surprises. No obligation.
  • Working prototype within 3 weeks of kickoff.
  • Pay by milestone. You see progress before each invoice.
  • 60-day post-launch warranty. Bug fixes, UI tweaks, and deployment support. No retainer.
  • All conversations are NDA-protected.