सामग्री पर जाएं
Chandler Nguyen
AI13 मिनट पढ़ने का समय

AI

Native सिर्फ़ ऊपर की एक परत नहीं है: DIALØGUE का iOS App फिर से बनाना

कुछ महीने पहले मैंने DIALØGUE का iOS app वेब प्रोडक्ट के एक port के तौर पर ship कर दिया था, फिर उसे लगभग पूरा native बनाकर दोबारा बनाया — तीन tabs, lock screen audio, synced transcript, भरोसेमंद offline, और Siri — क्योंकि फ़ोन में सिकोड़ा गया एक web app, आख़िर में एक web app ही रहता है।

कुछ महीने पहले मैंने DIALØGUE का iOS app वेब प्रोडक्ट के एक port के तौर पर ship कर दिया था। फिर मैंने उसका लगभग पूरा हिस्सा एक असली native app के रूप में दोबारा बनाया।

यह अब App Store पर live है — अगर आप curious हैं, तो जाकर इसे थोड़ा छेड़कर देखिए। बाक़ी का यह post इस बारे में है कि क्या बदला, और क्यों।

यह फ़र्क़ तब तक बस शब्दों का खेल लगता है, जब तक आप दोनों versions को एक साथ अपने हाथ में न पकड़ें। पहला version बस फ़ोन में सिकोड़ा गया एक web app था: वही tabs, वही creation wizard, वही dashboard। वह compile हुआ, चला, review भी pass कर गया। और फिर भी ऐसा लगा जैसे कोई website app का costume पहने खड़ी हो।

फ़ोन में सिकोड़ा गया एक web app, आख़िर में एक web app ही रहता है। Native आपके web layout के ऊपर पेंट की एक परत नहीं है — यह डिवाइस के साथ एक बिल्कुल अलग contract है। यही वह contract था जिसे मैंने skip कर दिया था, और उसे ईमानदारी से निभाने के लिए दोबारा बनाने ने tabs, audio, listening surface, offline behavior, और app कैसे शुरू होता है — सब बदल दिया। अब screen-by-screen देखते हैं कि इसका असल में मतलब क्या था।

वह port असल में एक dashboard था

पहले version ने मान लिया था कि app का काम बस generator को सामने रख देना है। DIALØGUE AI podcasts बनाता है, तो सोच यह थी: हर web surface को screen पर डाल दो, और काम ख़त्म।

इससे जो मिलता है वह एक dashboard है। पाँच tabs, एक multi-step wizard, हर चीज़ के लिए panels। कोई भी podcast app एक dashboard चलाने के लिए नहीं खोलता। वह उसे इसलिए खोलता है कि एक idea को audio में बदले, अपनी बनाई हुई किसी चीज़ को सुने, या कोई ऐसा show दोबारा शुरू करे जो पहले चला चुका है। ported interface web app के layout की हिफ़ाज़त कर रहा था। वह इन तीन कामों की हिफ़ाज़त नहीं कर रहा था।

तो दोबारा बनाने की शुरुआत उसी चीज़ से हुई जो आप सबसे पहले देखते हैं।

तीन tabs, क्योंकि एक फ़ोन tabs को सज़ा देता है

पुराना app पाँच tabs के साथ खुलता था: Library, Studio, Create, Credits, Profile। web app को port करने से यही मिलता है — हर web surface एक tab कमा लेता है।

दोबारा बनाए गए app में तीन हैं: Listen, Create, You

दो tabs बच नहीं पाए। Credits एक destination नहीं रह गया — कोई app इसलिए नहीं खोलता कि बस अपना balance घूरता रहे। वह "You" के अंदर चला गया, और जो एकमात्र पल असल में मायने रखता है — generate करने जाते समय ठीक तभी balance कम पड़ जाना — अब ठीक वहीं एक purchase sheet सामने आ जाती है। Studio एक "जगह" नहीं रह गया। वह बन गया Series — एक save किया हुआ setup (hosts, tone, format, language, source pattern) जो Create के अंदर रहता है और Listen में एक collection की तरह दिखता है, न कि control room होने का नाटक करने वाला कोई tab। Library और Profile बन गए सीधे-सादे "Listen" और "You"।

