cleanURL is a Manifest V3 Chrome extension that removes tracking query parameters from URLs (for example utm_*, gclid, fbclid) to make links cleaner, more private, and easier to share.
All URL processing is local in the extension. No browsing data is sent to external services.
- Auto-clean URLs during navigation (toggle in settings)
- Clean the current tab URL from the popup
- Context-menu action to copy a cleaned link
- Customizable blocked parameter list
- Local settings and lightweight clean-count stats via
chrome.storage.local
- React 19 + TypeScript
- Vite 8
- CRXJS (
@crxjs/vite-plugin) for Chrome extension build/runtime integration - Vitest for unit tests
- Node.js 18+
- pnpm (recommended) or npm
- Google Chrome (Developer Mode for unpacked extension)
- Install dependencies:
pnpm install- Start development:
pnpm dev- Load extension in Chrome:
- Open
chrome://extensions/ - Enable Developer mode
- Click Load unpacked
- Select the
dist/folder
CRXJS supports hot updates during pnpm dev.
Build production bundle:
pnpm buildRun tests:
pnpm testPreview Vite output (optional):
pnpm previewUse this when you want the packaged extension instead of running pnpm dev.
- Build the release package:
pnpm buildThis generates:
- unpacked extension files in
dist/ - packaged zip in
release/*.zip
- Install in Chrome:
- Open
chrome://extensions/ - Enable Developer mode
- Click Load unpacked
- Select the
dist/folder
Note: Chrome does not allow installing a .zip directly from the extensions page. If you have a zip from release/, extract it first, then load the extracted folder as unpacked.
- Use the extension:
- Pin
cleanURLfrom the Chrome toolbar extensions menu - Open any normal web page with tracking parameters (for example
?utm_source=...) - Click the extension icon and use:
- Clean Now to clean the current tab URL
- Copy to copy the cleaned URL
- AUTO toggle to enable/disable automatic cleaning during navigation
- Right-click any link and choose Copy Clean Link to copy a cleaned version directly
Manifest is defined in manifest.config.ts.
Current icon paths are root-relative in the built extension package:
48.pngfor extension icon48.pngfor action icon
If your icon assets are stored under public/, keep using root-relative paths in the manifest output (for example "48.png", not "public/48.png") because Vite copies public/ contents to the extension root.
src/core/- Pure URL cleaning logic (no Chrome APIs)src/background/serviceWorker.ts- MV3 service worker orchestrationsrc/lib/storage/- Typed wrappers forchrome.storage.localsrc/popup/- Popup UIsrc/content/- Content script entrysrc/sidepanel/- Side panel entrymanifest.config.ts- MV3 manifest source for CRXJS
src/core/cleanUrl.ts: main cleaner returning cleaned URL + removed paramssrc/core/rules.ts: default blocked params + normalization helperssrc/core/defaults.ts: default settings + settings-to-rules bridgesrc/core/domain.ts: guards for non-cleanable/internal URLssrc/background/serviceWorker.ts: navigation auto-clean + redirect loop preventionsrc/lib/storage/settings.ts: sanitizes and merges settings with defaults
- Ask before adding runtime dependencies
- Ask before changing manifest permissions
- Ask before adding Firefox/Safari packaging
- Never store or transmit browsing history
- Keep
src/core/side-effect-free and Chrome-API-free - Blocked param matching must remain case-insensitive
- Auto-clean must prevent redirect loops
No license file is currently defined in this repository.