सामग्री पर जाएँ
cutty.dev
All posts

ऑटो-प्रीफ़िक्स URL — एक छोटी सी चीज़ जो मिनटों की बचत करती है

cutty.dev पहचान लेता है कि जब आप बिना https:// के पता पेस्ट करते हैं, तो यह अपने आप उसे जोड़ देता है। सुनने में यह मामूली लग सकता है, लेकिन वास्तव में यह दो सेकंड और 'फिर से प्रयास करें' पर क्लिक करने के बीच का अंतर है।

आप फॉर्म में allegro.pl टाइप करते हैं। आप क्लिक करते हैं। और फिर क्या?

अधिकांश URL शॉर्टनर्स में आपको इस समय एक त्रुटि संदेश प्राप्त होता है। कुछ इस तरह "यह एक सही URL नहीं है"। क्योंकि इसमें आगे https:// नहीं है। इसलिए आप पीछे जाते हैं, प्रोटोकॉल जोड़ते हैं, फिर से क्लिक करते हैं, और अब जाकर आपके पास आपका छोटा लिंक होता है।

cutty.dev यह नहीं करता है। यह बस खुद ही https:// जोड़ देता है और बिना किसी समस्या के आगे बढ़ जाता है।

मुझे पता है यह सुनने में कैसा लगता है। एक ऐसे फीचर की तरह जो पूरी पोस्ट की बात तो दूर, एक पैराग्राफ के लायक भी मुश्किल से है। फिर भी मैं यहाँ बैठकर इसके बारे में लिख रहा हूँ, क्योंकि यह छोटी सी चीज़ मेरे लिए इस बात का एक छोटा सा घोषणापत्र (manifesto) है कि मैं auto-prefix URL टूल बनाने और इन सभी अदृश्य सुविधाओं के बारे में वास्तव में क्या सोचता हूँ।

दो सेकंड बनाम बीस

आइए गणना करें। सच में, संख्याओं के आधार पर, क्योंकि अन्यथा यह केवल बातें हैं।

पहला रास्ता: आप पेस्ट करते हैं, आपके पास लिंक होता है, विंडो बंद कर देते हैं। दो सेकंड। शायद तीन।

दूसरा रास्ता: आप पेस्ट करते हैं, त्रुटि आती है, संदेश पढ़ते हैं (समझने के लिए एक या दो सेकंड), प्रोटोकॉल जोड़ते हैं, फिर से क्लिक करते हैं, और अब अंत में लिंक। पंद्रह, बीस सेकंड। साथ ही झुंझलाहट का वह छोटा सा क्षण, वह शांत "ओह हाँ, प्रोटोकॉल", जो व्यक्तिगत रूप से कुछ नहीं लेता है, लेकिन बढ़ता जाता है।

अब इसे इस बात से गुणा करें कि आप महीने में कितनी बार कोई पता पेस्ट करते हैं। मेरे लिए यह दर्जनों है। जो व्यक्ति पेशेवर रूप से लिंक का प्रबंधन करता है — उसके लिए सैकड़ों। अचानक, यह "महत्वहीन" लगने वाली छोटी सी चीज़ प्रति व्यक्ति मासिक मिनटों में जमा होने लगती है।

यह वही अंकगणित है जिसे अधिकांश लोग छोड़ देते हैं, क्योंकि प्रत्येक एकल मामला इतना छोटा लगता है कि उसकी परवाह करने की आवश्यकता नहीं है।

वास्तव में नीचे क्या है

तंत्र बहुत ही साधारण है और मैं इसे छिपा नहीं रहा हूँ। आप टेक्स्ट को फ़ील्ड में पेस्ट करते हैं। इससे पहले कि कुछ भी सर्वर पर भेजा जाए, जावास्क्रिप्ट का एक हिस्सा यह जाँचता है कि आपने जो लिखा है वह किसी प्रोटोकॉल से शुरू होता है या नहीं — http://, https://, ftp://, mailto:, कुछ भी। यदि यह शुरू नहीं होता है, तो सिस्टम यह मान लेता है कि आपका मतलब एक साधारण डोमेन से है और आगे https:// जोड़ देता है।

व्यवहार में:

  • allegro.pl बदलकर https://allegro.pl हो जाता है
  • github.com/twoj-profil/projekt बदलकर https://github.com/twoj-profil/projekt हो जाता है
  • www.gazeta.pl बदलकर https://www.gazeta.pl हो जाता है