Desktop पर एक extra tab मुफ़्त है। फ़ोन पर, हर tab ध्यान पर लगा एक टैक्स है। दोबारा बनाने ने वह टैक्स चुका दिया।

DIALØGUE iOS की Series screen, एक बार-बार इस्तेमाल होने वाला podcast setup save करने के लिए
Series — Create के अंदर रहने वाला एक save किया हुआ setup, न कि अपना एक अलग tab रखने वाला control room।

Audio, जैसा iOS उम्मीद करता है

यहीं पर "native एक contract है" अब abstract रहना बंद कर देता है।

वह ported app audio को लेकर पूरी तरह अनजान नहीं था। वह पहले से ही lock screen पर play, pause, और skip के साथ दिखता था, फ़ोन कॉल आने पर pause हो जाता था, और headphones निकालने पर रुक जाता था। ये बुनियादी चीज़ें हैं, और वे मौजूद थीं।

जो वह नहीं कर पाता था, वह यह था कि screen lock होने के बाद एक असली audio app की तरह बर्ताव करे। आप lock screen से playhead को drag नहीं कर सकते थे। वहाँ कोई cover art नहीं थी — सिर्फ़ text। कोई AirPlay बटन नहीं था, कोई sleep timer नहीं था, और skip हमेशा fixed पंद्रह सेकंड का था, चाहे आपको पसंद हो या न हो।

दोबारा बनाने ने यह gap platform के साथ भरा, उसके इर्द-गिर्द से नहीं। अब lock screen पर इस episode की dynamic artwork है और एक scrubber है जिसे आप किसी भी point तक खींच सकते हैं। AirPlay है, एक sleep timer है जो आवाज़ को एकदम काटने के बजाय धीरे-धीरे fade करता है, और एक skip interval है जिसे आप दस से साठ सेकंड के बीच set कर सकते हैं — और फिर यही lock screen के बटनों को भी चलाता है, क्योंकि system controls को app से मेल खाना चाहिए। audio session ख़ुद को spoken audio घोषित करता है, तो OS इसे music के बजाय बोली की तरह treat करता है।

इसमें कुछ भी चमक-धमक वाला नहीं है। यही तो बात है। फ़ोन पर, ऐसा audio जो lock screen और AirPlay को नज़रअंदाज़ करता है, "minimal" नहीं है। वह ठीक उन्हीं पलों में टूटा हुआ है जब लोग असल में सुनते हैं — चलते हुए, गाड़ी चलाते हुए, फ़ोन जेब में रखे हुए।

एक ऐसा transcript जो सिर्फ़ एक AI podcast ही बना सकता है

यह वह हिस्सा है जो सचमुच हमारा अपना है, सिर्फ़ अच्छी iOS hygiene नहीं।

जब कोई episode चल रहा होता है, app एक synced transcript दिखाता है: मौजूदा line highlight होती है, view अपने-आप scroll करके उसे बीच में रखता है, और आप किसी भी line पर tap करके सीधे उसी पल पर पहुँच सकते हैं। एक generic podcast app यह सचमुच नहीं कर सकता, क्योंकि उसे पता ही नहीं कि कब क्या कहा गया। DIALØGUE को पता है — उसने ही script generate की थी, तो वह episode का structure पहले से जानता है।

ईमानदार engineering detail यह है कि कोई line tap करके seek करने लायक तभी होती है जब audio में exact per-segment timing हो। जब timing approximate होती है, line फिर भी render होती है, बस वह seekable नहीं रहती, और app इस बारे में दिखावा नहीं करता। वही segment timing scrubber पर सीधे chapter ticks भी बनाती है, तो आप एक episode को audio की तरह skim कर सकते हैं, पर साथ में एक नक़्शा भी रहता है कि system ने क्या बनाया है। transcript यह भी दिखाता है कि कौन-सी line किस host ने कही, क्योंकि script ही दो-host वाली dialogue के रूप में लिखी गई थी।

यही फ़र्क़ है किसी player पर एक transcript को ऊपर से चिपका देने और generated script को पूरी listening experience का source of truth मान लेने के बीच।

