CRXKit

Your extension works. Now charge for it.

CRXKit is the part you have not written yet: license keys, a free tier that holds, and one MV3 build that goes to Chrome, Edge and Firefox. Fill in one file and take money.

384 lines of TypeScript in the licensing layer. Read it in an afternoon.

free

My ExtensionFREE
7/10 used today
Run action
UpgradeSettings

after a key

My ExtensionPRO
Run action
Settings

What you do not have to write

Every one of these is a day you already know how to spend, and none of them is your product.

The part that is harder than it looks

Deciding whether someone is on Pro sounds like a boolean. It is six cases, and the two in the middle are where the refund requests come from.

SituationPlan
No key storedfree
Past the provider's own expiryfree, immediately
Checked within 24 hourspro
Stale, inside the 14-day grace windowpro, flagged as on grace
Grace expired and 3 checks in a row failedfree
Provider says revoked or refundedfree, cache cleared

You would get here eventually. The question is whether you get here before or after the first customer emails you from a train.

What is in the box

Small enough to read, which is the point. No UI kit, no state library, no generator.

lib/
  config.ts        53 lines — the only file you edit
  license.ts       106 lines — the state machine above
  quota.ts         37 lines — free tier counting
  storage.ts       cache, on top of WXT storage
  types.ts         the LicenseProvider interface
  providers/
    polar.ts       Polar adapter
    lemonsqueezy.ts

entrypoints/
  background.ts    alarms, and the one place plans are answered
  content.ts       example, asks the background rather than deciding
  popup/           React — badge, quota meter, upgrade link
  options/         React — key entry, licence status

site/              this page and the documentation
wxt.config.ts      the only place the three browsers differ

Pricing

One payment. The version you receive is yours permanently, and updates keep arriving while your repository access does.

Single Developer

One person, any number of products.

$79

once, not a subscription

  • Unlimited extensions, free or paid
  • Unlimited end users
  • Client work included
  • Private repository access
  • Updates while access lasts
Buy the Single licence

Team

One company, everyone in it.

$199

once, not a subscription

  • Everything in Single Developer
  • Every developer at your company
  • Repository access per developer
  • No seat counting, no renewals
Buy the Team licence

Payments run through Polar, which is the merchant of record and files VAT and sales tax. Full terms in the licence, which you can read before you buy.

Repository invitations are being sent by hand at the moment, while an issue with the automatic invitation is resolved with Polar. Expect access the same day rather than the same minute. If it has not arrived, open an issue at github.com/crxkit/support with your order ID and your GitHub username — that repository is public, so you can reach us before you have access to anything else.

What it is not

Licence validation in a browser extension runs on the client. Someone determined to bypass it will bypass it, and obfuscation only costs you debugging time. What protects revenue in practice is convenience and a steady update cadence, not a lock. If a capability genuinely must not be copied, it belongs on a server — and then the licence check is what authorises the request.

It is also not a UI kit, not a backend, and not your product. It is the paid-extension plumbing and the store paperwork, so that the part only you can write is the part you spend your week on.

Questions

Which payment provider should I use?

Polar, for a new product. It is a merchant of record built for developer tools, so it files VAT and sales tax for you, and its licence keys are what the kit checks by default.

Lemon Squeezy is supported for people already selling there. It was acquired by Stripe in 2024 and the long-term direction is Stripe Managed Payments.

Do I need a server?

No. The extension talks to your payment provider's API directly, and the two host permissions in the manifest are the only network access it has.

Does one build really cover all three stores?

Yes. Firefox has been MV3 since 109, so the code never forks. The differences that remain — a stable extension ID, the data collection declaration — are in wxt.config.ts, and npm run zip:all produces all three uploads.

What about Safari?

Not included. Safari needs Xcode, an Apple Developer account and a conversion step, and pretending otherwise would be the kind of promise that produces refunds.

Can I get a refund?

The source is delivered immediately and cannot be returned, so refunds are handled case by case before repository access has been used. Polar's own consumer rules apply on top, and where they give you more, they win.

How do updates reach me?

You are invited to the private repository on purchase, so updates are a pull. Anything that changes for you is written down in the changelog.