Moderok

Analytics for browser extensions.

Installs, events, trends and logs for the extension you already shipped.

npm install @moderok/sdk

Read the docs

manifest.json
0 changes
{
"manifest_version": 3,
"name": "Tab Sweeper",
"version": "2.4.1",
"permissions": ["storage", "tabs", "alarms"],
"background": {
"service_worker": "background.js",
"type": "module"
}
}
background.js
+2 lines
import { Moderok } from "@moderok/sdk";
import { sweepTabs } from "./sweep";
Moderok.init({ appKey: "mk_7f3a91c4e28b6d05" });
chrome.alarms.onAlarm.addListener(({ name }) => {
if (name === "sweep") sweepTabs();
});

Two lines in your service worker. Your manifest doesn’t change.

5.7 kB gzipped, zero dependencies, and not one reference to window or document — written for the MV3 service worker, not adapted from a web page.

What you get

Trends, events, and logs
Actives, installs, updates, uninstalls and errors up top; every raw event underneath, in the same place.
Survives the service worker
Events queue in chrome.storage.local and flush when MV3 wakes the worker, so a suspended extension does not lose data.
Logs, not just counts
Errors arrive with their payload and stack trace, so you are not wiring in a second logging SDK.
Your events, your schema
You name the events and decide what each one carries. Nothing is inferred or renamed.

How it works, in detail →

Real output

Every event lands in the log with its level, source and payload. Errors expand to the raw JSON your extension sent.

logs

Event logs

8,412 entries · Jul 30, 2026

  • errorUncaught TypeError: Cannot read properties of undefined (reading 'tabId')
    14:07:33.912
    sweep_failedbackground.ts:214
    {
      "groupId": 41,
      "tabCount": 0,
      "lastSweep": "2026-07-30T13:42:19.006Z"
    }
  • warningstorage.local at 81% of quota (4.94 MB of 6.10 MB)
    13:58:07.441
    quota_warningservice_worker
  • infoAlarm "sweep" fired while the worker was suspended; rescheduled +60s
    13:42:19.006
    alarm_rescheduledservice_worker
  • infoOptions page opened from the toolbar menu
    13:29:55.208
    options_openedoptions_ui
  • debugFlushed 47 events in 2 batches (312 ms)
    13:29:12.640
    queue_flushservice_worker

Pricing

  • Free

    $0

    1M events / month

    Every chart, every log. No card.

    Get started
  • Pro

    $29/mo

    10M events / month

    When free stops covering your traffic.

    Get started
  • Team

    $149/mo

    100M events / month

    Higher limits, same dashboard.

    Get started

Every plan has every chart and every tool. A bigger plan only raises the monthly event allowance.