unsubbed.co

Sink

Released under AGPL-3.0, Sink provides serverless link shortener on self-hosted infrastructure.

Open-source link shortening and analytics, honestly reviewed. No marketing fluff, just what you get when you deploy it.

TL;DR

  • What it is: Open-source (AGPL-3.0) link shortener with built-in analytics, deployed entirely on Cloudflare’s serverless infrastructure — no VPS, no Docker, no database to manage [1].
  • Who it’s for: Founders, marketers, and indie hackers who want Bitly-style link management without the $35/mo bill, and who already use or are comfortable with Cloudflare [1].
  • Cost savings: Bitly’s paid plans start around $35/mo; Rebrandly from $13/mo. Sink runs on Cloudflare’s free tier for most individual use cases — effectively $0/mo for light-to-moderate traffic, or $5/mo (Cloudflare Workers Paid) for high volume [1][3].
  • Key strength: The architecture is the product. By building entirely on Cloudflare Workers KV and Analytics Engine, Sink eliminates the operational overhead that kills most self-hosted tools — there’s no server to patch, no Postgres to back up, no memory leak to debug at 2am [1].
  • Key weakness: You’re entirely inside Cloudflare’s ecosystem. If you ever want to migrate off, Workers KV is not a portable database. The analytics engine is also Cloudflare-proprietary, and the roadmap item for Cloudflare D1 (a more capable SQL database) is still marked incomplete [1].

What is Sink

Sink is a link shortener with analytics that runs 100% on Cloudflare’s infrastructure. You create short URLs, track clicks, and inspect analytics through a dashboard — all standard link shortener behavior. What makes it unusual is the deployment model: there is no server. The application runs as a Cloudflare Worker, stores links in Workers KV (a globally distributed key-value store), and records click analytics via Cloudflare’s Analytics Engine. The frontend is a Nuxt application deployed to Cloudflare Pages or Workers [1].

The GitHub README describes it plainly: “A Simple / Speedy / Secure Link Shortener with Analytics, 100% run on Cloudflare.” That’s accurate and not underselling. The project sits at 6,455 GitHub stars and was featured on Hacker News (discussion thread: news.ycombinator.com/item?id=40843683), HelloGitHub, and Uneed, where it picked up their Product of the Week badge [1][2].

The AGPL-3.0 license is worth understanding before you deploy. Unlike MIT, AGPL requires that if you modify Sink and run it as a network service, you must publish your modified source code. For most self-hosters running their own instance, this is irrelevant. If you’re embedding Sink into a SaaS product you sell, read the license first.


Why people choose it

The honest answer is: the architecture. Most self-hosted link shorteners require a full server stack — YOURLS needs PHP and MySQL, Shlink needs PHP or Docker, Polr needs Composer and a MySQL database. Sink’s entire infrastructure requirement is a Cloudflare account, which most people already have for DNS [1].

The HN discussion at launch [2] centered on exactly this point — Cloudflare’s free tier is unusually generous for serverless workloads, and a link shortener is precisely the kind of low-compute, high-availability use case that benefits most from it. Workers handle cold starts in under a millisecond globally, KV reads are fast enough for link redirects, and the Analytics Engine gives you real-time data without running a self-hosted Plausible or Matomo.

There’s also a practical appeal to the feature set beyond bare link shortening: device-based routing (send iOS users to the App Store, Android to Play Store), link expiration, OpenGraph preview customization, QR code generation, and AI-assisted slug generation [1]. These are features Bitly charges for on paid tiers.

The 3D globe real-time visualization is a minor point, but it’s the kind of thing that makes the tool feel polished rather than utilitarian — which matters when you’re deciding whether to actually use something or just admire it on GitHub.


Features

Based on the README [1]:

Core link management:

  • URL shortening with customizable slugs (case-sensitive)
  • AI-assisted slug generation
  • Link expiration dates
  • Device-based routing — separate URLs for iOS, Android, and desktop
  • OpenGraph preview customization (title, description, image) per link
  • QR code generation for each short link
  • Bulk import/export via JSON or CSV

Analytics:

  • Per-link click analytics with charts
  • Real-time event log
  • Real-time 3D globe visualization of click origins
  • Dashboard overview across all links

Platform and UX:

  • Full i18n support for the dashboard (multi-language)
  • Light/dark/system theme
  • REST API with OpenAPI documentation
  • MCP-compatible via mcp-openapi-proxy (not native MCP server, but workable) [1]

Ecosystem extensions (third-party, community-built):

  • Browser extension: Sink Tool
  • Chrome extension: Sink Quick Shorten (available on Chrome Web Store)
  • Raycast extension: Raycast-Sink
  • Apple Shortcuts integration
  • iOS native app (App Store: id6745417598)

What’s not here yet (roadmap):

  • Enhanced link management with Cloudflare D1 (currently KV-only) — this matters because KV has eventual consistency and limited querying capabilities
  • Analytics filter merging (can’t currently combine conditions)
  • Dashboard infinite loading (pagination is basic)
  • Unit tests — the codebase has none yet [1]

