SeaMeet Desktop यहाँ है — सब कुछ रिकॉर्ड करें, कुछ भी न छूटे। मुफ़्त डाउनलोड करें →

GitHub Sync सेटअप

अध्याय 38: GitHub Sync सेटअप

GitHub Sync आपके SeaMeet कार्यस्थान को एक निजी, संस्करण-नियंत्रित Markdown ट्री में बदल देता है जो आपकी अपनी GitHub रिपॉजिटरी में रहता है। हर बार जब आप एक नोट संपादित करते हैं, एक रिकॉर्डिंग का नाम बदलते हैं, या एक wiki पृष्ठ को tweak करते हैं, SeaMeet चुपचाप पृष्ठभूमि में परिवर्तन को कमिट करता है और इसे GitHub पर पुश करता है। एक अलग लैपटॉप पर SeaMeet खोलें और आपके नोट्स पहले लॉन्च पर खींच लिए जाते हैं — बीच में कोई Dropbox नहीं, लूप में कोई Seasalt सर्वर नहीं। रिपो आपकी है, डेटा आपका है, और यदि आप कभी चाहें तो आप इसे सीधे github.com पर ब्राउज़ कर सकते हैं।

मॉडल सरल है: आपकी GitHub रिपॉजिटरी संग्रहण है। SeaMeet एक सिंक सेवा नहीं चलाता है। यह आपके खाते पर एक छोटा GitHub App स्थापित करता है, एक प्रति-उपयोगकर्ता OAuth टोकन प्राप्त करता है, और सीधे Git कमिट को पुश और पुल करने के लिए उस टोकन का उपयोग करता है। चूँकि संग्रहण GitHub का मुफ्त टियर है — जो आपको असीमित निजी रिपो देता है — सिंक प्रभावी रूप से मुफ्त है। और चूँकि प्रत्येक SeaMeet कार्यस्थान अपनी रिपॉजिटरी है, आप कार्य और व्यक्तिगत कार्यस्थानों को पूरी तरह से अलग रख सकते हैं।


अध्याय के उद्देश्य

इस अध्याय को पढ़ने के बाद, आप यह करने में सक्षम होंगे:

  • अपने खाते या संगठन पर SeaMeet GitHub App स्थापित करें
  • OAuth पर SeaMeet को अधिकृत करें और इसे आपके लिए एक निजी सिंक रिपॉजिटरी बनाने दें
  • सिंक स्थिति बार पढ़ें और सिंक स्टेट मशीन में प्रत्येक स्थिति को समझें
  • पहचानें जब OAuth पृष्ठभूमि में ऑटो-रिफ्रेश हुआ है और जब आपको मैन्युअल रूप से फिर से अधिकृत करने की आवश्यकता है
  • एक सिंक संघर्ष को हल करें जब एक ही नोट को दो डिवाइसों पर संपादित किया गया हो
  • Sync सेटिंग्स पैनल को ट्यून करें (auto-sync, sync interval, sync on startup)
  • सबसे आम विफलता मोडों का निवारण करें

पूर्वापेक्षाएँ

शुरू करने से पहले, सुनिश्चित करें कि आपके पास है:

  • एक GitHub खाता — मुफ्त टियर ठीक है; आपको GitHub Pro की आवश्यकता नहीं है
  • एक सक्रिय सिंक एंटाइटलमेंट — BYOK Pro और Sync Pro टियर के साथ शामिल। यदि आपका billing tier सिंक शामिल नहीं करता है, तो Sync सेटिंग्स स्क्रीन एक "Subscribe to enable sync" बैनर दिखाएगी। प्लान विवरण के लिए अध्याय 35: सदस्यता और बिलिंग देखें।
  • SeaMeet में एक कार्यस्थान खुला — सिंक सक्रिय कार्यस्थान से जुड़ता है, पूरे ऐप से नहीं। यदि आपके पास कई कार्यस्थान हैं, तो प्रत्येक अपनी GitHub रिपॉजिटरी है।
  • काम कर रहा इंटरनेट एक्सेस — सेटअप प्रवाह आपके डिफ़ॉल्ट ब्राउज़र में GitHub खोलता है

प्रति कार्यस्थान एक रिपो। SeaMeet प्रत्येक कार्यस्थान के लिए एक अलग निजी रिपॉजिटरी बनाता है जिसे आप कनेक्ट करते हैं। यह कार्य नोट्स और व्यक्तिगत नोट्स को साफ़-सुथरा अलग रखता है और इसका मतलब है कि आप एक को दूसरे को छुए बिना डिस्कनेक्ट कर सकते हैं।


चरण-दर-चरण सेटअप

