HMR breaks.
The extension intercepts the WebSocket upgrade handshake; your Vite / Webpack HMR disconnects mid-session. You restart the dev server 5 times before realising the extension is the problem.
LocalCORS is scoped to
localhost
+ 127.0.0.1
by default, uses declarativeNetRequest dynamic rules that persist across browser restart, and never touches YouTube.
Free, open source, no email wall.
No spam. One email at launch, plus occasional build updates. Unsubscribe anytime.
We audited all three incumbents side by side on a fresh Vite + React project. They all failed in the same way.
The extension intercepts the WebSocket upgrade handshake; your Vite / Webpack HMR disconnects mid-session. You restart the dev server 5 times before realising the extension is the problem.
CORS Unblock “automatically turns off if I refresh any page” — GitHub issue #24, open for nearly a year with no fix committed.
Every incumbent defaults to
<all_urls>.
Multiple 1-star reviews cite broken YouTube, buffering, and SPA breakage as the side-effect
of a CORS extension you installed for one localhost project.
The MV3 session-rules bug, in one snippet:
// Vite dev server running on localhost:3000
// CORS extension injects declarativeNetRequest SESSION rules via service worker
// ...30 seconds of idle...
// Chrome kills the MV3 service worker (by spec)
// Session rules die with it; dynamic rules would have persisted
await fetch('https://api.staging.myco.com/users'); // 403 CORS - session rule is gone
// You toggle the extension off and on again. It works. For 30 seconds.
+--------------------------+
| declarativeNetRequest |
| DYNAMIC rules |
| |
| Persist across: |
| ✓ SW eviction (~30s)|
| ✓ browser restart |
| ✓ Chrome update |
| |
| No heartbeat. No alarm. |
| No cold-start re-arm. |
+------------+-------------+
|
▼
+--------------------------+
| Rules registered once |
| on onInstalled + |
| rebuilt on settings |
| change. That’s it. |
| |
| + localhost/* |
| + 127.0.0.1/* |
| + (host you added) |
| |
| NOT <all_urls> ever |
+--------------------------+
We use chrome.declarativeNetRequest dynamic rules, not session rules.
Chrome guarantees they survive the ~30s service-worker idle timeout, browser restart, and Chrome update.
Allow CORS and CORS Unblock both lose their rule state in contexts where LocalCORS keeps it.
<all_urls>.
The manifest declares explicit http://localhost/* + http://127.0.0.1/*
host permissions. YouTube, Gmail, your bank — all physically out of scope. Adding a staging host
is an explicit runtime grant, one click, visible in the popup.
When the browser sends cookies, we set
Access-Control-Allow-Origin: http://localhost:5173 (the exact origin, port included) —
never *. ACA-O: * alongside credentials: 'include' is spec-illegal
and every incumbent ships that bug.
No cherry-picked features. Every cell traces to a verbatim 1-star review, a GitHub issue, or the official CWS listing.
Five features. No bloat. Free forever — the paid tier (V2) adds request modification and response overrides, never core CORS bypass.
Permissions limited to localhost/*, 127.0.0.1/*, *.local/*.
No <all_urls> at install. Add hosts explicitly in the popup.
declarativeNetRequest dynamic rules (not session rules). Chrome guarantees they survive
the ~30s service-worker idle timeout, browser restart, and Chrome update. No heartbeat, no alarm hacks.
Badge reads ON localhost:3000 or ON api.staging.myco.com.
Zero guessing — you always see exactly what’s active.
Handle OPTIONS with Access-Control-Allow-Origin +
Allow-Methods: * + status-200 override, built-in. No toggle.
One-click export of per-host rules; import the same JSON in another profile or on a teammate’s machine. No account, no cloud sync, no surveillance.
localhost/*, 127.0.0.1/*, and *.local/*
at install time. YouTube, Gmail, and your company intranet are all out of scope by default.
If you want to enable rules for another host, it’s an explicit, visible action in the popup —
not a silent <all_urls> default.
--disable-web-security?
<all_urls>
(Allow CORS, CORS Unblock — collateral damage on YouTube) or gate per-site enable behind an email form
(Moesif). LocalCORS ships localhost-scoped and grants additional hosts as explicit runtime grants.Access-Control-Allow-Origin: *,
which is spec-illegal alongside credentials: 'include' — the browser silently drops the
response. LocalCORS echoes the exact request origin (scheme + host + port) so cookie-authed dev workflows
actually work.One email at launch. No spam. No reselling. No nonsense.
Jump to the form ↑