Auto-prefix URL — sitnica koja štedi minute
cutty.dev prepoznaje kada nalepite adresu bez https:// i sam je dodaje. Zvuči banalno. U praksi, to je razlika između dve sekunde i klika na „pokušaj ponovo“.
U formularu za skraćivanje linka unesićete allegro.pl. Većina skraćivača će vam reći da to nije ispravan URL i tražiće da ponovo unesete sa https:// na početku. cutty.dev će jednostavno sam dodati https:// i nastaviti.
To zvuči kao funkcija koja jedva zaslužuje pomen. U praksi to je razlika između:
- "nalepio sam, imam kratak link, zatvaram prozor" (2 sekunde)
- "nalepio sam, greška, čitam poruku, dodajem https, još jednom, imam link" (15-20 sekundi)
Pomnoži sa brojem puta u mesecu kada lepiš URL, plus frustraciju zbog čitanja greške, plus trenutak "ah da, protokol". Sitnica koja se meri minutima mesečno po osobi.
Šta tačno radi cutty.dev
Zalepili ste tekst u formu. Pre nego što se pošalje na server, JavaScript proverava da li počinje nekim protokolom (http://, https://, ftp://, mailto: itd). Ako ne počinje — sistem pretpostavlja da je to jednostavno domen bez protokola i dodaje https:// na početak.
Dakle:
allegro.pl→https://allegro.plgithub.com/twoj-profil/projekt→https://github.com/twoj-profil/projektwww.gazeta.pl→https://www.gazeta.pl
A ako nešto već ima protokol (čak i ako je pogrešan), sistem ga ostavlja kakav jeste i proverava dalje:
http://example.com→ ostajehttp://example.com(allowed)ftp://example.com→ odbijeno (samo http/https)javascript:alert(1)→ odbijeno (XSS protection)
Zašto ja ovo imam, a drugi ne
Većina skraćivača ima standardnu validaciju URL-a preko new URL(string). Konstruktor URL u browseru/JavaScriptu je strict — ako nema protokola, baca grešku. Podrazumevani output za new URL("allegro.pl") je TypeError.
To je ispravno ponašanje za većinu aplikacija. Ali za formu za skraćivanje linkova, gde korisnik lepi URL kopiran iz adresne trake ili iz druge aplikacije, ova strogoća je prepreka umesto pomoći.
Rešenje zauzima pet linija JavaScript-a:
function sanitizeUrl(input) {
const trimmed = input.trim();
const hasProtocol = /^[a-z][a-z0-9+.-]*:/i.test(trimmed);
const normalized = hasProtocol ? trimmed : "https://" + trimmed;
// dalsza walidacja przez new URL(normalized)
}
Pet linija koda, nekoliko sekundi manje frustracije po korisniku dnevno. Ne znam zašto većina tržišta to ne radi. Možda zato što "standardno" znači "tako funkcioniše URL konstruktor".
Sitnice u UX-u su neproporcionalno važne
cutty.dev ima desetak takvih stvari koje nisu ni u jednom feature listu, jer svaka pojedinačno zvuči beznačajno:
- Uklonite prazan prostor pre validacije — nalepljeni URL sa razmakom na kraju ne uzrokuje grešku
- Hash je očuvan —
https://example.com/page#sectionzadržava#sectionnakon skraćivanja - Query stringovi su očuvani —
?utm_source=testprolazi bez skraćivanja - Automatic protocol upgrade —
http://uhttps://kada izvorni URL podržava TLS (planirano, još uvek nije LIVE) - IDN domeni —
źdźbło.plse automatski konvertuje u punycode - Poljski karakteri u slug-u — automatski se menjaju u ASCII prilikom kreiranja prilagođenog završetka (
różowy-link→rozowy-link) - Detect dangerous protocols —
javascript:,data:,file:,mailto:odbijeni uz specifičnu poruku
Svaki od ovih detalja štedi nekome 5-30 sekundi i trenutak iritacije. Zajedno, to je razlika između „volim ovu aplikaciju“ i „radi OK“.
Šta dalje sa UX detaljima
Lista stvari koje želim da uradim u budućnosti:
- Smart paste — detektuj kada korisnik nalepi tekst koji sadrži URL između drugih reči, izvuci samo URL
- Bulk paste — nalepena lista URL-ova (jedan po liniji) kreira više kratkih linkova istovremeno
- Suggested slugs — na osnovu naslova odredišne stranice, predloži 3 brendirana nastavka za izbor
- Auto-OG preview — prikaži Open Graph kartica preview odmah nakon lepljenja URL-a, pre klikom na skraćeni link
Svaka od ovih je takođe „funkcija od pet linija koja ne izgleda kao ništa“. Sve zajedno pravi razliku između alata koji je OK i alata koji želiš da koristiš svakodnevno.
Probaj sam
Zalepi nešto — allegro.pl ili github.com ili news.ycombinator.com. Sistem će sam dodati protokol i nastaviti dalje. Bez čekanja, bez greške, bez "pokušaj ponovo".
Ako te zanima ova vrsta UX detalja — javi mi u kom pravcu dalje da idem. hello@cutty.dev.