The missing unit tests are worth flagging. It’s not a dealbreaker for a link shortener, but it signals the project is still maturing.


Pricing: SaaS vs self-hosted math

Sink on Cloudflare Free Tier:

  • Workers: 100,000 requests/day (redirects + dashboard)
  • Workers KV: 100,000 reads/day, 1,000 writes/day
  • Workers Analytics Engine: 100,000 events/day (click tracking)
  • Cost: $0/mo

For a typical small team managing a few hundred short links with moderate traffic, the free tier covers everything. If you’re running a link shortener for a marketing campaign with tens of thousands of clicks per day, you’ll hit KV read limits and need to upgrade [3].

Sink on Cloudflare Workers Paid Plan:

  • $5/month base
  • 10M requests/month included
  • Additional KV reads: $0.50 per million
  • Additional Analytics Engine events: $0.25 per million
  • Cost for high-volume use: $5–15/mo

Competitor pricing for comparison:

ToolPlanPriceLinksClicks
BitlyFree$010 links/moLimited
BitlyCore$10/mo200/moUnlimited
BitlyGrowth$35/mo500/moUnlimited
RebrandlyFree$010 links1K clicks/mo
RebrandlyStarter$13/mo200 links5K clicks/mo
Short.ioFree$0150 links1K clicks/mo
Short.ioStarter$15/moUnlimited50K clicks/mo
Sink self-hosted$0–5/moUnlimited~3M clicks/mo free

The math is straightforward. If you need more than Bitly’s 10 free links per month, you’re looking at $10–35/mo on Bitly. Sink self-hosted on Cloudflare free tier handles unlimited links and ~3M clicks/month at $0. On the paid Workers plan, that scales to hundreds of millions of clicks for $5/mo [1][3].

One thing to factor in: you’ll want a custom domain. Cloudflare domains run $8–12/year, and you can point any existing domain you own at Sink without paying Cloudflare anything extra for that.


Deployment reality check

Sink’s deployment is genuinely different from other self-hosted tools and deserves a separate explanation.

What you need:

  • A Cloudflare account (free)
  • A custom domain (optional — you can use a *.workers.dev subdomain)
  • Node.js installed locally for the setup CLI
  • About 15–30 minutes

What you do NOT need:

  • A VPS or server
  • Docker
  • PostgreSQL, MySQL, Redis
  • A reverse proxy (nginx, Caddy)
  • SSH access to anything

The deployment path is either Cloudflare Workers or Cloudflare Pages, both supported. The README links to a YouTube tutorial for those who prefer video. The project has a one-click deploy option [1].

What can go wrong:

Workers KV is eventually consistent. For a link shortener this matters: if you create a short link and immediately share it, there’s a small window (usually under a second, sometimes a few seconds globally) where the link may not resolve in all Cloudflare edge locations. For most use cases this is invisible. For live-event marketing where you’re sharing a link at the moment it’s created, it can bite you.

The analytics backend is Cloudflare’s Analytics Engine, which is a proprietary time-series store. You can’t run your own SQL queries against it, and if you ever want to export historical analytics data and move to a different system, there’s no clean migration path. The upcoming D1 support in the roadmap may change this for link storage, but analytics will stay Cloudflare-bound [1].

The iOS app is listed in the roadmap as completed, but it’s a third-party app, not officially maintained by the Sink project [1]. Treat it as community software with no guaranteed update cadence.

For non-technical founders: Sink is easier to deploy than most self-hosted tools precisely because it doesn’t involve a Linux server. If you can follow a Cloudflare tutorial and run a few CLI commands, you can have it running. That said, “no server” does mean “different mental model” — debugging a Cloudflare Worker is not the same as SSHing into a VPS and reading logs.


Pros and Cons

Pros

  • Zero infrastructure overhead. No server to maintain, no database to back up, no container to update. Cloudflare handles availability, scaling, and global distribution [1].
  • Effectively free for most use cases. The Cloudflare free tier covers individual and small-team use generously. $0/mo for a link shortener with analytics is hard to argue with [1][3].
  • Fast by default. Cloudflare’s edge network means redirects resolve from the nearest PoP globally, typically sub-50ms. This is faster than most self-hosted alternatives running on a single VPS [1].
  • Feature-complete for link shortening. Device routing, expiration, OpenGraph customization, QR codes, AI slugs, bulk import/export — this covers everything Bitly’s paid tiers offer [1].
  • Real-time analytics with a 3D globe. A small thing, but the live visualization is actually useful for monitoring campaigns as they run [1].
  • Growing extension ecosystem. Browser extension, Chrome extension, Raycast, Apple Shortcuts, iOS app — the community has built real tooling around it [1].
  • REST API + OpenAPI docs make automation and integration straightforward [1].