पहली बार सेटअप में लगभग 90 सेकंड लगते हैं: GitHub पर SeaMeet को अधिकृत करें, इसे आपकी रिपो बनाने दें, प्रारंभिक अपलोड की प्रतीक्षा करें, और आप पूर्ण हैं।

चरण 1: Sync सेटिंग्स खोलें

  1. सेटिंग्स गियर आइकन क्लिक करें
  2. बाएँ रेल में Sync टैब खोलें
  3. आप "Sync with GitHub" हेडर कार्ड देखेंगे

यदि आप Sync टैब नहीं देखते हैं, तो आपका सदस्यता स्तर सिंक शामिल नहीं करता है — अपग्रेड करने के लिए अध्याय 35 देखें।

यदि आप एक बैनर देखते हैं जो पढ़ता है "Back up your notes to a private GitHub repo with BYOK Pro", आपके पास एक मुफ्त खाता है। paywall खोलने के लिए बैनर पर क्लिक करें, या जब तक आप सब्सक्राइब नहीं करते तब तक इस अध्याय के बाकी हिस्से को छोड़ दें।

चरण 2: "Set Up GitHub Sync" क्लिक करें

Sync सेटिंग्स खाली स्थिति तीन benefit tiles ("Free & private", "Effectively unlimited", "One repo per workspace") और नीचे एक प्राथमिक Set Up GitHub Sync बटन दिखाती है।

इसे क्लिक करें। आपका डिफ़ॉल्ट ब्राउज़र एक GitHub authorization page पर खुलता है।

चरण 3: SeaMeet GitHub App स्थापित करें (एक बार)

पहली बार जब आप SeaMeet को अधिकृत करते हैं, GitHub आपसे SeaMeet GitHub App को अपने खाते पर स्थापित करने के लिए कहेगा। यह प्रति GitHub खाते (या प्रति संगठन, यदि आप एक org-स्वामित्व वाले रिपो में सिंक करना चाहते हैं) एक बार का चरण है।

GitHub install page पर:

  1. खाता या संगठन चुनें जिसमें आप SeaMeet को लिखने देना चाहते हैं
  2. "All repositories" या "Only select repositories" चुनें — SeaMeet App को आपकी ओर से सिंक रिपो बनाने के लिए contents: write और administration: write अनुमतियों की आवश्यकता है
  3. Install & Authorize क्लिक करें

GitHub आपको SeaMeet पर वापस उछालता है। Sync सेटिंग्स पैनल अब दिखाता है:

┌──────────────────────────────────────────────────────┐
│   ✓ Authorized                                       │
│   ⟳ Creating repository & uploading...               │
└──────────────────────────────────────────────────────┘

एक GitHub App क्यों और एक सादा OAuth टोकन नहीं? GitHub Apps में सूक्ष्म-समय प्रति-रिपो अनुमतियाँ और घूर्णन refresh tokens हैं। SeaMeet के पास हमेशा केवल उन रिपो को लिखने का एक्सेस होता है जिन्हें आपने स्पष्ट रूप से चुना था, और OAuth access token हर 8 घंटे में समाप्त हो जाता है — भले ही यह लीक हो जाए, विंडो छोटी होगी। (देखें कि SeaMeet इसे आपको कैसे अदृश्य रखता है इसके लिए नीचे OAuth Auto-Refresh अनुभाग देखें।)

चरण 4: रिपॉजिटरी निर्माण (स्वचालित)

SeaMeet अब आपकी ओर से GitHub API को कॉल करता है और:

  1. आपके कार्यस्थान के नाम पर एक निजी रिपो बनाता है (जैसे seameet-work-notes)
  2. यदि एक पहले से मौजूद नहीं है तो आपके कार्यस्थान फ़ोल्डर के अंदर एक स्थानीय Git रिपो आरंभ करता है
  3. git init चलाता है, एक .gitignore लिखता है जो audio/video/screenshot फ़ाइलों को बाहर करता है, और एक प्रारंभिक कमिट करता है
  4. नई GitHub रिपो को origin के रूप में जोड़ता है
  5. प्रारंभिक कमिट को पुश करता है

आप साइडबार के नीचे स्थिति बार को इसके माध्यम से संक्रमित होते देखेंगे:

Creating repository...  →  Syncing...  →  Synced · just now

बस इतना ही। आपका कार्यस्थान अब GitHub द्वारा समर्थित है।

चरण 5: पहला सिंक स्वचालित रूप से चलता है