और यदि प्रोटोकॉल पहले से ही वहां मौजूद है, भले ही वह अजीब हो, तो सिस्टम उसे ओवरराइट नहीं करता है। यह उसे छोड़ देता है और आगे जाँचता है कि इसके साथ क्या करना है। http://example.com पास हो जाता है (अनुमत है)। ftp://example.com कचरे में चला जाता है, क्योंकि हम केवल http और https स्वीकार करते हैं। और javascript:alert(1) तुरंत बाहर निकल जाता है, क्योंकि यह पता नहीं है, बल्कि कुछ गंदा इंजेक्ट करने का प्रयास है (क्लासिक XSS, धन्यवाद, नहीं)।

मेरे पास यह क्यों है, जबकि बाजार के आधे हिस्से के पास नहीं है

यहाँ मामला दिलचस्प हो जाता है, क्योंकि उत्तर थोड़ा मज़ेदार है।

ब्राउज़र में एड्रेस को वैलिडेट करने का मानक तरीका new URL(string) कंस्ट्रक्टर है। और यह कंस्ट्रक्टर सख्त है। समझौताहीन। इसमें प्रोटोकॉल नहीं है — यह एरर (error) देता है। new URL("allegro.pl") आपको बस TypeError देता है और बस।

और पता है क्या? यह सही व्यवहार है। अधिकांश अनुप्रयोगों के लिए आप बिल्कुल यही चाहते हैं। लेकिन लिंक छोटा करने वाले फॉर्म में, जहाँ कोई व्यक्ति ब्राउज़र बार या किसी के संदेश से पता कॉपी करता है, यह कठोरता एक लाभ से बाधा में बदल जाती है। अचानक, एक उपकरण जो आपका समय बचाने के लिए बनाया गया है, आपसे उस चीज़ को सुधारने के लिए कहता है जिसे वह बखूबी समझता है।

इसका समाधान करने के लिए बस कुछ ही पंक्तियाँ चाहिए:

function sanitizeUrl(input) {
  const trimmed = input.trim();
  const hasProtocol = /^[a-z][a-z0-9+.-]*:/i.test(trimmed);
  const normalized = hasProtocol ? trimmed : "https://" + trimmed;
  // dalej leci normalna walidacja przez new URL(normalized)
}

पाँच लाइनें। हर उस व्यक्ति के लिए प्रतिदिन घर्षण (friction) में कुछ सेकंड की कमी, जो पते पेस्ट करता है। सच कहूँ तो मुझे नहीं पता कि यह हर जगह मानक क्यों नहीं है। मुझे संदेह है कि बात यह है कि "URL बिल्डर बस ऐसे ही काम करता है" और कोई भी इसे छूना नहीं चाहता था। जड़ता (Inertia), दुर्भावना नहीं।

"मानक रूप से" का क्या अर्थ है, इस पर एक छोटी सी टिप्पणी


क्योंकि new URL() के साथ यह कहानी किसी बड़ी चीज़ का एक शानदार उदाहरण है। सॉफ़्टवेयर में बहुत सी चीजें जिन्हें "ऐसा ही किया जाता है" माना जाता है, वे वास्तव में "किसी ऐसी लाइब्रेरी की डिफ़ॉल्ट सेटिंग्स से ऐसा हो गया जिसे किसी ने चुनौती नहीं दी"। कंस्ट्रक्टर का strict mode cutty के डिजाइनरों या प्रतिस्पर्धा का निर्णय नहीं है — यह URL स्पेसिफिकेशन के लेखकों का निर्णय है, जो पूरी तरह से एक अलग संदर्भ में, पूरी तरह से अलग उपयोगों के लिए लिया गया था।

और फिर पूरा बाजार इस डिफ़ॉल्ट विकल्प को विरासत में प्राप्त कर लेता है और इसे "मानक" कहता है। मुझे ऐसा लगता है कि सबसे अच्छे उत्पाद ठीक उन्हीं जगहों पर पैदा होते हैं जहाँ कोई रुकता है और पूछता है: रुको, क्या यह व्यवहार वास्तव में मेरे उपयोगकर्ता की सेवा कर रहा है, या केवल मेरी लाइब्रेरी की? ज्यादातर मामलों में उत्तर होता है: लाइब्रेरी की। और तब पांच लाइनों के साथ इंसान के पक्ष में जाना सार्थक होता है।

ये छोटी-छोटी चीजें उतनी नहीं हैं जितनी दिखती हैं

