Live test bench · runs in your browser

Strip it.
See for yourself.

Real tracker-laden links, ready to be cleaned — the red parts are what's following you. Two ways in:

Safari extensionMac + iPhone

Tap a link

Unfurl strips the junk in Safari's network layer — the page loads already clean.

Under the hood

The extension uses Safari's declarativeNetRequest: rules run inside Safari's network process and rewrite the request before it leaves. Nothing reads the page — the cleaned URL is simply what loads. The links below point at a landing page on this site that reports exactly which parameters arrived. Enable the extension and allow it on this site (or every website) first.

Mac appmacOS only

Copy a link

The menu-bar app watches your clipboard and scrubs whatever you copy.

Under the hood

Copy any card below. The Mac app detects the pasteboard change, runs the URL through its offline engine (ClearURLs + Brave + AdGuard rule sets), strips trackers, unwraps known redirectors, and rewrites the clipboard in place. Paste anywhere to see the result.

Tap a link, lose the trackers Extension

Real links — tap one and the landing page shows exactly what arrived.

Under the hood

These exercise the extension's global declarativeNetRequest rule, which fires on any host — including this page. Per-host rules only apply when navigating to their real host, so for those, watch the address bar on the actual sites.

UTM cluster
utm_source · utm_medium · utm_campaign

The classic marketing-campaign tags.

landing.html?utm_source=newsletter&utm_medium=email&utm_campaign=spring2026&id=42 Open ↗
Expected: strip utm_* · only id=42 arrives
Ad click IDs
fbclid · gclid

Facebook + Google ad-click identifiers.

landing.html?fbclid=AbC123xYz&gclid=Cj0KCQiAxyz&id=42 Open ↗
Expected: strip fbclid, gclid · only id=42 arrives
AdGuard long-tail (NEW in Phase 1)
tgclid · ranMID · mc_eid

Trackers the AdGuard URL Tracking list adds beyond ClearURLs.

landing.html?tgclid=tg123&ranMID=12345&mc_eid=m99&id=42 Open ↗
Expected: strip tgclid, ranMID, mc_eid · only id=42 arrives
Kitchen sink
five trackers + a real param

A worst-case mix across sources.

landing.html?utm_source=x&fbclid=y&gclid=z&tgclid=t&ranMID=r&id=42 Open ↗
Expected: strip all five · only id=42 arrives
Control — no trackers
id · page

