ब्लॉग

आपको पता नहीं होता कि आप कर सकते हैं, जब तक कर नहीं लेते

सफ़र · 30 सितंबर 2026

कुछ ही समय पहले तक मैंने कभी कोई मोबाइल ऐप शिप नहीं किया था।

आज नया Merlin ऐप iOS और Android पर फ़ेज़्ड रोलआउट में है। ढेर सारी भाषाओं में, फ़ोन और टैबलेट पर, ऐसा दिखता और महसूस होता हुआ जैसे वह आपके फ़ोन का ही हिस्सा हो।

मुझे अब भी पूरी तरह यक़ीन नहीं होता कि इसे लीड करने का मौक़ा मुझे मिला।

माँग

Merlin AI के पास पहले से एक मोबाइल ऐप था, Flutter में लिखा हुआ। वह काम करता था। लेकिन वेबसाइट पर शिप किया गया हर फ़ीचर दूसरी बार बनाना पड़ता था, एक अलग भाषा में, एक अलग सोच के साथ।

प्लान कहने में आसान था और करने में डरावना। पूरी चीज़ को Expo के साथ React Native में दोबारा बनाना। वेबसाइट के फ़ीचर्स से मेल खाना। दोनों प्लेटफ़ॉर्म पर इसे नेटिव महसूस कराना। और किसी एक भी मौजूदा यूज़र को लॉग आउट नहीं करना।

मैं वेब वाला इंसान हूँ। React, डिज़ाइन सिस्टम, मोशन, ब्राउज़र एक्सटेंशन। मुझे React आता था। मुझे Xcode बिल्ड फ़ेज़, Gradle, प्रोविज़निंग प्रोफ़ाइल नहीं आते थे, और न यह पता था कि Android एमुलेटर अचानक मरने का फ़ैसला क्यों कर लेता है।

फिर भी मैंने हाँ कह दी।

शुरुआत एक प्रोटोटाइप से

यह एक प्रोटोटाइप से शुरू हुआ। एक चैट स्क्रीन, एक ड्रॉअर, थोड़ा लिक्विड ग्लास। मॉक रिस्पॉन्स, न ऑथ, न बैकएंड।

तो मैंने लॉगिन से शुरुआत की। फिर साइन अप। फिर असली चैट हिस्ट्री लोड करना।

पहला वीकेंड ख़ालिस ऊर्जा से भरा था। असली Merlin चैट क्लाइंट। स्ट्रीमिंग जो अटकती थी, फिर स्ट्रीमिंग जो नहीं अटकती थी। अटैचमेंट। वेवफ़ॉर्म के साथ वॉइस डिक्टेशन। वेब साइटेशन सोर्स। एक मॉडल पिकर। इमेज और वीडियो जनरेशन।

इसी बीच कहीं मैंने अपने बैकएंड के लिए उसकी API स्पेक से सीधे एक टाइप्ड क्लाइंट जनरेट कर लिया, ताकि ऐप कभी उससे भटक न सके। चेंजलॉग पर बोरिंग। लेकिन उसके बाद की हर स्क्रीन को यहीं से विरासत मिली।

गिरावटें

फिर मोबाइल ने मुझे ज़मीन पर ला दिया।

मौजूदा यूज़र्स को साइन इन रखना सबसे डरावना हिस्सा था। अगर नया ऐप ऑथ को Flutter वाले से अलग ढंग से संभालता, तो हर कोई अपडेट खोलते ही ख़ुद को लॉग आउट पाता। तो मैंने ऑथ की वायरिंग नए सिरे से बनाई ताकि वह ठीक वहीं से शुरू करे जहाँ पुराना ऐप छोड़ता था, और इसे टेस्ट करने का एक ही ईमानदार तरीक़ा था: पुराना ऐप इंस्टॉल करो, साइन इन करो, उसके ठीक ऊपर नया ऐप इंस्टॉल करो, और दुआ करो। सेशन बना रहा। मुझे लगता है मैंने ख़ाली कमरे में ज़ोर से कुछ कहा था।

फिर Xcode और iOS के एक नए रिलीज़ ने ऐप्स के स्टार्ट होने के नियम बदल दिए। ग़लत करो तो ऐप लॉन्च पर ही क्रैश हो जाता है। आधा सही करो तो एक ख़ाली सफ़ेद स्क्रीन मिलती है, जो किसी तरह उससे भी बुरी है। उसके लिए बहुत पढ़ना पड़ा।

Android एमुलेटर बार-बार मर जाता था। सब कुछ ऐसा लगता था जैसे ऐप क्रैश हो रहा हो। ऐप नहीं था। एमुलेटर के पास उसे चलाने लायक रिसोर्स ही नहीं थे। यह सीखने से पहले कि पहले लॉग पढ़ो और घबराओ बाद में, मैंने उस पर कई असली घंटे गँवाए।

आख़िरकार मैंने ख़ुद के लिए एक Pixel 7 Pro ले लिया। इसलिए नहीं कि किसी ने कहा था। मुझे इस बात की इतनी परवाह थी कि ऐप Android पर कैसा महसूस होता है, कि मैं उसे एमुलेटर के भरोसे आँकते नहीं रह सकता था।

और छोटी-छोटी परेशानियाँ। टेक्स्ट सेलेक्ट करने पर थ्रेड का उछल जाना। ब्लॉक्स जो बार-बार रीमाउंट होते रहते थे। बिल्ड के बीच में ही मेरी डिस्क भर जाना।