दो चीज़ें इसे काम करने लायक बनाती हैं, और दोनों में से कोई भी screen पर नहीं दिखती। Backend हर segment पर उसका start और end time stamp करता है और यह भी mark करता है कि timing exact है या सिर्फ़ अनुमानित — ताकि app आपको एक exactly-timed line पर tap करने दे और एक estimated line पर चुपचाप नक़ली होने से इनकार कर दे। और आपकी playback position server पर save होती है, सिर्फ़ device पर नहीं, तो "जहाँ छोड़ा था वहीं से उठाना" तब भी टिका रहता है जब आप एक episode वेब पर शुरू करें और फ़ोन पर ख़त्म करें।

DIALØGUE iOS की synced transcript screen, tap-to-seek transcript cards के साथ
Synced transcript — किसी line पर tap करके seek करें। यह सिर्फ़ इसलिए मुमकिन है क्योंकि app ने ही script generate की और timing जानता है।

ऐसा offline जो एक असली commute झेल जाए

App शुरू से ही episodes download कर सकता था। यह नई बात नहीं है, और मैं इस बारे में सटीक रहना चाहता हूँ। दोबारा बनाने ने जो जोड़ा, वह है resilience — एक "download feature" और ऐसे "offline जिस पर आप भरोसा कर सकें" के बीच का फ़र्क़।

अब एक बीच में रुका हुआ download वहीं से resume होता है जहाँ रुका था, शुरू से नहीं, क्योंकि app हर episode के लिए system का resume data save करता है और उसी से restart करता है। एक WiFi-only option है जो सचमुच cellular को रोक देता है, तो queue में पड़ा download data plan को चुपचाप जलाने के बजाय WiFi का इंतज़ार करता है। Downloads एक FIFO queue में एक बार में ज़्यादा-से-ज़्यादा तीन चलते हैं, network पर एक साथ टूट पड़ने के बजाय। एक storage view है जिससे आप देख और delete कर सकते हैं कि device पर क्या है। और जो transient fetches एक flaky connection पर fail हो जाते हैं, वे backoff के साथ retry होते हैं — तीन कोशिशें, आधा सेकंड से बढ़कर एक cap तक, और एक user cancellation को कभी retry नहीं किया जाता।

Retry करना आसान है; मुश्किल हिस्सा यह है कि retry करते वक़्त उस user से न भिड़ें जिसने अभी cancel दबाया है — यही वह चीज़ है जो offline को एक ख़राब subway connection पर ठोस महसूस कराती है, बजाय इसके कि वह बस घूमता रहे।

DIALØGUE iOS की offline listening screen, download किए गए episode के controls के साथ
Offline हमेशा मौजूद था। दोबारा बनाने ने उसे resilient बनाया — resume, WiFi-only, storage controls, एक capped queue।

तुरंत, क्योंकि एक spinner "टूटा हुआ" पढ़ा जाता है

फ़ोन पर, latency एक एहसास है, एक नंबर नहीं। cold launch पर एक spinner "यह app टूटा हुआ है" की तरह पढ़ा जाता है, भले ही कुछ भी ग़लत न हो।

वह ported app हर cold launch पर हर cover image दोबारा download करता था, तो library spinners की एक दीवार बनकर खुलती थी। दोबारा बनाने ने cover art के लिए एक shared memory-and-disk cache जोड़ा — disk layer relaunches झेल जाती है, memory layer scrolling को smooth रखती है, और lock screen अपनी artwork के लिए वही cache दोबारा इस्तेमाल करती है। पहले किसी episode को दोबारा खोलने पर एक network round trip का इंतज़ार करना पड़ता था; अब हर episode के segments और transcript cache होते हैं और तुरंत render हो जाते हैं, फिर background में चुपचाप refresh हो जाते हैं। मैंने हर आधे सेकंड वाले playback tick को list rows से भी बाहर खींच लिया, ताकि वह timer पूरी library को बार-बार redraw करने पर मजबूर न करे।

यह कोई ऐसी feature नहीं है जिसका आप screenshot ले सकें। यह एक app और एक website के बीच का फ़ासला है।