अब से, SeaMeet हर 5 मिनट (डिफ़ॉल्ट रूप से) ऑटो-कमिट करता है जब भी आपके पास unsaved changes होते हैं, और प्रत्येक कमिट के तुरंत बाद GitHub पर पुश करता है। SeaMeet के अगले लॉन्च पर, ऐप संपादन शुरू करने से पहले ही GitHub से खींचता है — इसलिए किसी अन्य डिवाइस पर किए गए परिवर्तन ऐप खुलते ही दिखाई देते हैं।


सिंक स्टेट मशीन

SeaMeet का SyncManager एक छोटी स्टेट मशीन चलाता है और अपनी वर्तमान स्थिति को renderer पर प्रसारित करता है। साइडबार SyncStatusBar और Sync सेटिंग्स पैनल दोनों इस स्थिति से पढ़ते हैं। स्थितियों को समझना आपको UI को सटीक रूप से पढ़ने में मदद करता है।

                      ┌─────────────┐
                      │    idle     │ ◄──────┐
                      └──────┬──────┘        │
                             │ file change   │
                             ▼               │
                      ┌─────────────┐        │
                ┌────►│   pending   │        │
                │     └──────┬──────┘        │
       file     │            │ commit timer  │
       change   │            ▼               │
                │     ┌─────────────┐        │
                │     │ committing  │        │
                │     └──────┬──────┘        │
                │            ▼               │
                │     ┌─────────────┐        │
                │     │   pushing   │        │
                │     └──────┬──────┘        │
                │            ▼               │
                │     ┌─────────────┐        │
                │     │   synced    │── 5s ──┘
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤   pulling   │  (startup or push-rejected)
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤  conflict   │  → user resolves → syncing → synced
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤   offline   │  → network back → retry
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤   timeout   │  → user clicks Retry
                │     └─────────────┘
                │
                │     ┌────────────────┐
                └─────┤ token-expired  │ → re-authorize card
                      └────────────────┘

यहाँ UI में प्रत्येक स्थिति का क्या मतलब है:

स्थितिस्थिति बार लेबलइसका क्या मतलब है
idle"Synced · 2 min ago"कुछ लंबित नहीं, अंतिम कमिट साफ़ था
pending"Pending..."आपके पास unsaved changes हैं; कमिट टाइमर अगले अंतराल पर चलेगा
committing"Syncing..."एक Git कमिट स्थानीय रूप से चल रहा है
pushing"Pushing..."स्थानीय कमिट पूर्ण; GitHub पर पुश कर रहा है
pulling"Pulling..."या तो startup sync, या पुश को अस्वीकार किया गया और हम पहले खींच रहे हैं
syncing"Syncing..."संघर्ष समाधान के बाद एक rebase समाप्त कर रहा है
synced"Synced · just now"अभी-अभी पूर्ण हुई सफलता; 5 सेकंड के लिए दिखाया जाता है, फिर idle पर वापस आता है
conflict"Sync conflict"स्थानीय और रिमोट दोनों ने एक ही फ़ाइल को संपादित किया। UI संघर्ष समाधान प्रवाह को दिखाता है।
error"Sync error"एक गैर-नेटवर्क, गैर-संघर्ष विफलता (जैसे git विफलता)। 5 बार तक exponential backoff के साथ ऑटो-रिट्रीज़ करता है।
offline"Offline"नेटवर्क पहुँच से बाहर। अगले फ़ाइल परिवर्तन पर या 60 सेकंड के बाद फिर से प्रयास करेगा।
timeout"Sync timed out"एक git कमांड 60 सेकंड से अधिक समय लिया (नीचे Sync Timeout Protection देखें)
token-expired"Re-authorize"OAuth रिफ्रेश विफल हो गया और उपयोगकर्ता को मैन्युअल रूप से फिर से अधिकृत करना होगा
installing-app"Installing GitHub App..."उपयोगकर्ता को अपने ब्राउज़र में GitHub App install चरण समाप्त करने की प्रतीक्षा कर रहा है
creating-repo"Creating repository..."सेटअप प्रवाह GitHub रिपो बना रहा है और प्रारंभिक कमिट को पुश कर रहा है

यदि स्थिति बार एक स्पिनर दिखा रहा है, तो यह सामान्य पृष्ठभूमि गतिविधि है। यदि यह amber या लाल है, तो नीचे समस्या निवारण अनुभाग देखें।


OAuth ऑटो-रिफ्रेश

GitHub Apps user access tokens जारी करते हैं जो हर 8 घंटे में समाप्त हो जाते हैं, साथ ही एक refresh token जो 6 महीने के लिए मान्य है। SeaMeet आपके लिए इसे प्रबंधित करता है ताकि आपको लगभग कभी इसके बारे में सोचने की आवश्यकता न पड़े।

