Open source · AGPL-3.0

Know who clicks.
Keep the data.

Self-hosted link shortener with analytics, file tracking, and click alerts. Deploys to Cloudflare Workers. Free tier handles 33K clicks/day.

One command. No credit card. Takes about 4 minutes.

app.linktracker.dev/dashboard
Clicks today
2,847
+12.3%
Links
1,204
38 this week
Top link
/product-launch
847 clicks
Unique
1,923
67.5% rate
Click volume
7d 30d 90d
3k2k1k0
Live feed
/product-launch San Francisco, US
2s ago
/deck-v3 London, UK
8s ago
/blog-post Tokyo, JP
14s ago
Built on Workers Hono D1 R2 KV Queues
TypeScript | React dashboard | Chrome extension

What you get

Everything Bitly charges for. Nothing they don't give you.

Click analytics with city-level geo

Country, region, city, device, OS, browser, referrer, and UTM parameters. Tracked via Cloudflare's edge -- no client-side JavaScript required. We HMAC-SHA256 hash visitor IPs with a daily-rotating salt. Same-day dedup, zero long-term tracking.

File tracking

Share PDFs with page-by-page view analytics. DocSend charges $45/user/mo for this.

Click alerts

Email or webhook the moment someone opens your link. Set per-link or globally. HMAC-signed webhook payloads.

Unlimited custom domains

Bitly gives you 1. Dub gives you 10. You get unlimited. SSL via Cloudflare, no cert management.

Unlimited links

No monthly caps. 5GB D1 storage on the free tier holds millions of links and click records.

Access gates

Password-protect links or require email capture before redirect. PBKDF2 hashed, 600K iterations.

Pricing

$0/mo for what they charge $35+.

Cloudflare Workers free tier: 100K requests/day. Paid plan ($5/mo) unlocks 10M requests/month.

Feature Bitly Growth
$35/mo
Dub.co Pro
$25/mo
DocSend Std
$45/user/mo
LinkTracker
$0 -- $5/mo
Short links 500/mo 1,000/mo -- Unlimited
Custom domains 1 10 -- Unlimited
City-level geolocation $199/mo plan --
Click alerts -- -- Email only Email + webhook
File tracking (per-page) -- --
Password protection --
Self-hosted -- -- --
Open source -- --
API + CLI + MCP API only API only API only All three

Setup

Running in 4 minutes

1

Deploy the worker

One command. Sets up D1, R2, KV, and Queues on your Cloudflare account.

$ npx create-linktracker
2

Create a link

Dashboard, CLI, API, Chrome extension, or MCP server. Pick your interface.

$ linktracker shorten https://example.com/long/path
 
Created: lnk.to/abc123
Link ID: lnk_7kNx2mP9
3

Watch clicks arrive

Redirects resolve in under 10ms at the edge. Analytics are written async via Cloudflare Queues.

click /abc123 San Francisco, US · Chrome · macOS
click /abc123 London, UK · Safari · iOS
alert /abc123 webhook sent → https://your-app.com/hook

Privacy

Analytics without surveillance

IP anonymization

Raw IPs are never stored. We HMAC-SHA256 hash each IP with a daily-rotating salt derived from a secret you control. Same IP on the same day produces the same hash (for unique visitor counting). Different day, different salt, different hash. Unlinkable.

salt = HMAC(secret, "2026-04-11")
hash = HMAC(salt, ip_address)
// Tomorrow's salt invalidates today's hashes

Your infrastructure

Deploys to your Cloudflare account. The data lives in your D1 database, your R2 bucket, your KV namespace. No third-party analytics. No tracking pixels. No data leaves your account unless you set up webhooks.

AGPL-3.0
Copyleft license
SQLite
Export anytime

Interfaces

5 ways in. One data store.

Dashboard

React + Vite

Extension

Manifest V3

CLI

npm package

REST API

Stripe-style

MCP

AI agents

Start tracking clicks.

Join 500+ developers who self-host their link analytics. Runs free on Cloudflare. No vendor lock-in. Export your data as SQLite anytime.

$ npx create-linktracker
Cloning repository...
Creating D1 database linktracker_db
Creating R2 bucket linktracker_files
Creating KV namespace linktracker_cache
Deploying worker...
Done. Your tracker is live at https://lnk.yourdomain.com