Det korta svaret
Välj Shlink för ett marknadsteam. Det har taggar, utgångsdatum, ett högsta antal besök, QR-koder, omdirigering efter enhet eller språk och statistik per land, stad, webbläsare och hänvisande sida, med botar för sig. Besökarnas IP-adresser sparas förkortade från början. Med Shlink Dashboard får kollegerna egna inloggningar, och API-nyckeln når aldrig deras webbläsare. Det är den långsammare av de två, med omkring 60 ms per omdirigering mot 13, och Dashboard har ännu inte nått version 1.0.
Välj YOURLS om en eller två personer behöver en egen kort domän och inte mycket mer. Den var snabbast och enklast i vårt test. Men den saknar taggar, utgångsdatum och QR-koder utan tillägg, räknar botar som klick, sparar varje besökares hela IP-adress, och alla användare får göra allt.
Båda underhålls och har MIT-licens. Ingen av dem låter obehöriga skapa länkar med uppsättningen nedan.
Det här testade vi
Vi installerade båda på samma nya Melonslab VC-P Alloy (2 vCPU, 8 GB) med Debian 13, under var sin användare, som rootless Podman-enheter med Quadlet bakom samma Caddy, med lösenord och nycklar som Podman-hemligheter. Shlink fick PostgreSQL 18 och YOURLS MariaDB 12.3, den databas som var och en stöder bäst. Vi har ingen guide för någon av dem än, så Så körde vi Shlink och Så körde vi YOURLS visar enhetsfilerna, ovanpå Podman-guiden.
Båda underhålls. Shlink 5.1.7 kom den 21 september 2026 och YOURLS 1.10.6 den 30 augusti 2026, enligt deras sidor med versioner på GitHub, som vi läste den 14 oktober 2026. Vi behövde alltså ingen ersättare. Av de vanliga alternativen lever Kutt också, med version 3.2.6 den 5 juli 2026; den testade vi inte. Dub publicerar sin kod under AGPL 3.0, men dess guide för egen drift kräver konton hos Vercel, Tinybird, Upstash och PlanetScale, så den går inte att köra på bara din egen server.
Varje app fick en egen kort domän, en underdomän till vår testdomän, go.example.com på den här sidan. Sedan gjorde vi samma saker i båda:
- skapade 200 länkar via API:et, var och en med en egen slug som
spring-sale-linkedin-000och UTM-parametrar i målet, för 8 kanaler och 10 produkter. I Shlink fick varje länk också två taggar, 20 länkar ett slutdatum och 20 länkar högst 500 besök; - försökte skapa länkar utan att logga in, via API:et, adminsidorna och installationen;
- skickade 10 000 simulerade klick till var och en, åtta åt gången, från ett skript på själva servern. Det var inga riktiga besökare. Skriptet gav varje klick en påhittad besöksadress från svenska, norska, finska, danska, tyska, brittiska, franska och amerikanska nät, omkring 10 % av dem IPv6. Det gav också varje klick en webbläsare på Windows, macOS, iPhone eller Android, och en hänvisande sida: LinkedIn, Instagram, Facebook, Google eller ingen. Omkring 13 % av klicken hade botars user agent, som Googlebot, LinkedInBot, facebookexternalhit, curl och python-requests. Några få länkar fick de flesta klicken, som i verkligheten;
- kontrollerade sedan vad var och en visade, mätte tiden för omdirigeringar genom Caddy, minnet i vila efter en omstart och som mest under klicken, hur mycket disken växte och tiden för installationen;
- gjorde QR-koder, lade till en andra användare, importerade länkar från en CSV-fil, startade om servern, och tog en säkerhetskopia av varje databas och återställde den.
Bitly och Rebrandly testade vi inte. Vi skapade inget konto. Det sidan säger om dem kommer från deras egna sidor om priser, hjälp och API, som vi länkar till där vi använder dem och läste den 14 oktober 2026.
Siffrorna
| Shlink 5.1.7 | YOURLS 1.10.6 | |
|---|---|---|
| Containrar | 2: Shlink, PostgreSQL 18; 3 med Shlink Dashboard 0.3.1 | 2: YOURLS, MariaDB 12.3 |
| Minne i vila efter omstart | 85 MB (Shlink 79); 134 MB med Dashboard (49) | 142 MB (MariaDB 130, YOURLS 12) |
| Minne, som mest under 10 000 klick | omkring 110 MB (Shlink 99) | omkring 167 MB (MariaDB 137, YOURLS 30) |
| Avbilder på disken | 0,62 GB; 1,20 GB med Dashboard | 0,89 GB |
| Platsdatabas | DB-IP:s fria stadsdatabas, 127 MB, nedladdad | MaxMind GeoLite2 Country, 8,6 MB, medföljer |
| Databasvolym efter testet | 82 MB | 179 MB |
| Disk per 10 000 klick | 7,1 MB | 10,4 MB (3,1 MB av det i tabellen med klick) |
Från useradd till en fungerande app | 46 sekunder | 68 sekunder, med installationen |
| 200 länkar via API:et | 15 sekunder | 5 sekunder |
| 10 000 klick, åtta åt gången | 326 sekunder, 31 i sekunden | 39 sekunder, 256 i sekunden |
| Tid för en omdirigering genom Caddy, median (95:e percentilen) | 61 ms (79 ms) | 13 ms (20 ms) |
| Omdirigering | 302; 301, 307 eller 308 om du vill | 301 |
| Taggar, slutdatum, högsta antal besök | ja | nej, bara med tillägg |
| QR-koder | ja, i webbklienten och Dashboard | nej, bara med tillägg |
| Plats i statistiken | land, region, stad | land |
| Botar för sig | ja, alla 1 305 klick från botar markerade | nej, räknas som klick |
| Besökarens IP-adress sparas | IPv4 med sista delen satt till 0, IPv6 inte alls | hela |
| Användare och behörigheter | API-nycklar med roller; användare per server i Dashboard | användare i en konfigurationsfil, alla med alla rättigheter |
| Import från Bitly | inbyggd, kräver en token från Bitly (inte testad) | nej, bara med skript från andra |
| Svenskt gränssnitt | nej | nej |
| Licens | MIT | MIT |
Minnet är summan av appens containrar, mätt med podman stats fyra till fem minuter efter en omstart. Toppen är det högsta värdet medan de 10 000 klicken pågick. Installationstiden är hur lång tid kommandona tog att köra, mest nedladdning av avbilder, inte tiden det tar för dig att läsa och skriva dem. Tiden för omdirigeringar mätte vi med 300 anrop i rad över en HTTPS-anslutning till Caddy, från själva servern, så nätet mellan en besökare och servern är inte med.
Håll obehöriga ute
En länkförkortare som vem som helst kan använda hittas snart av spammare och nätfiskare. De gömmer sina mål bakom din domän, som folk litar på. Då lägger listorna som webbläsare, e-postfilter och sociala nätverk använder, som Google Safe Browsing och Spamhaus lista över domäner, till din korta domän. Sedan får dina egna länkar en röd varningssida eller sorteras bort ur meddelanden. Det tar tid att komma bort från en lista, och en listning kan nå längre än själva de korta länkarna. Bitly kontrollerar själva; deras hjälpsidor säger att "Bitly blocks a link when it's flagged as suspect". På din egen server är det enda skyddet att ingen kan skapa länkar utan att logga in.
Med uppsättningen nedan släpper ingen av apparna in obehöriga, och det kontrollerade vi:
- Shlink har ingen inloggningssida alls; allt går genom API:et, som kräver en nyckel. Att skapa en länk utan nyckel gav
401med "Expected one of the following authentication headers, "X-Api-Key"". En felaktig nyckel gav också401, "Invalid API key". Webbklienten och Dashboard är bara gränssnitt mot det API:et. Dashboard börjar med användarenadminoch lösenordetadmin, så byt det via en SSH-tunnel innan Caddy gör den publik, som i Så körde vi Shlink. - YOURLS är "private" från början, så länge du inte sätter
YOURLS_PRIVATE=false. API:et svarade "Please log in" med felkoden403, och adminsidorna, anropet för att lägga till länkar och statistiksidorna visade inloggningen. Installationen går att köra för vem som helst tills den har körts en gång, så kör den innan Caddy gör YOURLS publik, som vi gjorde. Efteråt svarade den "YOURLS already installed."
Installation
Ingen av apparna har en officiell uppsättning för Podman eller Quadlet; båda publicerar avbilder och exempel för Compose, som vi gjorde om till Quadlet-enheter.
- Shlink är en avbild med API:et och omdirigeringarna. Den skapar sina tabeller vid start och sin första API-nyckel från en Podman-hemlighet, så den var klar 46 sekunder efter att vi skapat användaren, utan någon inställning i en webbläsare. Webbgränssnittet är en egen app. Shlink 5 har inga egna QR-koder: de flyttade till webbklienten och Dashboard i version 5.0. Utan en licensnyckel från MaxMind laddar Shlink inte ner någon platsdatabas. Vi gav den i stället DB-IP:s fria stadsdatabas i samma format, som den använde utan problem.
- YOURLS är en avbild med PHP och Apache. Installationen är en enda knapp, som vi tryckte på med
curlfrån servern innan Caddy stod framför. Två saker behövdes innan den fungerade bra bakom Caddy:- Ett litet tillägg som litar på Caddy. Utan det loggade YOURLS varje klick med serverns egen adress, och med det land adressen hör till. YOURLS läser bara
X-Forwarded-Forfrån adresser som ett tillägg räknar upp. Så körde vi YOURLS har tillägget, på fem rader. - Det medföljande tillägget "Allow Hyphens in Short URLs". Utan det tog YOURLS tyst bort bindestrecken ur våra egna slugs:
spring-sale-linkedin-000blevspringsalelinkedin000. API:et svarade ändåsuccessoch gav tillbaka den ändrade adressen. Vi märkte det först när alla våra första 10 000 klick hamnade på YOURLS startsida, dit den skickar okända slugs. Vi slog på tillägget och skapade länkarna igen.
- Ett litet tillägg som litar på Caddy. Utan det loggade YOURLS varje klick med serverns egen adress, och med det land adressen hör till. YOURLS läser bara
Skapa länkar
Båda tog emot våra 200 länkar via API:et med egna slugs och UTM-parametrar orörda. Båda har också ett formulär för en länk i taget i webbgränssnittet.
- Shlink lade till två taggar på varje länk och tog emot ett slutdatum (
validUntil) och ett högsta antal besök (maxVisits). En länk som slutade gälla 20 sekunder efter att vi skapat den svarade302före och404efter. En länk med högst 3 besök svarade404på det fjärde. Du kan skicka de besökarna till en egen sida medDEFAULT_INVALID_SHORT_URL_REDIRECT. Dashboard har fält för båda i formuläret, under Limit access to the short URL. Shlink skickar också vidare parametrar på den korta länken till målet, sågo.example.com/fair?utm_source=posterlägger tillutm_sourcepå den långa adressen. Den kan också omdirigera efter enhet, språk, parameter, land eller datum. En regel vi satte skickade en iPhone till App Store och en webbläsare som bad om svenska till den svenska sidan. - YOURLS sparar en slug, ett mål och en titel, inget mer. Taggar, slutdatum och gränser för klick kräver tillägg, som Expiry, listat på Awesome YOURLS. Inget av dem testade vi. Från början tillåter den en kort länk per mål; enligt konfigurationsfilen låter
YOURLS_UNIQUE_URLS=falsedig skapa flera, en per kanal.
QR-koder. I Shlinks webbklient och Dashboard har varje länk QR code i sin meny, med storlek, marginal, färger, felkorrigering, en logotyp och PNG eller SVG. Koden görs i din webbläsare. Vi laddade ner en, och en QR-läsare läste rätt kort adress ur den. YOURLS har inga QR-koder. Det officiella exempeltillägget skickar den korta adressen till tjänsten api.qrserver.com, som ritar koden. Det "lokala" tillägg vi tittade på laddade ändå två skript från andra webbplatser, så vi installerade det inte. För YOURLS gör du QR-koder med något QR-verktyg du litar på.
301 eller 302
Koden för omdirigeringen avgör vem som minns målet.
- En 301 betyder "flyttad för gott". Webbläsare kan minnas den och hoppa över den korta länken nästa gång, så de besöken räknas inte, och om du byter mål kan den som varit där förut fortfarande hamna på det gamla. Sökmotorer läser en 301 som en bestående flytt till målet.
- En 302, eller en 307, betyder "tills vidare". Webbläsaren frågar den korta länken varje gång, så varje besök räknas och ett nytt mål gäller direkt.
För korta länkar i sociala medier, i tryck och i QR-koder spelar sökrankning knappt någon roll, eftersom länkarna sällan indexeras: Shlinks robots.txt ber sökmotorer att hålla sig borta, och YOURLS skickar X-Robots-Tag: noindex. Statistiken och friheten att byta mål betyder mer, och en tryckt QR-kod kan du bara rätta genom att ändra vart den pekar.
- Shlink svarar
302från början.REDIRECT_STATUS_CODEbyter till301,307eller308, och med en 301 säger Shlink enligt sin dokumentation åt webbläsare att minnas den i bara 30 sekunder (REDIRECT_CACHE_LIFETIME), så de flesta besök räknas ändå. Vi testade standardläget. - YOURLS svarar
301, utan besked om hur länge den ska minnas, och bara ett tillägg kan ändra det. - Bitly och Rebrandly använder båda 301, enligt Bitlys hjälpsidor, "we issue a 301 redirect", och Rebrandlys, "we use the 301 redirect".
Statistik från 10 000 simulerade klick
Båda räknade alla 10 000 klick. Det de visade skilde sig.
Shlink sparar varje besök med tid, hänvisande sida, user agent, land, region och stad, och om det ser ut som en bot. Webbklienten och Dashboard visar, per länk, per tagg eller för allt:
- besök över tid;
- operativsystem, webbläsare och hänvisande sidor;
- länder och städer;
- en lista över enskilda besök.
Allt går att exportera som CSV. Vår mest klickade länk visade Windows, macOS, Android och iOS, Chrome och Safari, och de hänvisande sidorna per domän. Bland städerna fanns Malmö, Göteborg, Stockholm, Oslo, London och Berlin. Shlink sparar också besök på startsidan och på slugs som inte finns, som "orphan visits", och där såg vi skannrar från internet inom några minuter efter att den kom online.
YOURLS visar, per länk, för de senaste 24 timmarna, 7 dagarna, 30 dagarna och för all tid:
- klick över tid;
- de vanligaste länderna, på en karta;
- direkta besök mot hänvisade;
- listan över hänvisande webbplatser.
Den listan visade var och en av våra fyra hänvisande sidor med "1" bredvid, inte deras 481, 256, 230 och 178 klick, som bara fanns i databasen. YOURLS sparar user agent men visar inget om enheter eller webbläsare. Tiderna följde UTC tills du sätter YOURLS_HOURS_OFFSET, som är ett fast antal timmar och inte följer sommartiden. YOURLS statistiksidor ritar också sina diagram med Google Charts, som laddas från google.com, och listan över länkar visar varje måls ikon via Google. Webbläsarna hos dem som använder adminsidorna kontaktar alltså Google; besökarna som klickar på dina länkar gör det inte.
Plats. Båda slår upp besökarens adress i en databasfil på servern; ingen adress skickas någonstans. YOURLS har MaxMinds GeoLite2 Country med, byggd den 21 augusti 2026, under MaxMinds licens för GeoLite. Den uppdateras när YOURLS släpper en ny version, eller av dig med ett konto hos MaxMind. Shlink laddar ner MaxMinds GeoLite2 City om du ger den en licensnyckel från ett gratiskonto hos MaxMind. Vi skapade inget sådant och använde DB-IP:s fria stadsdatabas i stället. Den har licensen Creative Commons Attribution 4.0, som ber dig ange DB-IP som källa där du visar dess data, och DB-IP publicerar en ny varje månad. De två databaserna var oense om en del av vår påhittade trafik. GeoLite placerade våra IPv6-adresser i Sverige och DB-IP i Storbritannien, så Sverige fick 5 348 klick i YOURLS och 3 894 i Shlink. Se landet för en enskild besökare som en god gissning.
För statistik över själva webbplatsen, efter klicket på länken, hamnar UTM-parametrarna i din webbanalys; läs Plausible eller Umami eller Matomo. Shlink kan också skicka sina besök till Matomo (MATOMO_ENABLED), vilket vi inte testade.
Botar
Våra 10 000 klick innehöll 1 305 med botars user agent. Så ser förhandsvisningar av länkar i LinkedIn, Facebook och Slack, sökmotorer och skript ut.
- Shlink markerade alla 1 305 som "potential bot", och API:et rapporterade 9 353 besök från människor och 1 308 från botar, inräknat tre av våra egna testklick med
curl. Webbklienten visar botar från början; Exclude bots wherever possible under Settings > Visits döljer dem. - YOURLS räknade varje bot som ett klick. På en länk som delas mycket får förhandsvisningarna ensamma siffrorna att se bättre ut än de är.
Ingen av dem kan skilja en människa från ett skript som låtsas vara en webbläsare. Bitly säger detsamma om sig själva: de "filters bot traffic to the best of our ability" men är "not designed to detect or counteract click fraud", enligt deras hjälpsidor.
Integritet och GDPR
Ett klick på en kort länk är en personuppgift så snart det har med en IP-adress. Här skiljer sig de två mest.
- Shlink förkortar IPv4-adresser innan den sparar dem, från början (
ANONYMIZE_REMOTE_ADDR): en besökare från81.228.102.134sparades som81.228.102.0. För besökare med IPv6 sparade den ingen adress alls, men slog först upp platsen. Dokumentationen varnar för att du utan det inte längre följer GDPR. Du kan också stänga av sparandet av adresser, hänvisande sidor eller user agent var för sig, eller allt sparande av besök. - YOURLS sparade varje besökares hela adress:
81.228.102.134sparades som81.228.102.134, bredvid tid, hänvisande sida och user agent. Det finns ingen inställning för att förkorta dem.YOURLS_NOSTATS=truestänger av loggningen av klick helt, statistiken också.
Ingen av dem raderar gamla besök av sig själv. Shlink har kommandon för att radera besök per länk och alla orphan visits; i YOURLS raderar du rader i databasen. På din egen server i Sverige lämnar uppgifterna inte EU, vilket varken Bitly eller Rebrandly kan säga. Bitlys hjälpsidor säger "Our data centers are in the United States", och Rebrandlys personuppgiftsbiträdesavtal säger att deras "primary processing facilities are in the United States of America".
Ett webbgränssnitt för kollegerna
Shlinks egen server har inget webbgränssnitt. Det finns tre sätt att få ett:
- Shlink Dashboard, det nyare, är en liten Node.js-app som du kör bredvid Shlink, med egna användare. Vi gav vår kollega Erik en inloggning: han loggade in, bytte sitt tillfälliga lösenord och skapade en länk med egen slug i formuläret. Webbläsaren pratade bara med Dashboard, och Shlinks API-nyckel fanns inte i något den fick: Dashboard håller den på servern. Den är i version 0.3.1, så räkna med ändringar.
- Shlinks webbklient är en statisk app, en enda liten container som vi körde under ett eget namn. Var och en lägger till servern med dess adress och en API-nyckel, som webbläsaren sparar i sin lokala lagring, i klartext. Den kontaktade inget annat än våra två egna adresser.
- app.shlink.io är samma webbklient, publicerad av Shlink. Appens kod kommer från shlink.io, men den körs i din webbläsare och pratar direkt med din Shlink, så dina länkar och din statistik går inte via shlink.io. API-nyckeln sparas i webbläsaren, som med din egen kopia. Det fungerar eftersom Shlink från början tillåter anrop från alla webbplatser (
CORS_ALLOW_ORIGIN). Den använde vi inte. Priset är förtroende: varje gång du öppnar den kör du kod från någon annans server med din API-nyckel, och en dator som tappas bort eller delas lämnar ut nyckeln. För ett företag skulle vi köra Dashboard.
Webbklienten och Dashboard finns bara på engelska. YOURLS kan läsa in översättningar, men Awesome YOURLS listar ingen på svenska.
YOURLS har sina adminsidor inbyggda: ett formulär överst för en länk och en valfri slug, en lista med sökning, och en sida med Stats per länk. Anna skapade en länk där på några sekunder. Den ser gammaldags ut, men alla klarar den.
Användare och behörigheter
- Shlink har API-nycklar, inte användare. En nyckel kan begränsas:
--author-onlyger en nyckel som bara ser och ändrar sina egna länkar. Eriks nyckel listade hans enda länk av 208 och svarade "Short URL not found" när den försökte läsa eller radera en av Annas. Nycklar kan också begränsas till en domän. I Dashboard skapar en administratör användare, som managed user, advanced user eller admin, och bestämmer vilka servrar varje managed user får använda. En server har en enda API-nyckel, så Erik såg och kunde ändra allt nyckeln tillät, alla länkar i vårt test. Vill du begränsa någon, ge deras server en nyckel med--author-only. - YOURLS läser sina användare från
config.php: en från containerns miljö, fler som rader i filen. Vi lade till Erik så, och hans inloggning fungerade i adminsidorna och API:et. Alla användare kan se, ändra och radera alla länkar; det finns inga roller. LDAP och andra inloggningar finns som tillägg från andra, som vi inte testade.
Import från Bitly
- Shlink har en import:
shlink short-url:import bitly. Den frågar efter en access token från Bitly, och om den ska behålla korta koder, taggar, egna domäner och datum. Vi hade inget konto hos Bitly, så importen från Bitly testade vi inte; vi såg bara att den frågade. Shlinks dokumentation listar import från Bitly, YOURLS, Kutt.it, en annan Shlink och CSV. Vi testade CSV-importen med en fil vi skrev själva, med kolumnernaLong URL,Short code,TitleochTags. Alla tre länkarna kom in med sina slugs och taggar och omdirigerade. Bitlys egen CSV-export har andra kolumnnamn, som "Destination URL", enligt deras hjälpsida, så du får byta namn på dem först. - YOURLS har ingen import. Awesome YOURLS listar BitlyEscape, skript som läser dina länkar från Bitly med en token, för tillägget YOURLS Import Export. Dem testade vi inte.
Det som går att flytta är dina egna länkar. Länkar på själva bit.ly stannar hos Bitly. Länkar på din egen domän fortsätter att fungera när du pekar domänen mot din server, så länge dina slugs är desamma, och det är vad Shlinks import är till för. Klickhistoriken följer inte med på något av sätten.
Resurser och hastighet
Båda är små för en server med 8 GB: omkring 85 och 142 MB i vila, och under 170 MB som mest.
YOURLS var mycket snabbare. Den svarade på 256 klick i sekunden när Shlink svarade på 31, på samma två kärnor. En omdirigering tog 13 ms mot 61 ms genom Caddy. Med sparandet av besök avstängt tog Shlink fortfarande 42 ms, så det mesta av tiden ligger i Shlink självt, inte i att spara besöket eller slå upp platsen. För en besökare på mobilen är 60 ms ändå lite jämfört med nätet; men vid en plötslig topp med tusentals klick i minuten har YOURLS mycket mer marginal. På disken växte Shlinks databas 7,1 MB för de 10 000 klicken och YOURLS 10,4 MB, så ett år med 100 000 klick i månaden tar under 1,5 GB i båda.
Uppdateringar och säkerhetskopior
Båda enheterna låser versionen vi testade; för att uppdatera byter du taggen efter att ha läst vad som är nytt. Shlink har haft fyra versioner med rättningar sedan juni, och YOURLS tre. YOURLS avbild kopierar programfilerna till containern vid varje start och behåller bara din mapp user, med inställningar och tillägg, i en volym. En ny avbild ger alltså en ny YOURLS. Databaserna följer sina egna taggar med AutoUpdate=registry, som i våra andra guider.
En säkerhetskopia är en dump av databasen plus Podman-hemligheterna. För YOURLS lägger du till volymen yourls-user, med config.php och dess nyckel för kakor, dina extra användare och dina tillägg. För Shlink lägger du till platsdatabasen, eller laddar ner den igen. Våra dumpar var 378 KB för Shlink och 176 KB för YOURLS, komprimerade. Vi återställde Shlinks till en tom databas och YOURLS över sin egen, och räknade samma länkar och klick. Båda kom tillbaka av sig själva efter en omstart.
Så körde vi Shlink
Shlinks dokumentation kör avbilden med miljövariabler; vi körde den med PostgreSQL i en pod, med Dashboard bredvid. Som en användare shlink, skapad som alla appanvändare i Podman-guiden, skapa hemligheterna:
openssl rand -hex 24 | tr -d '\n' | podman secret create shlink-db-password -
openssl rand -hex 24 | tr -d '\n' | podman secret create shlink-api-key -
openssl rand -hex 32 | tr -d '\n' | podman secret create shlink-dashboard-session -
Ladda ner månadens platsdatabas från DB-IP:
mkdir -p ~/geoip
curl -fsSL https://download.db-ip.com/free/dbip-city-lite-$(date +%Y-%m).mmdb.gz | gunzip > ~/geoip/dbip-city-lite.mmdb
~/.config/containers/systemd/shlink.pod:
[Pod]
PodName=shlink
PublishPort=127.0.0.1:8158:8080
PublishPort=127.0.0.1:8163:3005
[Install]
WantedBy=default.target
shlink-db.container:
[Container]
ContainerName=shlink-db
Image=docker.io/library/postgres:18-alpine
Pod=shlink.pod
Volume=shlink-db:/var/lib/postgresql
Environment=POSTGRES_USER=shlink POSTGRES_DB=shlink
Secret=shlink-db-password,type=env,target=POSTGRES_PASSWORD
HealthCmd=pg_isready -U shlink
HealthInterval=10s
Notify=healthy
AutoUpdate=registry
[Service]
Restart=always
TimeoutStartSec=300
shlink-app.container:
[Unit]
Requires=shlink-db.service
After=shlink-db.service
[Container]
ContainerName=shlink-app
Image=docker.io/shlinkio/shlink:5.1.7
Pod=shlink.pod
Environment=DEFAULT_DOMAIN=go.example.com IS_HTTPS_ENABLED=true TIMEZONE=Europe/Stockholm
Environment=DB_DRIVER=postgres DB_HOST=127.0.0.1 DB_USER=shlink DB_NAME=shlink
Secret=shlink-db-password,type=env,target=DB_PASSWORD
Secret=shlink-api-key,type=env,target=INITIAL_API_KEY
Volume=%h/geoip/dbip-city-lite.mmdb:/etc/shlink/data/GeoLite2-City.mmdb:ro,Z
[Service]
Restart=always
TimeoutStartSec=300
shlink-dashboard.container:
[Unit]
Requires=shlink-db.service
After=shlink-db.service
[Container]
ContainerName=shlink-dashboard
Image=docker.io/shlinkio/shlink-dashboard:0.3.1
Pod=shlink.pod
Environment=SHLINK_DASHBOARD_DB_DRIVER=postgres SHLINK_DASHBOARD_DB_HOST=127.0.0.1 SHLINK_DASHBOARD_DB_USER=shlink
Secret=shlink-db-password,type=env,target=SHLINK_DASHBOARD_DB_PASSWORD
Secret=shlink-dashboard-session,type=env,target=SHLINK_DASHBOARD_SESSION_SECRETS
[Service]
Restart=always
TimeoutStartSec=300
Dashboard behöver en egen databas, shlink_dashboard. Starta PostgreSQL först, skapa den, och starta sedan resten:
systemctl --user daemon-reload
systemctl --user start shlink-db
podman exec shlink-db createdb -U shlink shlink_dashboard
systemctl --user start shlink-pod
Shlink är redo när curl -s http://127.0.0.1:8158/rest/health skriver ut "status":"pass". Shlink läser besökarens adress från X-Forwarded-For, som Caddy sätter, utan fler inställningar. Innan du lägger till Dashboard i Caddy, öppna en SSH-tunnel från din dator, ssh -L 8163:127.0.0.1:8163 root@203.0.113.10, gå till http://localhost:8163, logga in som admin med lösenordet admin och välj ett nytt. Välj sedan Add a server, med URL http://127.0.0.1:8080, som når Shlink inne i podden utan att gå via Caddy, och API key från:
podman secret inspect --showsecret shlink-api-key --format '{{.SecretData}}'
Under Manage users skapar du kollegerna som managed user; var och en får ett tillfälligt lösenord att byta vid första inloggningen. Välj Servers i en användares meny för att ge dem servern. För en nyckel som bara ser sina egna länkar:
podman exec shlink-app shlink api-key:generate --name erik --author-only
Som caddy lägger du till båda namnen i ~/Caddyfile och startar om Caddy:
go.example.com {
reverse_proxy 127.0.0.1:8158
}
links.example.com {
reverse_proxy 127.0.0.1:8163
}
Vill du hellre använda den statiska webbklienten, kör docker.io/shlinkio/shlink-web-client:4.8.1 som en egen container med PublishPort=127.0.0.1:8162:8080, under ett eget namn i Caddy. DB-IP publicerar en ny databas i början av varje månad: kör raden med curl igen och systemctl --user restart shlink-app. Shlink skickar besökare på startsidan till en 404-sida; DEFAULT_BASE_URL_REDIRECT=https://www.example.com skickar dem till din webbplats i stället.
Så körde vi YOURLS
YOURLS dokumentation för avbilden kör den med MySQL; vi körde den med MariaDB i en pod, med båda lösenorden lästa från filer. Som en användare yourls:
openssl rand -hex 24 | tr -d '\n' | podman secret create yourls-db-password -
openssl rand -base64 18 | tr -d '\n' | podman secret create yourls-admin-password -
~/.config/containers/systemd/yourls.pod:
[Pod]
PodName=yourls
PublishPort=127.0.0.1:8159:8080
[Install]
WantedBy=default.target
yourls-db.container:
[Container]
ContainerName=yourls-db
Image=docker.io/library/mariadb:12.3
Pod=yourls.pod
Volume=yourls-db:/var/lib/mysql
Environment=MARIADB_DATABASE=yourls MARIADB_USER=yourls MARIADB_RANDOM_ROOT_PASSWORD=1 MARIADB_AUTO_UPGRADE=1
Secret=yourls-db-password,type=env,target=MARIADB_PASSWORD
HealthCmd=healthcheck.sh --connect --innodb_initialized
HealthInterval=10s
Notify=healthy
AutoUpdate=registry
[Service]
Restart=always
TimeoutStartSec=300
yourls-app.container:
[Unit]
Requires=yourls-db.service
After=yourls-db.service
[Container]
ContainerName=yourls-app
Image=docker.io/library/yourls:1.10.6-apache
Pod=yourls.pod
Volume=yourls-user:/var/www/html/user
Environment=YOURLS_SITE=https://go.example.com YOURLS_USER=anna
Environment=YOURLS_DB_HOST=127.0.0.1 YOURLS_DB_USER=yourls YOURLS_DB_NAME=yourls
Secret=yourls-db-password,target=/run/secrets/db-password
Secret=yourls-admin-password,target=/run/secrets/admin-password
Environment=YOURLS_DB_PASS_FILE=/run/secrets/db-password YOURLS_PASS_FILE=/run/secrets/admin-password
[Service]
Restart=always
TimeoutStartSec=300
Starta den med systemctl --user daemon-reload och systemctl --user start yourls-pod. Vid första starten tar det MariaDB omkring 20 sekunder att göra sig klar innan YOURLS startar. Innan Caddy gör den publik, kör installationen och lägg till tillägget som litar på Caddy, med serverns IPv4-adress i stället för 203.0.113.10:
curl -s -X POST -d 'install=Install+YOURLS' http://127.0.0.1:8159/admin/install.php | grep -o 'successfully created'
podman exec -u www-data yourls-app mkdir -p user/plugins/trust-caddy
podman exec -i -u www-data yourls-app tee user/plugins/trust-caddy/plugin.php > /dev/null <<'EOF'
<?php
/*
Plugin Name: Trust Caddy
Description: Take the visitor address from X-Forwarded-For when the request comes from Caddy
Version: 1.0
*/
yourls_add_filter( 'get_ip_trusted_proxies', fn() => [ '203.0.113.10' ] );
EOF
Som caddy lägger du till webbplatsen och startar om Caddy:
go.example.com {
reverse_proxy 127.0.0.1:8159
}
Logga in på https://go.example.com/admin/ som anna, med lösenordet från podman secret inspect --showsecret yourls-admin-password --format '{{.SecretData}}'. Under Manage Plugins aktiverar du Trust Caddy och Allow Hyphens in Short URLs. För fler användare lägger du till en rad per person i config.php i volymen, som $yourls_user_passwords['erik'] = 'a-long-password';, med podman exec -it -u www-data yourls-app vi user/config.php. Vi använde lösenordet mot API:et; sidan Tools har också en signatur för det, som vi inte provade.
Licens och kostnad
Vi läste licenserna och projektens sidor den 14 oktober 2026.
- Shlink är öppen källkod under MIT-licensen, gjord av Alejandro Celaya med bidragsgivare, och det är webbklienten och Shlink Dashboard också. Det finns ingen betald version och ingen betald funktion; projektet ber om donationer. Platsdatabasen är gratis från DB-IP, eller från MaxMind med ett gratiskonto.
- YOURLS är öppen källkod under MIT-licensen, gjord av sin gemenskap, utan företag och utan betald version. Den medföljande platsdatabasen har MaxMinds licens för GeoLite. Tilläggen kommer från många upphovsmän under egna licenser.
För ett företag som driver sina egna korta länkar kostar båda bara servern.
Bitly och Rebrandly i dag
Det här kommer från Bitlys och Rebrandlys egna sidor, lästa den 14 oktober 2026, inte från våra tester.
Bitlys prissida listade de här planerna, i US-dollar:
- Free, "With Ads": 5 länkar och 2 QR-koder i månaden, ingen egen domän och ingen klickhistorik;
- Core: 10 dollar i månaden, "Billed annually only", med 100 länkar i månaden och 30 dagars klickhistorik;
- Growth: 29 dollar i månaden med årsbetalning, eller 35 med månadsbetalning, med 500 länkar, en "Complimentary custom domain", länkar på egen domän och 120 dagars historik;
- Premium: 199 dollar med årsbetalning, eller 300 med månadsbetalning, med 3 000 länkar, ett års historik och data om stad och enhet;
- Enterprise: pris på förfrågan. Det är den enda plan som sidan listar med "Multiple users & group permission management", och den sparar två års historik.
Sidan listar export av data till CSV från Growth och uppåt. Bitlys hjälpsidor säger att gratiskonton nu får "an interstitial page that includes a preview of the link destination and an ad". Om utgångsdatum: "Bitly Links never expire", om du inte sätter ett slutdatum, som "redirects to either a Bitly 410 page or your custom error page" på vissa betalplaner. Efter en nedgradering "Your bit.ly links continue to work", men på en egen domän "won't renew your domain's SSL certificate", enligt deras hjälpsida. Bitlys datacenter ligger i USA.
Rebrandlys prissida listade:
- Free: 10 länkar och 10 QR-koder i månaden, med en vattenstämpel från Rebrandly på koderna, och detaljer för 100 klick i månaden;
- Essentials, Professional och Growth, till priser från omkring 8 US-dollar i månaden för Essentials till omkring 104–149 för Growth. Sidan visade två priser per plan, beroende på reglage för årsbetalning och "High Volume Plans" som vi inte kunde läsa säkert, så kontrollera innan du köper;
- Enterprise: pris på förfrågan.
Kolleger, utgångsdatum för länkar och data om stad och hänvisande sida börjar med Professional. Rebrandly säger att de "automatically removes all bot/spider traffic from your click counter" och att "Even if you downgrade to a free account, all your links will continue to function", enligt deras hjälpsidor. Deras import kan inte ta med "Generic links that begin with a domain you do not own, like bit.ly", och inte heller klickhistorik. Datan ligger hos Amazon Web Services i östra USA, enligt deras lista över underbiträden.
Vi hittade ingen inställning på någon av dem för att byta från 301 till 302, och inget val att hålla datan inom EU.
Det här ger du upp jämfört med Bitly
Med en egen server stannar länkarna i Sverige, statistiken sparas så länge du vill, och det finns inga annonser, kvoter för länkar eller priser per användare. Men var ärlig om vad du lämnar:
- Någon som håller koll på missbruk. Bitly blockerar länkar som flaggats som misstänkta, och Rebrandly kontrollerar länkar efter "spam, malware, or illegal content", enligt deras hjälpsidor. På din egen server är inloggningarna det enda skyddet, så håll dem få och starka.
- Drifttiden är din. Om servern ligger nere är varje kort länk och varje tryckt QR-kod trasig tills den är uppe igen. Planera för övervakning, som Uptime Kuma, och säkerhetskopior.
- Botar som filtreras åt dig. Shlink markerar dem, men YOURLS gör det inte, och ingen av dem är ett filter mot klickbedrägerier.
- En färdigputsad app. Bitlys och Rebrandlys webbappar är gjorda för folk som aldrig tänker på servrar. Shlinks Dashboard är ung, webbklienten är för den som kan hantera en API-nyckel, och YOURLS märks att den har några år på nacken.
- Dina gamla bit.ly-länkar. Länkar på
bit.lykan inte flytta; bara de på din egen domän kan det, och deras klickhistorik blir kvar.
Vilken ska du välja
Ett marknadsteam med flera personer: Shlink med Shlink Dashboard. Taggar per kanal och produkt, slutdatum och gränser för besök för erbjudanden, QR-koder i dina färger, omdirigering efter enhet eller språk, statistik över städer, webbläsare och hänvisande sidor med botar för sig, förkortade IP-adresser, export till CSV och inloggningar för kollegerna utan att dela en API-nyckel. Dess svagheter är långsammare omdirigeringar än YOURLS, en Dashboard före version 1.0, behörigheter som kommer från API-nycklar snarare än riktiga roller, inget svenskt gränssnitt och en platsdatabas du laddar ner själv. Filerna står i Så körde vi Shlink, ovanpå Podman-guiden.
En eller två personer som bara vill ha en egen kort domän: YOURLS. Två containrar, en adminsida som alla förstår, omdirigeringar på 13 ms och en lång lista med tillägg. Dess svagheter är hela IP-adresser i databasen, botar som räknas som klick, inga taggar, slutdatum eller QR-koder utan tillägg, alla användare med alla rättigheter, en egenhet som tar bort bindestreck i slugs om du inte slår på ett tillägg, adminsidor som laddar Googles skript och statistik i en fast tidszon. Filerna står i Så körde vi YOURLS.
Från Bitly med länkar på din egen domän: Shlink. Dess import är gjord för den flytten och behåller slugs och taggar; gör en provkörning med din token från Bitly innan du pekar domänen mot din server.
Tillsammans använde de omkring 330 MB som mest, med Dashboard, så en VC-P Alloy kör vilken som helst av dem, eller båda, med gott om plats för andra appar, som Plausible eller Umami för webbplatsen som länkarna leder till.