यह कैसे काम करता है:

  1. जब SeaMeet पुश या पुल करने वाला होता है, SyncManager._refreshTokenIfNeeded() जाँचता है कि क्या वर्तमान टोकन अगले 5 मिनट के भीतर समाप्त हो जाता है।
  2. यदि हाँ, SeaMeet संग्रहीत refresh token के साथ GitHub के /login/oauth/access_token endpoint को कॉल करता है। GitHub एक नया access token लौटाता है और refresh token को घुमाता है। SeaMeet दोनों को डिस्क पर encrypted token file में वापस लिखता है।
  3. Git कमांड फिर ताज़ा-रिफ्रेश किए गए टोकन के साथ चलता है। आप स्क्रीन पर कुछ नहीं देखते हैं — पूरा रिफ्रेश एक सेकंड से कम में होता है।

क्षणिक विफलता हैंडलिंग: यदि रिफ्रेश कॉल विफल हो जाता है क्योंकि नेटवर्क ख़राब है या GitHub ने 5xx (एक REFRESH_NETWORK_ERROR) लौटाया, तो SeaMeet मौजूदा टोकन को नहीं फेंकता है। इसके बजाय सिंक offline स्थिति में जाता है और बाद में फिर से कोशिश करता है। यह मायने रखता है क्योंकि मौजूदा टोकन कई और मिनटों तक मान्य हो सकता है — एक क्षणिक नेटवर्क blip पर इसे छोड़ देना आपको अनावश्यक रूप से सिंक से लॉग आउट कर देगा।

समकालिक रिफ्रेश coalescing: GitHub हर बार जब आप इसका उपयोग करते हैं तो refresh token को घुमाता है, इसलिए दो समकालिक रिफ्रेश दौड़ लगाएँगे और एक दूसरे को अमान्य कर देगा। SeaMeet समकालिक रिफ्रेश कॉल्स को एक एकल in-flight Promise (_refreshPromise) में संक्षिप्त करता है ताकि startup-sync और push-with-retry कभी घूर्णन टोकन पर न लड़ें।

जब रिफ्रेश वास्तव में विफल हो जाता है: यदि GitHub REFRESH_TOKEN_EXPIRED लौटाता है — जिसका मतलब है कि 6-महीने का refresh token समाप्त हो गया है या रद्द कर दिया गया है — SeaMeet:

  1. डिस्क से encrypted token file हटाता है
  2. token-expired टर्मिनल स्थिति में प्रवेश करता है
  3. Sync सेटिंग्स में एक amber कार्ड दिखाता है:
┌──────────────────────────────────────────────────────┐
│ ⚠  GitHub authorization has expired. Please           │
│    re-authorize to resume syncing.                    │
│                                                       │
│  [ ↻ Re-authorize GitHub ]                            │
└──────────────────────────────────────────────────────┘

Re-authorize GitHub क्लिक करें। आप OAuth प्रवाह के माध्यम से वापस भेजे जाते हैं — लेकिन क्योंकि GitHub App पहले से स्थापित है, यह पुष्टि करने के लिए एक एकल क्लिक है और आप लगभग 10 सेकंड में पूर्ण हैं। SeaMeet फिर अगले पुश से पहले आपके स्थानीय git config से कोई बासी टोकन हटा देता है (पुराना टोकन origin के URL में embedded हो सकता है), ताकि आप एक मृत क्रेडेंशियल पर loop न करें।


Sync Timeout सुरक्षा

Git कमांड हमेशा के लिए लटक सकते हैं यदि नेटवर्क बीच में चुप हो जाता है — एक TCP socket बिना किसी त्रुटि के एक half-open स्थिति में बैठ सकता है। SeaMeet हर Git push और pull को एक 60-सेकंड AbortController timeout में wrap करता है।

यदि एक push या pull 60 सेकंड में पूरा नहीं होता है, SeaMeet:

  1. git subprocess को बाधित करता है
  2. timeout स्थिति में प्रवेश करता है
  3. Sync सेटिंग्स में एक amber कार्ड दिखाता है:
┌──────────────────────────────────────────────────────┐
│ ⚠  Sync timed out. This may be caused by a network   │
│    issue or expired GitHub authorization.             │
│                                                       │
│  [ ↻ Retry Sync ]   [ Re-authorize GitHub ]           │
└──────────────────────────────────────────────────────┘

Retry Sync commitNow फिर से चलाता है। यह क्लिक करने के लिए सही बटन है यदि आपको लगता है कि आपका नेटवर्क संक्षेप में गिर गया था। Re-authorize GitHub फिर से OAuth प्रवाह चलाता है; इस पर क्लिक करें यदि timeout बार-बार आता रहता है, जिसका आमतौर पर मतलब है कि नेटवर्क के बजाय आपका टोकन समस्या है।