कुछ चीज़ें मैंने बनाईं, उनसे प्यार किया, और फिर काट दीं। चैट ब्रांचिंग, यानी किसी प्रॉम्प्ट को एडिट करके थ्रेड को फ़ोर्क करना, मेरे पसंदीदा फ़ीचर्स में से एक था। इसने ऐप को जितना फ़ायदा दिया उससे ज़्यादा भारी बना दिया, तो हमने इसे हटा दिया। क्या काटना है, यह जानना भी इसी का हिस्सा है।

ऊँचाइयाँ

और फिर अच्छे दिन। ढेर सारे अच्छे दिन।

Aakarsh जुड़ा और पूरी चीज़ की रफ़्तार बदल गई। Aakarsh ने थ्रेड, कंपोज़र और ड्रॉअर का एहसास अपने हाथ में लिया और बस आगे बढ़ता गया। एक कंपोज़र ग्लो जो फ़ोकस करने पर खिलता और चमकता है। थिंकिंग और सर्च ब्लॉक्स जो पूरे होने पर सिमट जाते हैं। लिक्विड ग्लास पर मेन्यू। एक ड्रॉअर जो चैट बदलते वक़्त भी स्मूद बना रहता है।

मैं उसके आस-पास की हर चीज़ में गहराई तक उतरा। Projects। Vault। Crafts। फ़ोल्डर। Sign in with Apple। सब्सक्रिप्शन और पेवॉल। एनालिटिक्स। क्रैश रिपोर्टिंग। पूरे ऐप का अनुवाद। उसे iPad के हिसाब से ढालना।

फिर आया पहला TestFlight बिल्ड। Merlin को, हमारे Merlin को, टीम के लोगों के फ़ोन पर इंस्टॉल देखना अविश्वसनीय लगा।

फिर एक और बिल्ड। और एक। हर एक के साथ टेस्टर्स के लिए लिखे गए रिलीज़ नोट्स, डेवलपर्स के लिए नहीं। “डार्क मोड में सेंड बटन सफ़ेद दिखता है।” कुछ उस तरह की चीज़ें 🤣।

एजेंट्स के साथ बनाना

इसका बड़ा हिस्सा AI कोडिंग एजेंट्स के साथ मिलकर बना, और इसने मुझे कुछ ऐसा सिखाया जिसकी मुझे उम्मीद नहीं थी।

एजेंट्स जो भी पाते हैं, उसकी नक़ल कर लेते हैं। अच्छे-से कमेंट के साथ लिखा एक वर्कअराउंड एक हफ़्ते में पूरे कोडबेस का पैटर्न बन जाता है। तो मेरा आधा काम कोडबेस को नक़ल करने लायक बनाना हो गया। ऐसे लिंट रूल जो ग़लतियों को रिव्यू से पहले पकड़ लें। हर काम को करने का एक ही तरीक़ा। एक ढंग का डिज़ाइन सिस्टम, ताकि कोई स्क्रीन चुपके से अपना अलग ग्रे न गढ़ सके।

सबक़ वही पुराना, बस और ज़ोर से। जो सिस्टम आप शुरुआत में खड़ा करते हैं, बाक़ी सब कुछ उसी से विरासत में पाता है।

वह हिस्सा जो मैं Git लॉग में नहीं दिखा सकता

Git लॉग में Aakarsh और मेरे ढेर सारे कमिट दिखते हैं। यह नहीं दिखता कि किसने हमें अटकने से निकाला, किसने आधी रात को टेस्ट किया, किसने बताया कि कुछ ठीक नहीं लग रहा।

Pratyush ने इसे लीड करने के लिए मुझ पर भरोसा किया। और Merlin के हर उस इंसान ने, जिसने बिल्ड इंस्टॉल करके फ़ीडबैक भेजा, इसे उससे बेहतर बनाया जितना मैं अकेले बना पाता।

अगर मैं किसी का नाम लेना भूल गया हूँ, तो वह मेरी चूक है, आपके योगदान की कमी नहीं।

जब तक कर नहीं लेते

कुछ ही समय पहले, अगर आप मुझसे पूछते कि क्या मैं Flutter से React Native माइग्रेशन लीड कर सकता हूँ, दोनों प्लेटफ़ॉर्म पर शिप कर सकता हूँ, हर यूज़र को साइन इन रख सकता हूँ, और इसे नेटिव महसूस करा सकता हूँ, तो मैं एक बहुत बड़े सवालिया निशान के साथ कहता “मुझे लगता है?”

मुझे नहीं पता था कि मैं यह कर सकता हूँ।

फिर मैंने कर दिखाया।

यही वह बात है जो कोई नहीं बताता। ऐसा नहीं होता कि पहले आत्मविश्वास आए और फिर आप मुश्किल काम करें। आप मुश्किल काम करते हैं, बुरी तरह, फिर थोड़ा कम बुरी तरह, और आत्मविश्वास बाद में आता है, चुपचाप, रास्ते में कहीं।

तो अगर कोई ऐसी चीज़ है जिसके बारे में आपको यक़ीन नहीं कि आप कर पाएँगे, तो शायद बस हाँ कहिए और शुरू कर दीजिए।

अभी शुरुआत है, अभी सीख रहा हूँ, अभी भी बना रहा हूँ। और मुझे इस सफ़र के हर एक दिन से प्यार रहा है।