Sanity check: a clean link must pass through untouched (DNR shouldn't over-strip).

landing.html?id=42&page=3 Open ↗
Expected: id=42 and page=3 both arrive unchanged

Skip the wrapper Extension

These links normally bounce through an AMP wrapper. With Unfurl you land straight on the destination — watch the address bar.

Under the hood

AMP-class wrappers carry their real destination unencoded in the path; the extension rewrites them with regexSubstitution before navigation. Unlike the param tests above, these land on the real destination (the rule prepends https://, so they can't return to the landing page here) — success means the address bar shows the destination host, not the wrapper.

Google AMP viewer
www.google.com/amp/s/…

Google's AMP wrapper around a third-party page; the destination follows /amp/s/ unencoded.

https://www.google.com/amp/s/example.com/article-on-something Open ↗
Expected: unwrap → address bar shows example.com/article-on-something, not google.com/amp/s/…
Verified: Network tab (Preserve Log) shows one request — to example.com, none to google.com. A brief Google tab-icon before it lands is a cached-favicon flash, not a network hit. If you land on a google.com/url?q=… notice instead, the rule didn't fire (stale ruleset — rebuild the v2 host).
AMP cache (ampproject)
*.cdn.ampproject.org/c/s/…

The Google/Cloudflare AMP cache shape; destination follows /c/s/ unencoded.

https://example-com.cdn.ampproject.org/c/s/example.com/page Open ↗
Expected: unwrap → example.com/page. If the rule doesn't fire you'll hit a DNS error on the ampproject host — which itself signals "not unwrapped."
Encoded wrapper — NOT click-time
doubleclick /aclk?adurl=…

The destination is percent-encoded in a query param. DNR can't URL-decode (verified — DNRProbe case 5), so this is deliberately not unwrapped at click time; only the clipboard engine (Copy) handles it.

https://googleads.g.doubleclick.net/aclk?sa=l&adurl=https%3A%2F%2Fexample.com%2Fdest
Expected: Copy → clipboard unwraps to example.com/dest; a click would leave it (by design)

The usual suspects Copy · Mac app

Campaign tags that follow you everywhere. Copy a link — paste it back clean.

Under the hood

Cross-site marketing analytics params — added by ad networks and email tools, recognized by name regardless of host. Covered by ClearURLs' global rules.

UTM-tagged article
utm_source · utm_medium · utm_campaign

The full UTM cluster, the way mailing-list software emits it.

https://example.com/article?utm_source=newsletter&utm_medium=email&utm_campaign=spring2026&id=42
Expected: strip utm_* · keep id=42
Facebook click ID
fbclid

Appended by Facebook when you click a link in their feed.

https://example.com/post?fbclid=AbC123xYz_long_token_string&id=42
Expected: strip fbclid · keep id=42
Google Ads click ID
gclid

Appended by Google when you click through an ad or sponsored result.

https://example.com/buy?gclid=Cj0KCQiAxyz_lorem_ipsum&product=42
Expected: strip gclid · keep product=42
Mailchimp email ID
mc_eid · mc_cid

Per-recipient analytics for Mailchimp campaigns.

https://example.com/?mc_eid=abc123&mc_cid=xyz789&id=42
Expected: strip mc_eid, mc_cid

Site-specific clutter Copy · Mac app

Junk that only one site uses — scrubbed there, untouched everywhere else.

Under the hood

Per-host rules from ClearURLs providers and Brave's clean-urls list. Each rule is scoped to its host, so other sites that happen to share a param name are never affected.

Amazon product page
amazon.com

Amazon embeds a `/ref=…` segment in product URLs that identifies the entry path.

https://www.amazon.com/Some-Product/dp/B000ABCDEF/ref=sr_1_1?keywords=test&qid=1234
Expected: strip /ref=…, keywords, qid
YouTube watch link
youtube.com

The `si=` param is YouTube's "shared from" attribution token.

https://www.youtube.com/watch?v=dQw4w9WgXcQ&si=tracking_token_abc&t=42
Expected: strip si · keep v, t
Spotify share link
open.spotify.com

Spotify's `si=` is a per-share tracking token.

https://open.spotify.com/track/4cOdK2wGLETKBW3PvgPWqT?si=abc123def456
Expected: strip si

Unwrap the middleman Copy · Mac app

The link points at a redirector — your clipboard gets the real destination.

Under the hood

These URLs point at a redirector rather than the destination. The offline engine (Brave + Unfurl debounce rules) extracts the wrapped URL from a known parameter or path shape — no network request needed.

Google AMP redirect
www.google.com/amp/s/…

Google's mobile-AMP wrapper around a third-party page.

https://www.google.com/amp/s/example.com/article-on-something
Expected: unwrap to https://example.com/article-on-something
Google Ads aclk wrapper
googleads.g.doubleclick.net/aclk

The doubleclick ad-click wrapper. Unfurl's own debounce rule extracts `adurl` and the cleaning pipeline then strips the destination's marketing tail.

https://googleads.g.doubleclick.net/aclk?sa=l&ai=foo&adurl=https%3A%2F%2Fkoreadates.com%2Fsp%3Fpartner%3Dadw%26gclid%3Dxyz%26target%3D%26asset_type%3D
Expected: unwrap adurl, strip gclid + empty paramshttps://koreadates.com/sp?partner=adw

The long tail Copy · Mac app

Thousands of rarer trackers most cleaners miss — covered.

Under the hood

2,521 $removeparam rules adopted from the AdGuard URL Tracking list — the long tail of tracker param names that ClearURLs and Brave haven't catalogued.

Telegram channel share
tgclid

Telegram's click-tracking ID added when sharing channel posts.

https://example.com/article?tgclid=abc123def456&id=42
Expected: strip tgclid · keep id=42
Rakuten affiliate link
ranMID · ranEAID · ranSiteID

Rakuten's three-param affiliate attribution cluster.

https://shop.example.com/?ranMID=12345&ranEAID=678&ranSiteID=abc&product=42
Expected: strip ranMID, ranEAID, ranSiteID · keep product=42
Email-marketing tracking cluster
eml-name · eml-mediaplan · eml-publisher

Generic email-campaign attribution params several platforms use.

https://example.com/article?eml-name=spring_newsletter&eml-publisher=substack&eml-mediaplan=plan42&id=42
Expected: strip all three eml-* params
X-Clickref tracking
x-clickref · x-source · x-a-medium

Generic "X-" prefixed tracker params — used by various ad networks.

https://example.com/post?x-clickref=tracking_id&x-source=newsletter&x-a-medium=email&id=42
Expected: strip x-clickref, x-source, x-a-medium
Analytics trace context
analytics_context · analytics_trace_id

Distributed-tracing tokens leaking into share URLs.

https://example.com/page?analytics_context=session_42&analytics_trace_id=trace_xyz&id=42
Expected: strip analytics_context, analytics_trace_id
Link tracking shorthand
_ly_c · _ly_r · taid

Shorthand tokens used by various link-shortener and analytics tools.

https://example.com/page?_ly_c=campaign_42&_ly_r=referrer&taid=track_abc&id=42
Expected: strip _ly_c, _ly_r, taid

The kitchen sink Copy · Mac app

Everything at once. Still one clean link.

Under the hood

URLs that exercise multiple rule sources in a single clean — useful for verifying the pipeline composition (ClearURLs + Brave + AdGuard + the empty-param sweep) works end to end.

Five trackers from four sources
Brave + ClearURLs + AdGuard + sweep

Real-world worst case — utm (ClearURLs), fbclid (ClearURLs), gclid (ClearURLs), tgclid (AdGuard NEW), ranMID (AdGuard NEW), plus an empty param.

https://example.com/article?utm_source=newsletter&fbclid=fb_abc&gclid=g_xyz&tgclid=tg_123&ranMID=456&empty=&id=42
Expected: strip 6 trackers + empty · keep id=42 → https://example.com/article?id=42
Amazon with universal + per-host + AdGuard
amazon.com

Amazon URL with marketing trackers and the host-specific /ref=… segment.

https://www.amazon.com/Item/dp/B000ABCDEF/ref=sr_1_1?utm_source=ad&fbclid=fb&tgclid=tg&keywords=test
Expected: strip /ref=…, utm_source, fbclid, tgclid, keywords

Flagged, not faked Copy · Mac app

Some links can't be cleaned offline. Unfurl tells you — instead of pretending.

Under the hood

Known shorteners, opaque wrappers, and single-use token URLs can't be reversed without a network request. The analyzer flags these so you get a heads-up rather than a silent passthrough — and the optional network resolver (off by default, your call) can follow the chain for you.

bit.ly shortener
known-shortener

Resolving requires a network HEAD request to bit.ly — that's v2's job. v1 flags + passes through.

https://bit.ly/3xYzAbC
Expected: flag as known shortener · pass through unchanged
Sendgrid email click wrapper
sendgrid.net

Mailing-list click trackers wrap the destination in a session-encoded URL. Can't reverse offline.

https://url1234.send.example.com/ls/click?upn=abcXYZopaque_session_token
Expected: flag as opaque wrapper