स्थिति लगभग 30 सेकंड बाद स्वचालित रूप से idle पर वापस आ जाती है भले ही आप कुछ भी क्लिक न करें — सिंक अगले फ़ाइल परिवर्तन पर फिर से प्रयास करेगा।


संघर्ष समाधान

एक संघर्ष होता है जब पिछले सिंक के बाद से एक ही फ़ाइल को दो डिवाइसों पर संपादित किया गया हो। उदाहरण: आपने अपने लैपटॉप पर meetings/2026-06-03-standup.md में एक पैराग्राफ लिखा, फिर बाद में एक मित्र की मशीन पर उसी पैराग्राफ को संपादित किया। जब दूसरा डिवाइस पुश करता है, GitHub पुश को अस्वीकार कर देता है क्योंकि इतिहास भिन्न हो जाते हैं।

SeaMeet इसे इस तरह से संभालता है:

  1. rebase के साथ remote परिवर्तनों को खींचता है
  2. merge conflict markers का पता लगाता है
  3. conflict स्थिति में प्रवेश करता है
  4. साइडबार स्थिति बार में संघर्ष को दिखाता है (जो क्लिक करने योग्य हो जाता है) और Sync सेटिंग्स संघर्ष पैनल में

संघर्ष समाधान मोडल

जब सिंक conflict में हो तो स्थिति बार पर क्लिक करना संघर्ष समाधान मोडल खोलता है:

┌──────────────────────────────────────────────────────────┐
│  ⚠  Sync Conflict                    1 / 2          [×]  │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  "2026-06-03-standup.md" was changed on another device.  │
│                                                          │
│  ┌────────────────────────┐  ┌────────────────────────┐  │
│  │ ✎  Edit manually       │  │ ✦  Agent merge         │  │
│  └────────────────────────┘  └────────────────────────┘  │
│                                                          │
└──────────────────────────────────────────────────────────┘

आपके पास दो विकल्प हैं:

Edit manually — आपके सिस्टम के डिफ़ॉल्ट संपादक में conflict file खोलता है जिसमें Git के मानक <<<<<<< / ======= / >>>>>>> markers जगह पर हैं। उन्हें हल करने के लिए फ़ाइल संपादित करें, सहेजें, फिर SeaMeet पर वापस आएँ और Done क्लिक करें। SeaMeet हल की गई फ़ाइल को stage करता है और rebase जारी रखता है।

Agent merge (केवल BYOK Pro, AI Agent कॉन्फ़िगर की आवश्यकता है) — दोनों संस्करणों को आपके कॉन्फ़िगर किए गए AI Agent (GitHub Copilot या Claude Code, अध्याय 36: BYOK सेटअप गाइड देखें) को भेजता है और इसे एक merged संस्करण उत्पन्न करने के लिए कहता है जो दोनों पक्षों की मंशा रखता है। एजेंट का आउटपुट स्वचालित रूप से staged होता है; rebase पूरा होने के दौरान आप एक "Finishing sync..." spinner देखेंगे।

यदि एक साथ कई संघर्ष हैं, तो मोडल एक काउंटर (1 / 2, 2 / 2) और Sync सेटिंग्स संघर्ष पैनल में chevron arrows दिखाता है ताकि आप एक बार में एक के माध्यम से कदम बढ़ा सकें।

"Keep mine" / "Keep theirs" / "Keep both" विकल्प natural choices के रूप में आते हैं जब आप मैन्युअल संपादक के अंदर होते हैं: markers के बीच केवल अपने संस्करण का text छोड़ें, केवल remote संस्करण का text, या दोनों को interleave करें। Agent merge बटन प्रभावी रूप से "keep both, intelligently" करता है।

यदि आप गलती करते हैं तो क्या? सिंक संघर्ष गैर-विनाशकारी हैं। Git मूल "ours" और "theirs" सामग्री को index में रखता है, और getConflictVersions(filePath) resolution के दौरान किसी भी बिंदु पर किसी भी को पुनः प्राप्त कर सकता है। आप गलती से काम नहीं खोएँगे।


Sync सेटिंग्स पैनल

एक बार जब आप कनेक्ट हो जाते हैं, Sync सेटिंग्स (सेटिंग्स → Sync) आपको एक स्क्रीन में सब कुछ एक स्थान पर देता है:

┌─────────────────────────────────────────────────────────────┐
│  ✓ Sync & Backup                                            │
│  Your notes and wiki are automatically synced to GitHub.    │
│  Audio recordings, video recordings, and screenshots are    │
│  not synced.                                                │
├─────────────────────────────────────────────────────────────┤
│  ⓘ  https://github.com/you/seameet-work-notes                │
│  🕒 Last sync: 4 minutes ago                                 │
├─────────────────────────────────────────────────────────────┤
│  Auto-sync                                       [ ON  ◉ ]  │
│  Sync interval                                  [ 5 min ▾ ] │
│  Branch                                              main   │
│  Last synced                                  4 minutes ago │
├─────────────────────────────────────────────────────────────┤
│  Auto-sync on changes                            [ ON  ◉ ]  │
│  Sync on startup                                 [ ON  ◉ ]  │
├─────────────────────────────────────────────────────────────┤
│  [ ⤓ Sync Now ]                                             │
├─────────────────────────────────────────────────────────────┤
│  [ ↗ View on GitHub ]    [ Disconnect ]                     │
└─────────────────────────────────────────────────────────────┘

नियंत्रण, ऊपर से नीचे:

  • Auto-sync — पृष्ठभूमि commit timer के लिए मास्टर टॉगल। बंद का मतलब है कि SeaMeet केवल तब कमिट करता है जब आप Sync Now क्लिक करते हैं।
  • Sync interval — कमिट टाइमर कितनी बार चलता है। विकल्प 1 / 5 / 10 / 30 मिनट हैं। डिफ़ॉल्ट 5 मिनट है। एक 1-मिनट का अंतराल सक्रिय note-taking के लिए ठीक है; 30 मिनट कम-संपादन कार्यस्थानों के लिए अच्छा है जहाँ आप कमिट को batch करना पसंद करेंगे।
  • Branch — Git शाखा जिसमें SeaMeet सिंक करता है। लगभग हमेशा main। UI में केवल-पढ़ने वाला।
  • Last synced — पिछले सफल पुश का सापेक्ष टाइमस्टैम्प।
  • Auto-sync on changes — जब चालू, पुश प्रत्येक स्थानीय कमिट के तुरंत बाद होते हैं (सामान्य मामला)। जब बंद, SeaMeet स्थानीय रूप से कमिट करता है लेकिन केवल तब पुश करता है जब आप Sync Now क्लिक करते हैं। यदि आप पुश को batch करना चाहते हैं (जैसे एक metered connection पर) तो उपयोगी।
  • Sync on startup — जब चालू, SeaMeet ऐप लॉन्च होते ही GitHub से खींचता है। अनुशंसित जब तक कि आपके पास बहुत धीमा कनेक्शन न हो।
  • Sync Now — एक तत्काल commit-and-push चक्र को मजबूर करें। टाइमर की प्रतीक्षा नहीं करता। अपना लैपटॉप बंद करने से पहले उपयोगी।
  • View on GitHub — रिपो को आपके ब्राउज़र में खोलता है।
  • Disconnect — संग्रहीत OAuth टोकन को साफ़ करता है, encrypted token file को हटाता है, और आपके स्थानीय Git रिपो से origin को हटाता है। आपकी स्थानीय Markdown फ़ाइलें और Git इतिहास अछूते रहते हैं — केवल GitHub का लिंक टूटता है।

क्या सिंक होता है (और क्या नहीं)

यह part index में प्रलेखित है, लेकिन इसे यहाँ दोहराने योग्य है:

सिंक होता हैसिंक नहीं होता
नोट्स (.md फ़ाइलें)ऑडियो रिकॉर्डिंग (.webm, .mp3)
Wiki पृष्ठ (.md फ़ाइलें)वीडियो रिकॉर्डिंग (.webm, .mp4)
रिकॉर्डिंग मैनिफ़ेस्ट (मेटाडेटा JSON)स्क्रीनशॉट (.png, .jpg)
AI सारांश और ट्रांसक्रिप्टकैश्ड AI जनरेशन
Wikilink ग्राफ़ऐप सेटिंग्स
.gitignoreसंपादक scratch state

SeaMeet जो .gitignore लिखता है वह सभी बड़ी बाइनरी श्रेणियों को बाहर करता है। यह जानबूझकर है: GitHub के मुफ्त निजी रिपो 1 GB पर cap हैं, और एक 30-मिनट का वीडियो अपने आप ही उसे खा जाएगा। SeaMeet मीडिया को आपके स्थानीय डिस्क पर रखता है और केवल हल्के Markdown को सिंक करता है।

यदि आप पूर्ण मीडिया सिंक चाहते हैं, तो वह Sync Pro टियर है — अध्याय 35 देखें।


समस्या निवारण