episode तैयार होने पर यह आपको ping करता है

एक podcast generate करने में मिनट लगते हैं, सेकंड नहीं — research होती है, एक outline, एक script, फिर audio। वह ported app आपसे पूरे समय एक progress bar घूरवाता रहता था। native app नहीं करवाता।

आपकी अनुमति से, जैसे ही आपका episode तैयार होता है यह एक push notification भेजता है, तो आप फ़ोन lock कर सकते हैं, कुछ और कर सकते हैं, और जब यह buzz करे तब वापस आ सकते हैं। device token server-side store होता है, उसे सिर्फ़ notification job ही पढ़ सकता है, और आप पूरी चीज़ को settings में बंद कर सकते हैं। यह plumbing का एक छोटा-सा टुकड़ा है — एक table, एक worker, Apple की push service — पर यह product के महसूस होने का आकार "इस screen पर इंतज़ार करो" से बदलकर "हो जाएगा तो मैं बता दूँगा" कर देता है।

workflow app के बाहर से शुरू हो सकता है

एक native app सिर्फ़ अपनी ही window के अंदर नहीं जीता। दोबारा बनाने ने App Intents के ज़रिए Siri और Shortcuts support जोड़ा, तो "create a podcast," "resume listening," और "open my podcasts" बोले गए phrases के रूप में, Shortcuts app में, और Spotlight में काम करते हैं — किसी special entitlement की ज़रूरत नहीं। "resume" को क्या करना चाहिए (मौजूदा episode जारी रखना, या अगर कुछ load नहीं है तो library खोलना) — यह फ़ैसला एक नन्हा-सा pure function है जिसका मैं अकेले unit-test कर सकता था, और यही वह तरह की चीज़ है जो Siri के behavior को भटकने से रोकती है।

पहली बार चलाने पर एक संयमित तीन-page वाला welcome भी है — create, voices, कहीं भी सुनो — जो सिर्फ़ एक बार दिखता है, और deep links ताकि tap किया गया एक link सही screen खोले, बजाय इसके कि आपको home tab पर पटक दे। छोटी चीज़ें। यही फ़र्क़ है एक ऐसे app में जो फ़ोन पर बस पड़ा रहता है, और एक ऐसे app में जो उस फ़ोन का अपना है।

एक बात इस पर कि मैं कहाँ रुका: अभी कोई home-screen widgets नहीं हैं, कोई Live Activities नहीं, और अभी कोई CarPlay नहीं — हर एक को अपना अलग extension या Apple से मिला एक entitlement चाहिए, और मैंने पहले listening core को ship करना चुना। यहाँ "Native" एक दिशा है, एक पूरी हो चुकी checklist नहीं।

इससे मैं जो सबक़ ले रहा हूँ

अगर आप किसी चीज़ को एक नए platform पर port कर रहे हैं, तो लुभावना क़दम यह है कि उसे वहाँ चला दो और काम ख़त्म समझ लो। वह चलेगा। पर वह उधार लिया हुआ भी महसूस होगा।

Native डिवाइस के साथ एक contract है: lock screen का सम्मान करो, audio output बदलने की स्थितियों का, offline की हक़ीक़त का, उन system surfaces का जो लोग पहले से इस्तेमाल करते हैं। एक port आपके पुराने layout का सम्मान करता है। एक native app platform के conventions का सम्मान करता है — भले ही इसका मतलब tabs delete करना और ऐसी screens दोबारा लिखना हो जिन्हें आप पहले ही ship कर चुके हैं।

मेरे पास हिला-हिलाकर दिखाने लायक कोई नाटकीय install या retention नंबर नहीं हैं — मौजूदा version App Store पर live है, और यही इसकी ईमानदार हालत है। असली test कभी यह था ही नहीं कि screenshots native दिखते हैं या नहीं। वह यह है कि कोई इंसान एक episode बनाए, उसे फ़ोन lock किए हुए टहलते वक़्त सुने, और एक और बनाने के लिए वापस आए।

