Fix chrome.cookies.get returning null in a Chrome extension
Why chrome.cookies.get returns null in a Manifest V3 extension: the host permission rule, the url argument, partitioned cookies, and Firefox differences.
Read more
How we think about extension analytics, plus deep dives on MV3 and Chrome Web Store policy.
Why chrome.cookies.get returns null in a Manifest V3 extension: the host permission rule, the url argument, partitioned cookies, and Firefox differences.
Read more
Analytics does not slow down a Chrome extension much, but it costs you something in four places. Here is what each one is and how to measure it.
Read more
Why chrome.storage.session throws "Access to storage is not allowed from this context" in a content script, the setAccessLevel fix, and what it misses.
Read more
The permissions an analytics SDK actually needs in a Manifest V3 extension, which ones add an install warning, and what to check before you pick one.
Read more
Why an MV3 service worker hits "Cannot create item with duplicate id", the chrome.runtime.onInstalled fix, and what still breaks after it.
Read more
Why a Chrome extension service worker throws "Cannot use import statement outside a module", the type module manifest fix, and why importScripts then breaks.
Read more
How to fill in browser_specific_settings.gecko.data_collection_permissions for a Firefox extension, and where analytics belongs in it.
Read more
Why Chrome throws "sidePanel.open() may only be called in response to a user gesture" after an await, and the call ordering that fixes it.
Read more
Why a Chrome extension fetch is blocked by CORS policy, how host_permissions exempts the request, and what to do when the fetch is in a content script.
Read more
Rejected with a two-word code like Blue Argon? Here is the full mapping of Chrome Web Store violation codes and how to fix the ones that hit real extensions.
Read more
Load an unpacked MV3 extension in Puppeteer, get the extension ID, run code inside the service worker, read its console, and force it to terminate.
Read more
Why Chrome throws "The message port closed before a response was received.", how return true and async onMessage listeners cause it, and the fix.
Read more
How a chrome.offscreen document runs DOMParser, clipboard, or audio code for an MV3 service worker, plus the one-document limit and lifetime rules.
Read more
Why a published Chrome extension update takes hours or days to reach users, covering Web Store review, percentage rollout, update checks, and the idle rule.
Read more
What the "Extension context invalidated" error means, why it hits content scripts after every extension update or reload, and how to detect and recover.
Read more
Which manifest keys trigger the scary Chrome "read and change all your data" permission warning, and three ways to narrow or remove it.
Read more
Why setInterval fails in an MV3 service worker, how chrome.alarms schedules periodic tasks that wake a terminated worker, and the 30-second minimum.
Read more
A Chrome MV3 service worker has no DOM, so "document is not defined" is expected: here is how to find the line that threw and the three ways to fix it.
Read more
We ranked 7 chrome extension analytics options: Web Store stats, GA4, Mixpanel, Amplitude, PostHog, Aptabase, and Moderok. One was built for the job.
Read more
Amplitude is enterprise analytics with enterprise overhead. See how its MV3 setup compares with Moderok, round by round.
Read more
Google Analytics wasn't built for Chrome extensions. Moderok was. A head-to-head on setup, dashboards, privacy, and price, with a clear winner.
Read more
Mixpanel's SDK won't even load in a Chrome extension service worker. See how Moderok and Mixpanel really compare for chrome extension analytics.
Read more
PostHog's best features need a web page, and your Chrome extension doesn't have one. How Moderok and PostHog compare for chrome extension analytics.
Read more
How to tell a first install from an update in a Chrome extension using chrome.runtime.onInstalled reason, and track version adoption.
Read more
Porting a Chrome MV3 extension to Firefox? Its background runs as an event page, not a service worker. Here is what changes and what stays the same.
Read more
Why chrome.storage.local throws QUOTA_BYTES quota exceeded, the real byte limits for local, sync, and session, and how to stay under them.
Read more
A developer's guide to the Chrome Web Store data collection disclosure: the data categories, the Limited Use certifications, and analytics.
Read more
Google Analytics gtag.js breaks in MV3 extensions: service workers have no DOM and Chrome bans remote code. Here's why, and what to use instead.
Read more
chrome.storage.local vs chrome.storage.sync in a Chrome extension: exact quotas, the 8 KB per-item cap, write throttling, and which to use for what.
Read more
Why a Chrome extension service worker keeps stopping after 30 seconds, what actually resets the timer, and how to keep state across restarts.
Read more
What Chrome Web Store Weekly Users and Installs actually count, why Weekly Users is not installs minus uninstalls, and which number to trust.
Read more
How to track Chrome extension uninstalls using chrome.runtime.setUninstallURL, what it can and cannot catch, and the Firefox differences.
Read more
Why chrome.runtime.lastError doesn't throw or reject, how it silently swallows failures in MV3 service workers, and how to catch it.
Read more