"Set Up GitHub Sync क्लिक करने के तुरंत बाद Authorization failed"

कारण और सुधार:

  • Pop-up blocker — यदि कोई ब्राउज़र विंडो नहीं खुली, तो आपके OS या ब्राउज़र ने लॉन्च को ब्लॉक कर दिया हो सकता है। Set Up GitHub Sync फिर से क्लिक करें और किसी भी pop-up prompt की पुष्टि करें।
  • आपने GitHub App अनुमतियों को अस्वीकार कर दिया — प्रवाह के माध्यम से वापस जाएँ और contents: write + administration: write स्कोप स्वीकार करें। administration: write के बिना SeaMeet आपके लिए रिपो नहीं बना सकता।
  • State mismatch error — किसी अन्य SeaMeet विंडो को बंद करें जो उसी OAuth प्रवाह पर दौड़ रहे हो सकते हैं, फिर पुनः प्रयास करें।

सेटअप के दौरान "Repo permissions" त्रुटि

त्रुटि कुछ इस तरह पढ़ती है "GitHub App has 'contents: read' permission, but needs 'contents: write'." इसका मतलब है कि आपने App के पुराने संस्करण को स्थापित किया।

ठीक करें:

  1. github.com/settings/installations खोलें
  2. सूची में SeaMeet खोजें और Configure क्लिक करें
  3. Repository permissions के अंतर्गत, Contents और Administration को Read and write में बदलें
  4. सहेजें, फिर ऐप को uninstall और reinstall करें — GitHub केवल reinstall पर नई अनुमतियाँ लागू करता है
  5. SeaMeet में Set Up GitHub Sync फिर से चलाएँ

"Could not reach GitHub" / सिंक "Offline" पर अटका

नेटवर्क विफलता। SeaMeet स्वचालित रूप से पुनः प्रयास करेगा जब:

  • आप कोई फ़ाइल परिवर्तन करते हैं (तत्काल पुनः प्रयास को ट्रिगर करता है)
  • अंतिम पुनः प्रयास से 60 सेकंड बीतते हैं

यदि आपका नेटवर्क वापस है और कुछ मिनटों के बाद भी सिंक Offline दिखाता है:

  1. एक पुनः प्रयास को मजबूर करने के लिए Sync Now क्लिक करें
  2. यदि वह timeout हो जाता है: जाँचें कि आपका firewall github.com को ब्लॉक नहीं कर रहा है
  3. अंतिम उपाय के रूप में, SeaMeet को पुनरारंभ करें — startup sync लॉन्च पर चलेगा

सिंक "Pending" पर अटका

इसका आमतौर पर मतलब है कि auto-commit timer अभी तक नहीं चला है। डिफ़ॉल्ट रूप से यह हर 5 मिनट में चलता है। प्रतीक्षा नहीं करना चाहते? Sync Now क्लिक करें।

यदि Sync Now सिंक को Pending से आगे नहीं ले जाता है, जाँचें:

  • क्या आप एक billing tier पर हैं जिसमें सिंक शामिल है? Sync सेटिंग्स खोलें — यदि आप subscribe banner देखते हैं, तो सिंक entitlement layer पर अक्षम है।
  • क्या Markdown ट्री के बाहर कोई uncommitted changes हैं? auto-commit timer केवल तब चलता है जब _pendingChanges गैर-खाली होता है।

"मुझे token-expired कार्ड दिखाई दे रहा है"

यह OAuth रिफ्रेश जीवनचक्र का अपेक्षित अंत है — आपका 6-महीने का refresh token समाप्त हो गया, या आपने GitHub App को रद्द कर दिया, या आपने अपना GitHub पासवर्ड बदल दिया (जो सभी OAuth tokens को अमान्य करता है)।

ठीक करें: कार्ड में Re-authorize GitHub क्लिक करें। प्रवाह प्रारंभिक सेटअप के समान है लेकिन GitHub App install चरण को छोड़ देता है (आपने इसे पहले से स्थापित किया है)। लगभग 10 सेकंड लगते हैं।

संघर्ष समाधान पैनल बंद नहीं होगा

पैनल केवल तब बंद होता है जब सूची में सभी संघर्ष हल हो जाते हैं। यदि आप काउंटर देखते हैं (1 / 3), शेष फ़ाइलों के माध्यम से कदम बढ़ाने के लिए Sync सेटिंग्स संघर्ष पैनल में chevron arrows का उपयोग करें। प्रत्येक को एक स्पष्ट समाधान (manual edit + Done, या Agent merge) की आवश्यकता है।