अगर आप mobile के लिए build करते हैं, तो मुझे जानने की उत्सुकता है कि आप लकीर कहाँ खींचते हैं: कब "यह फ़ोन पर चलता है" काफ़ी होता है, और कब platform का contract आपको दोबारा बनाने पर मजबूर कर देता है?

अक्सर पूछे जाने वाले सवाल

DIALØGUE के iOS rebuild में क्या बदला?

App वेब प्रोडक्ट के एक port से एक native rebuild में बदल गया। Information architecture पाँच tabs से घटकर तीन (Listen, Create, You) हो गई। Listening experience को मिला एक synced tap-to-seek transcript, chapter markers, lock-screen scrubbing और artwork, AirPlay, एक sleep timer, और configurable skip intervals। Offline downloads resilient हो गए, app तुरंत महसूस होने के लिए cover art और segments cache करता है, Siri/Shortcuts core actions को app के बाहर से शुरू करने देते हैं, और एक push notification बताती है कि episode कब तैयार है।

पाँच tabs तीन क्यों बन गए?

क्योंकि एक फ़ोन हर extra tab को सज़ा देता है। Credits ऐसी जगह नहीं थी जहाँ कोई जाना चाहे, तो वह "You" में और एक purchase sheet में फ़ोल्ड हो गया जो तब दिखती है जब आप सचमुच कम पड़ जाते हैं। Studio बन गया Series — Create के अंदर एक save किया हुआ setup, न कि अपना एक tab। Library और Profile बन गए सीधे-सादे "Listen" और "You"।

Rebuild ने कौन-सी native iOS features जोड़ीं?

Lock-screen scrubbing और dynamic artwork, AirPlay, volume fade वाला एक sleep timer, configurable skip intervals (10–60s) जो lock-screen controls को भी चलाते हैं, scrubber पर chapter ticks, एक synced tap-to-seek transcript, resilient offline downloads (resume, WiFi-only, storage management, capped queue), तुरंत rendering के लिए shared cover-art और segment caches, Siri/Shortcuts intents, "episode ready" push notifications, server-side playback position जो वेब और फ़ोन के बीच resume होती है, deep links, और first-run onboarding।

क्या synced transcript हर episode के लिए काम करता है?

कोई transcript line seek के लिए tap करने लायक तभी होती है जब audio में exact per-segment timing हो। जब timing approximate होती है, line फिर भी दिखती है पर seekable नहीं रहती, और app इस बारे में दिखावा नहीं करता। यह transcript इसलिए मुमकिन है क्योंकि DIALØGUE ने ही script generate की, तो वह structure और किसने क्या कहा — दोनों जानता है।

Studio और Series में क्या फ़र्क़ है?

Studio एक ऐसा control room सुझाता था जो knobs से भरा हो। Series बस एक save किया हुआ setup है — hosts, tone, format, language, और source pattern — जो आपको सब कुछ दोबारा configure किए बिना अगला episode शुरू करने देता है। यह Create के अंदर एक preset है, कोई standalone tab नहीं।

यह NotebookLM के audio overviews से कैसे अलग है?

NotebookLM सचमुच काम का है, और मुफ़्त भी, आपके sources को एक झटपट audio overview में बदलने के लिए। DIALØGUE generation के ऊपर एक पूरा native listening product बनने की कोशिश कर रहा है: किसी भी audio से पहले outline और script review, voice selection, एक synced tap-to-seek transcript, chapters, lock-screen और AirPlay controls, offline downloads, Siri, और बार-बार चलने वाले shows के लिए Series। ईमानदार फ़र्क़ "कौन बेहतर audio generate करता है" से कम और "episode के बनने के बाद उसका क्या होता है" से ज़्यादा है।

क्या rebuild ने offline listening जोड़ी?

Offline downloads पहले से मौजूद थे। Rebuild ने उन्हें resilient बनाया: रुके हुए downloads restart होने के बजाय resume होते हैं, एक WiFi-only option और एक storage view है, downloads एक बार में ज़्यादा-से-ज़्यादा तीन चलते हैं, और transient network failures उस user से भिड़े बिना backoff के साथ retry होते हैं जो cancel करता है।

बस, मेरी तरफ़ से अभी इतना ही।

Cheers, Chandler