Cons

  • Total Cloudflare lock-in. Your links live in Workers KV, your analytics in Analytics Engine, your app runs on Workers. If Cloudflare changes pricing or terms, migrating is painful. There is no “export to standard Postgres and run elsewhere” path [1].
  • AGPL-3.0, not MIT. If you’re embedding this in a commercial product, you must open-source your modifications. Not a problem for personal/team use, potentially a blocker for product use [1].
  • KV eventual consistency. Not suitable for use cases where a link must be globally available within milliseconds of creation [3].
  • Analytics are read-only from Cloudflare. No custom SQL queries, no easy data export, no third-party BI tools pointed at the same data [1].
  • No unit tests. The codebase is production-ready but lacks test coverage, which matters if you’re forking and modifying [1].
  • Community-maintained extensions. The browser extensions, iOS app, and Raycast extension are community projects — not guaranteed to be maintained if the ecosystem cools [1].
  • No team features. There’s a single site token for authentication. No user accounts, no per-user permissions, no audit log of who created which link. This is a solo/small team tool as-is [1].
  • MCP support is indirect. The README acknowledges there’s no native MCP server — you work around it via mcp-openapi-proxy and the OpenAPI spec. Functional but not first-class [1].

Who should use this / who shouldn’t

Use Sink if:

  • You’re paying $10–35/mo for Bitly and your main needs are link shortening, click tracking, and custom slugs.
  • You want to run a self-hosted tool and actively don’t want to manage a Linux server — Cloudflare’s serverless model removes that entirely.
  • You’re already in the Cloudflare ecosystem (DNS, CDN) and want to add link shortening without adding new infrastructure.
  • You need device-based routing (iOS/Android/desktop different URLs) — this is a paid feature on most SaaS competitors.
  • You’re a solo founder or team of 2–5 people who can share a single site token.

Skip it if:

  • You need multi-user access with individual accounts and permissions — Sink has none of this.
  • You need to own your analytics data in a portable format (SQL, exportable time-series) — the Analytics Engine data is Cloudflare-only.
  • You’re building a commercial product that wraps link shortening — AGPL-3.0 requires publishing your modifications.
  • You want a fully self-contained on-premises deployment where no data touches a third party — Cloudflare is the third party here.
  • You’re a non-technical founder who has never touched Cloudflare before and has no technical support — the learning curve isn’t severe, but it’s non-zero.

Alternatives worth considering

  • YOURLS — The grandfather of self-hosted link shorteners. PHP + MySQL, runs on any VPS, massive plugin ecosystem, but requires actual server management and hasn’t modernized much.
  • Shlink — PHP-based, Docker-friendly, feature-rich (multi-domain, REST API, Matomo integration). More capable than Sink for complex multi-tenant setups, but requires a VPS and database.
  • Dub.co — Open-source (AGPL-3.0) link management platform with a polished commercial SaaS offering. More features than Sink (workspaces, tags, Zapier integration), more complex to self-host, free cloud tier available.
  • Bitly — The commercial standard. Easiest onboarding, largest ecosystem, but $35/mo for meaningful usage and fully closed source.
  • Short.io — Cleaner than Bitly, custom domains on all plans, $15/mo starter. No self-hosted option.
  • Rebrandly — Good for branded links and team collaboration, $13/mo starter, no self-hosted option.

For non-technical founders choosing between self-hosted and SaaS: Sink vs Dub.co cloud is the practical comparison. Sink’s free Cloudflare deployment vs Dub’s free cloud tier. Dub wins on features and polish; Sink wins on data ownership and zero vendor lock-in (within Cloudflare’s ecosystem, at least).


Bottom line

Sink is the right answer to a specific question: “I want link shortening with analytics, I don’t want a monthly SaaS bill, and I don’t want to manage a server.” If that’s your situation, it’s an excellent choice — the Cloudflare architecture is genuinely clever, the feature set matches or exceeds paid Bitly tiers, and the operational overhead is about as low as self-hosted software gets. The trade-offs are real: total Cloudflare dependency, no multi-user access controls, proprietary analytics storage, and AGPL licensing for anyone building commercial products on top of it. For a solo founder or small team running campaigns, managing affiliate links, or replacing a Bitly subscription, those trade-offs are usually acceptable. For anyone who needs data portability, team governance, or complete infrastructure independence, look at Shlink or Dub.co instead.


Sources

  1. Sink — GitHub Repository and README (6,455 stars, AGPL-3.0). https://github.com/ccbikai/sink
  2. Hacker News — Sink launch discussion. https://news.ycombinator.com/item?id=40843683
  3. Sink live demo — sink.cool/dashboard (Site Token: SinkCool). https://sink.cool/dashboard
  4. Cloudflare Workers pricing page — free tier limits and paid plan details. https://developers.cloudflare.com/workers/platform/pricing/

Features

Integrations & APIs

  • Plugin / Extension System
  • REST API

Import & Export

  • Migration Tools

Customization & Branding

  • Dark Mode
  • Themes / Skins

Analytics & Reporting

  • Charts & Graphs
  • Dashboard

Localization & Accessibility

  • Multi-Language / i18n

Mobile & Desktop

  • Mobile App