यदि पैनल आग्रह करता है कि संघर्ष हैं लेकिन आप अपनी फ़ाइलों में कोई markers नहीं देखते, Sync Now क्लिक करें — एक बासी conflict स्थिति अगले सफल सिंक प्रयास पर साफ़ हो जाएगी।

"Push rejected" loops

यदि सिंक pushing और pulling के बीच बार-बार बदलता है, तो GitHub आपके पुश को अस्वीकार कर रहा है क्योंकि remote आगे बढ़ता रहता है। यह तब हो सकता है जब:

  • कोई अन्य SeaMeet इंस्टेंस उसी रिपो के विरुद्ध चल रहा है और तेज़ी से पुश कर रहा है जितना यह पकड़ सकता है — अन्य इंस्टेंस को बंद करें।
  • कोई (या कोई उपकरण) SeaMeet के बाहर से GitHub रिपो में कमिट कर रहा है — बाहरी उपकरण को रोकें जब तक कि आपका स्थानीय क्लोन पकड़ न ले।

सुरक्षा नोट्स

OAuth टोकन कहाँ संग्रहीत है: आपके OS keychain में Electron के safeStorage API के माध्यम से। Windows पर यह DPAPI है, macOS पर यह Keychain Services है, Linux पर यह libsecret है। एन्क्रिप्टेड blob <userData>/github-token.enc पर फ़ाइल mode 0o600 के साथ लिखा जाता है। फ़ाइल access token, refresh token, expiry timestamp, और GitHub App के client ID, client secret, और slug रखती है।

argv में क्या संग्रहीत नहीं है: OAuth token को कभी भी -c http.extraHeader=... argument के रूप में git को नहीं दिया जाता है, क्योंकि argv अन्य उपयोगकर्ताओं को ps aux के माध्यम से दिखाई देता है। इसके बजाय Authorization header GIT_CONFIG_PARAMETERS पर्यावरण चर के माध्यम से इंजेक्ट किया जाता है, जो प्रक्रिया के लिए निजी है। एक ही मशीन पर अन्य उपयोगकर्ता आपका टोकन नहीं देख सकते।

रिपो में डिस्क पर क्या आता है: सादा Markdown फ़ाइलें। कोई tokens नहीं, कोई secrets नहीं, कोई credentials नहीं। .gitignore मीडिया फ़ाइलों को बाहर करता है, लेकिन आपको अभी भी note bodies में secrets पेस्ट करने से बचना चाहिए — वे सिंक होंगे।

एक्सेस रद्द करना: एक रिपो पर SeaMeet के एक्सेस को तुरंत काट देने के लिए, github.com/settings/installations पर SeaMeet GitHub App को uninstall करें। अगला सिंक प्रयास token-expired के साथ विफल हो जाएगा और SeaMeet अपना स्थानीय टोकन साफ़ कर देगा। आपके स्थानीय नोट्स अछूते रहते हैं।


त्वरित संदर्भ

┌─────────────────────────────────────────────────────────────┐
│                   GITHUB SYNC                               │
│                   Quick Reference                           │
├─────────────────────────────────────────────────────────────┤
│  Open Sync Settings    │ Settings → Sync                    │
│  First-time setup      │ Click "Set Up GitHub Sync"         │
│  Required scopes       │ contents: write, admin: write      │
│  Repo naming           │ One private repo per workspace     │
├─────────────────────────────────────────────────────────────┤
│  Default sync interval │ 5 minutes (1 / 5 / 10 / 30)        │
│  Force a sync          │ "Sync Now" button                  │
│  Auto-sync on push     │ On (toggle in Sync Settings)       │
│  Sync on startup       │ On (toggle in Sync Settings)       │
├─────────────────────────────────────────────────────────────┤
│  OAuth refresh margin  │ 5 minutes before expiry            │
│  Git command timeout   │ 60 seconds (AbortController)       │
│  Auto-retry limit      │ 5 attempts, exp. backoff           │
│  Token storage         │ OS keychain (safeStorage)          │
├─────────────────────────────────────────────────────────────┤
│  Conflict UI           │ Click status bar when in conflict  │
│  Manual resolve        │ Edit markers → Done                │
│  Agent merge           │ BYOK Pro + AI Agent configured     │
├─────────────────────────────────────────────────────────────┤
│  Disconnect            │ Sync Settings → Disconnect         │
│  Revoke from GitHub    │ github.com/settings/installations  │
│  View repo             │ "View on GitHub" link              │
└─────────────────────────────────────────────────────────────┘

Last updated: 2026-06-04

अध्याय 37: GitHub Copilot प्रदाता | (मैनुअल का अंत — Index पर वापस जाएँ)

Published: