4 open source tools compared. Sorted by stars. Scroll down for our analysis.
By Erik Loyd, SaaS CEO and former COO/CFO of an AWS Premier Partner.
| Tool | Stars | Velocity | Score |
|---|---|---|---|
YOURLS 🔗 The 𝘥𝘦 𝘧𝘢𝘤𝘵𝘰 standard, self hosted, powerful and customizable, URL shortener in PHP | 12.3k | +2/wk | 90 |
kutt Free Modern URL Shortener. | 11.2k | +7/wk | 80 |
shlink The definitive self-hosted URL shortener | 5.3k | +10/wk | 80 |
zws Shorten URLs using invisible spaces | 1.8k | - | 72 |
Stay ahead of the category
New tools and momentum shifts, every Wednesday.
YOURLS has been the default answer to "I want my own short domain" since 2009. It shortens links under a domain you control, records click statistics, exposes an API, and takes plugins for nearly everything it does not do out of the box. The stack is PHP and MySQL, which in 2026 reads as either a warning or a relief depending on where you host. Drop it on any cheap shared host, point a short domain at it, run the installer, and you are done. No Docker requirement, no build step, no Node toolchain, no container orchestration. Free under MIT with no paid tier and no cloud upsell. For shortening links in a newsletter, on a conference slide, or across an internal wiki, this is the cheapest correct answer. Bitly's free plan now allows five links a month, which makes the comparison short. The catch is the admin interface. It looks its age and has not meaningfully changed in years. The plugin ecosystem fills the gaps, but finding the right plugin means reading forum threads from 2018 and hoping the author still maintains it. For a modern UI without that archaeology, look at shlinkio/shlink or thedevs-network/kutt.
Kutt is the easiest self-hosted shortener to actually get running. It defaults to SQLite, so there is no separate database server to provision, and Node 20 plus a single command puts you in business. The feature list covers what people really use: custom domains, password protected links, expiration times, private per link statistics, a REST API, admin controls for managing users and links, and OIDC login when you want it wired into a company identity provider. Postgres and MySQL are available for when SQLite stops being enough, and Redis is optional caching rather than a requirement. MIT licensed and free, with a free hosted instance at kutt.to for anyone who does not want to run anything at all. Solo: use kutt.to. Small teams: self-host, since the SQLite default keeps the whole thing to one process and one file on disk. Teams routing many domains at scale should look at shlinkio/shlink instead. The catch is that the low setup cost comes from doing less. There is no plugin system the way YOURLS/YOURLS has one, and the analytics stop at the basics. For most people that is a fair trade, but know what you are trading before the reporting request arrives.
Shlink is a URL shortener built API first. Every action goes through a documented REST API, which makes it the right pick when shortening a link is a step inside some other system rather than something a person does in a dashboard. It runs on PHP 8.4 or 8.5 against MySQL, MariaDB, PostgreSQL, Microsoft SQL Server, or SQLite, and official Docker images exist. The web dashboard is a separate project you deploy yourself, or you can point the hosted client at app.shlink.io toward your own server and keep the data local. Multi-domain support lets one instance serve several short domains at once. Free under MIT, all of it, with no paid tier at all. This is more machinery than YOURLS/YOURLS, and in exchange you get real visit tracking, geolocation stats, QR code generation, and an API that came first rather than as an afterthought. Teams generating short links programmatically should start here. The catch is that two piece deployment. Not realizing the dashboard is a separate install is the most common first hour confusion with this project, and the PHP 8.4 floor rules out a lot of older shared hosting that would happily run YOURLS.
zws shortens URLs into invisible characters. The link is real and it resolves, but the visible portion is zero width Unicode, so what you paste looks like nothing at all. It is a gimmick, and it is also a working service with a documented API and a real database underneath it. The stack is TypeScript and Next.js on Postgres, self-hostable if you want your own invisible domain. There is a public instance at zws.im, an API with documentation, statistics endpoints, and a ShareX integration for people who paste screenshots all day long. Free under Apache 2.0 with no paid tier, funded through OpenCollective. Nobody should build a marketing attribution stack on this. Use it for a joke in a group chat, a puzzle, an easter egg in a conference talk, or the specific pleasure of watching someone try to read a link that is not there. The catch is that an invisible link is indistinguishable from phishing to any security filter that inspects it. Slack, Outlook, and most corporate mail gateways will strip it or flag it. That is not a defect in zws, it is the predictable result of hiding a URL on purpose. For anything with actual stakes use thedevs-network/kutt or shlinkio/shlink.