Auto-prefix केवल उन कई तत्वों में से एक है जिन्हें आप किसी भी फीचर सूची में नहीं पाएंगे। क्योंकि यदि उन्हें वहां लिखा जाता, तो प्रत्येक अलग से बहुत छोटा दिखाई देता:

  • सत्यापन से पहले स्पेस को ट्रिम करना, ताकि पेस्ट किए गए पते के अंत में कोई आकस्मिक स्पेस सब कुछ खराब न कर दे
  • एंकर बनाए रखना, यानी https://example.com/page#section में #section छोटा होने के बाद भी गायब नहीं होता है
  • क्वेरी पैरामीटर (?utm_source=test) पूरी तरह से पास होते हैं, रास्ते में कुछ भी कटता नहीं है
  • पोलिश अक्षरों वाले डोमेन, źdźbło.pl, स्वचालित रूप से punycode पर चले जाते हैं
  • अपनी स्वयं की एक्सटेंशन में पोलिश अक्षर ASCII में बदल दिए जाते हैं (różowy-link बदलकर rozowy-link हो जाता है)
  • असुरक्षित प्रोटोकॉल — javascript:, data:, file: — एक विशिष्ट, समझने योग्य संदेश के साथ रिजेक्ट कर दिए जाते हैं

(अभी http:// को https:// में स्वचालित रूप से अपग्रेड करने की योजना बनाई जा रही है, जब लक्षित सर्वर एन्क्रिप्शन का समर्थन करता हो। यह अभी लाइव काम नहीं कर रहा है, इसलिए मैं दिखावा नहीं करूँगा।)

इनमें से प्रत्येक विवरण किसी न किसी के पाँच, दस, तीस सेकंड और एक आह की बचत करता है। अकेले में कुछ भी नहीं। साथ मिलकर यह "ठीक काम करता है" और "मुझे इसका उपयोग करना पसंद है" के बीच का अंतर है।

मैं और क्या कमाना चाहूँगा

भविष्य के लिए इच्छाओं की सूची, क्योंकि इसके बारे में सोचना मुझे बस खुशी देता है:

  • इंटेलिजेंट पेस्टिंग — वाक्य के बीच में छिपे पते का पता लगाना और शब्दों के बीच से केवल URL को निकालना
  • बल्क पेस्टिंग — एक लाइन में पतों की सूची, और प्रत्येक के लिए तुरंत एक अलग छोटा लिंक बनाना
  • सुझाए गए प्रत्यय — गंतव्य पृष्ठ के शीर्षक के आधार पर चुनने के लिए तीन ब्रांडेड स्लग (slugs) का प्रस्ताव देना
  • पेस्ट करने के तुरंत बाद, "छोटा करें" पर क्लिक करने से पहले ही Open Graph प्रीव्यू देखना

यह सब फिर से "एक पांच-लाइन का फंक्शन, जो कुछ भी नहीं लगता" है। और ये सब मिलकर? यह ठीक वही सीमा है एक ऐसे उपकरण के बीच जो ठीक-ठाक है, और उस उपकरण के बीच जिसे आप बिना सोचे-समझे हर दिन उपयोग करते हैं। यदि आप देखना चाहते हैं कि यह अभी कैसे काम करता है, तो cutty.dev में बिना प्रोटोकॉल के कुछ भी पेस्ट करें — allegro.pl, github.com, news.ycombinator.com — और देखें कि यह आपके रास्ते में कोई बाधा नहीं डालता है।

अंत में, थोड़ा व्यक्तिगत रूप से

मैंने लंबे समय तक यह सोचा कि उत्पाद बड़ी विशेषताओं (features) के कारण जीतते हैं। उस एक प्रभावशाली चीज़ के कारण जिसे स्लाइड पर दिखाया जा सके और जिसके बारे में लोग लिखें। और हाँ, कभी-कभी ऐसा होता है।

लेकिन मैं जितनी लंबे समय तक cutty बना रहा हूँ, मुझे उतना ही अधिक महसूस होता है कि उपयोगकर्ता की वफादारी कहीं और पैदा होती है — उन सैकड़ों माइक्रोसेकंड में जिन्हें कोई सचेत रूप से नहीं देखता है। आपको याद नहीं रहता कि टूल ने खुद https:// जोड़ दिया था। आपको केवल यह सामान्य प्रभाव याद रहता है कि "इसे उपयोग करना किसी तरह अच्छा है", "यह परेशान नहीं करता है"। यह प्रभाव कहीं से भी नहीं आता है। यह दर्जनों पांच-लाइन के निर्णयों से बना है, जिनमें से व्यक्तिगत रूप से कोई भी खुद के सामने उन्हें "समय के लायक" के रूप में नहीं बचा पाएगा।

शायद शिल्प कौशल (craftsmanship) इसी में निहित है। किसी एक बड़े बदलाव में नहीं, बल्कि उस दृढ़ता में कि फॉर्म भरते समय बार-बार इंसान का साथ दिया जाए — भले ही इसमें केवल दो मामूली सेकंड ही क्यों न लगें। और आप? हाल ही में किसी टूल में आपको किस इतनी छोटी बात ने परेशान किया कि उसे स्वीकार करने में शर्म आए? क्योंकि आमतौर पर सबसे अच्छा काम वहीं करने के लिए छिपा होता है।