TobyOnFitnessTech
विश्लेषण पर वापस जाएं
फ़ील्ड रिपोर्ट्स23 मिनट में पढ़ें

एजेंट ब्रीफ: Garmin, WHOOP, Speediance और अन्य के लिए OpenClaw फिटनेस रिपोर्ट कनेक्टर बनाएं

OpenClaw फिटनेस रिपोर्ट कनेक्टर्स को Garmin, WHOOP, Speediance, Cronometer, 8Sleep, सामान्यीकृत JSON स्नैपशॉट्स और सार्वजनिक GitHub रिपॉज़िटरीज़ में बनाने के लिए एक एजेंट-तैयार कार्यान्वयन ब्रीफ।

Toby 3 मई 2026

यह लेख एक AI कोडिंग एजेंट को कार्यान्वयन संक्षिप्त विवरण के रूप में सौंपे जाने के लिए है।

लक्ष्य मेरी निजी मशीन को प्रतिरोपित करना या मेरी फ़ाइलों का रिवर्स-इंजीनियरिंग करना नहीं है। लक्ष्य यह है कि एजेंट इस पृष्ठ को पढ़े और फिटनेस सिस्टम के लिए कार्यशील कनेक्टर बनाए: Garmin, WHOOP, Speediance, Cronometer, 8Sleep, और वैकल्पिक Open Wearables।

मूल निर्देश सरल है: प्रत्येक वेंडर को कनेक्टर के रूप में मानें, सामान्यीकृत JSON स्नैपशॉट को सतत रूप से संग्रहीत करें, और रिपोर्ट जनरेटर को केवल उन स्नैपशॉट्स का उपभोग करने दें। यह पृथक्करण वेंडर-विशिष्ट API की उलझन को एक एजेंट-निर्माण योग्य प्रणाली में बदल देता है।

एजेंट को मेरे सटीक स्थानीय पथों पर निर्भर रहने के बजाय उसी श्रेणी के कनेक्शन बनाने चाहिए:

  • Garmin कार्डियो, प्रशिक्षण भार, गति, हृदय गति क्षेत्र, और गतिविधि विवरण के लिए
  • WHOOP रिकवरी, HRV, RHR, नींद, तनाव, और तत्परता संदर्भ के लिए
  • Speediance शक्ति सत्र इतिहास, मात्रा, कैलोरी, टेम्पलेट, और व्यायाम विवरण के लिए
  • पोषण संदर्भ के लिए Cronometer
  • उपलब्ध होने पर देर से आने वाले नींद संदर्भ के लिए 8Sleep
  • सिंक्स चलाने, डेटा सामान्यीकृत करने, और रिपोर्ट तैयार करने वाले ऑर्केस्ट्रेशन लेयर के रूप में OpenClaw

इसमें GitHub प्रोजेक्ट्स, सार्वजनिक API, डेटा अनुबंध, विफलता मोड, और स्वीकृति जांच भी शामिल है जिनकी एक कार्यान्वयन एजेंट को मेरा निजी रेपो देखे बिना कार्यशील स्टैक बनाने के लिए आवश्यकता होती है।


1. एजेंट कार्य

एक स्थानीय-प्रथम OpenClaw फिटनेस रिपोर्टिंग स्टैक बनाएं जो सिस्टम्स से जुड़ सके, उनके डेटा को सामान्यीकृत कर सके, और रेंडरिंग के दौरान लाइव वेंडर कॉल्स के बिना रिपोर्ट तैयार कर सके।

एजेंट को निम्नलिखित उत्पन्न करना चाहिए:

  1. कनेक्टर स्क्रिप्ट्स
    प्रति सिस्टम एक सिंक जॉब: Garmin, WHOOP, Speediance, Cronometer, और कॉन्फ़िगर किए जाने पर 8Sleep।
  2. कच्चे स्नैपशॉट्स
    वेंडर परिवर्तनों के डिबगिंग के लिए दिनांकित कच्चे JSON या CSV-व्युत्पन्न पेलोड।
  3. सामान्यीकृत अनुबंध
    स्थिर JSON फ़ाइलें जिन पर रिपोर्ट जनरेटर वेंडर पेलोड के बदलने पर भी भरोसा कर सके।
  4. सुबह की रिपोर्ट
    एक रिपोर्ट जो रिकवरी, नींद, तत्परता, प्रशिक्षण भार, पोषण, और दिन की योजना को जोड़ती है।
  5. अनुकूली प्रशिक्षण स्नैपशॉट
    उसी दिन की तत्परता और हाल के भार से प्राप्त दिनांकित Speediance/BJJ/रन योजना।
  6. रात्रिकालीन रिपोर्ट
    योजना-बनाम-वास्तविकता समीक्षा जो यह तुलना करती है कि Garmin, WHOOP, और Speediance वास्तविकता के विरुद्ध क्या सुझाया गया था।
  7. प्रकाशन योग्य आउटपुट
    स्थिर HTML और मशीन-पठनीय JSON जिसे GitHub Pages या किसी अन्य स्थिर होस्ट पर तैनात किया जा सकता है।

इसे "छह API को कॉल करने वाले और लाइव HTML रेंडर करने वाले एक स्क्रिप्ट" के रूप में बनाएं। यह नाज़ुक है।

2. --max-tokens 8192 --no-fallback --system You are a deterministic professional translator. Return only the requested final JSON object. Do not include reasoning or commentary.

वह आर्किटेक्चर जिसे एजेंट को लागू करना चाहिए

इसे चार परतों में बनाएँ:

  1. कनेक्टर परत
    प्रति प्लेटफ़ॉर्म एक समकालिक (sync) जॉब।
  2. सामान्यीकृत डेटा परत
    प्रत्येक समकालिक कार्य स्थिर JSON स्नैपशॉट लिखता है।
  3. विश्लेषण/रिपोर्ट परत
    रिपोर्ट कोड केवल सामान्यीकृत JSON पढ़ता है।
  4. प्रस्तुति परत
    HTML, डैशबोर्ड, दैनिक ब्रीफ़िंग, Telegram पोस्ट, ध्वनि सारांश।

यही पृथक्करण प्रणाली को अनुरक्षणीय (maintainable) बनाता है।

AI कार्यान्वयन अनुबंध

एजेंट, कोई भी डैशबोर्ड UI लिखने से पहले यह अनुबंध बनाएँ:

  • इनपुट: केवल पर्यावरण चर और वेंडर क्रेडेंशियल; स्रोत फ़ाइलों में कभी भी सीक्रेट को हार्ड-कोड न करें।
  • समकालिक आउटपुट: प्रति वेंडर पुल एक कच्चा JSON स्नैपशॉट, साथ ही प्रति वेंडर एक सामान्यीकृत JSON फ़ाइल।
  • रिपोर्ट इनपुट: केवल सामान्यीकृत JSON। रिपोर्ट बिल्डर को Garmin, WHOOP, Speediance, या Cronometer को सीधे कॉल नहीं करना चाहिए।
  • विफलता मोड: यदि कोई एक कनेक्टर विफल हो जाए, तो कल की अंतिम-ज्ञात-अच्छी (last-known-good) सामान्यीकृत फ़ाइल को सुरक्षित रखें और उस स्रोत को रिपोर्ट में पुरानी (stale) के रूप में चिह्नित करें।
  • ऑडिट-योग्यता: वेंडर API परिवर्तनों को डिबग करने के लिए पर्याप्त कच्चे पेलोड रखें, परंतु टोकन, कुकीज़, पासवर्ड, या निजी हेडर को लॉग न करें।
  • भेजने का गेट: ईमेल, ध्वनि, Telegram, और अनुकूली वर्कआउट कार्यों के लिए उसी-दिन के स्कोर किए गए रिकवरी डेटा की आवश्यकता होनी चाहिए। वेब रिपोर्ट अभी भी अवनत (degraded) मोड में बनाई जा सकती है, परंतु प्रणाली को पुरानी रिकवरी के आधार पर आत्मविश्वासपूर्ण कोचिंग नहीं भेजनी चाहिए।
  • योजना स्नैपशॉट: अनुकूली वर्कआउट योजनाओं को कहीं भी भेजने से पहले दैनिक JSON स्नैपशॉट के रूप में लिखा जाना चाहिए। इसके बाद रात्रिकालीन रिपोर्ट योजना की तुलना वास्तव में जो हुआ उससे कर सकती है।

एजेंट-तैयार बिल्ड के लिए न्यूनतम पर्यावरण चर:

GARMIN_EMAIL=
GARMIN_PASSWORD=
WHOOP_CLIENT_ID=
WHOOP_CLIENT_SECRET=
WHOOP_ACCESS_TOKEN=
WHOOP_REFRESH_TOKEN=
SPEEDIANCE_USER_ID=
SPEEDIANCE_TOKEN=
SPEEDIANCE_REGION=Global
CRONOMETER_EXPORT_PATH=
EIGHTSLEEP_EMAIL=
EIGHTSLEEP_PASSWORD=

3. पूर्णता की परिभाषा

एक कार्यान्वयन एजेंट तभी पूर्ण माना जाता है जब ये कलाकृतियाँ (artifacts) मौजूद हों और पुनः उत्पन्न की जा सकें:

  • data/garmin/summary/latest.json
  • data/whoop/normalized/latest.json
  • data/speediance/normalized/history.json
  • data/speediance/normalized/by_exercise.json
  • data/nutrition/latest.json
  • data/eightsleep/normalized/latest.json, यदि 8Sleep कॉन्फ़िगर किया गया है
  • data/training_plans/YYYY-MM-DD_morning.json
  • reports/morning/latest.html
  • reports/nightly/latest.html
  • एक सेंड गेट जो उसी-दिन स्कोर किए गए WHOOP रिकवरी के गायब होने पर ईमेल, वॉइस, टेलीग्राम और अनुकूली वर्कआउट भेजने को रोकता है
  • स्टेल-सोर्स चेतावनियाँ जब कोई कनेक्टर विफल हो जाता है लेकिन कल का अंतिम-ज्ञात-अच्छा सामान्यीकृत डेटा उपलब्ध होता है
  • एक नो-सीक्रेट्स चेक जो साबित करता है कि टोकन, कुकीज़, पासवर्ड और निजी हेडर कमिट नहीं किए गए

यदि एजेंट विकास के दौरान किसी वेंडर के लिए प्रमाणीकरण नहीं कर पाता है, तो उसे फिर भी कनेक्टर इंटरफ़ेस, .env.example, नकली फ़िक्सचर, नॉर्मलाइज़र, स्टेल-सोर्स हैंडलिंग और रिपोर्ट एकीकरण लागू करना चाहिए।


4. सार्वजनिक प्रोजेक्ट और स्रोत संदर्भ

ये वे सार्वजनिक टुकड़े हैं जिन्हें किसी एजेंट को कार्यान्वयन संदर्भ के रूप में उपयोग करना चाहिए।

त्वरित GitHub/API चेकलिस्ट:

OpenClaw

  • प्लेटफ़ॉर्म/ऑर्केस्ट्रेटर: OpenClaw
  • भूमिका: सिंक जॉब शेड्यूल करना, ट्रांसफ़ॉर्मेशन चलाना, रिपोर्ट जनरेट करना, आउटपुट प्रकाशित करना

Garmin

  • प्राथमिक Python क्लाइंट: cyberjunky/python-garminconnect
    GitHub: `https://github.com/cyberjunky/python-garminconnect``
  • लेगसी ऑथ लाइब्रेरी जो पहले मायने रखती थी: matin/garth
    GitHub: `https://github.com/matin/garth``
  • स्थिति नोट: garth अप्रचलित है; python-garminconnect अब नए Garmin ऑथ फ़्लो का उपयोग करता है और यही वह है जिसके आसपास बनाया जाना चाहिए।

WHOOP

  • आधिकारिक डेवलपर API दस्तावेज़: `https://developer.whoop.com/api``
  • सार्वजनिक API सतह: OAuth2 + रिकवरी, साइकल, नींद, वर्कआउट, प्रोफ़ाइल, शारीरिक माप के लिए REST एंडपॉइंट
  • वैकल्पिक सामुदायिक रैपर मौजूद हैं, लेकिन किसी एजेंट-निर्मित कनेक्टर को जहाँ तक संभव हो आधिकारिक WHOOP डेवलपर API पर एंकर करना चाहिए।

Speediance

  • व्यावहारिक सार्वजनिक Speediance कार्यान्वयन संदर्भ: ANPC86/SmartGymWorkoutManager
    GitHub: `https://github.com/ANPC86/SmartGymWorkoutManager``
  • अपस्ट्रीम प्रोजेक्ट वंशावली / मूल सार्वजनिक संदर्भ: hbui3/UnofficialSpeedianceWorkoutManager
    GitHub: `https://github.com/hbui3/UnofficialSpeedianceWorkoutManager``
  • ANPC86 SmartGymWorkoutManager फ़ोर्क को व्यावहारिक कनेक्शन संदर्भ के रूप में उपयोग करें क्योंकि इसमें इतिहास, एक्सपोर्ट, API डिबगिंग, टाइमज़ोन हैंडलिंग और यूनिट हैंडलिंग से जुड़ा उपयोगी कार्य है।
  • यह एक अनौपचारिक Speediance एकीकरण है और इसे डिफ़ॉल्ट रूप से अस्थिर माना जाना चाहिए।

पोषण

  • Cronometer उत्पाद साइट / एक्सपोर्ट / एकीकरण: `https://cronometer.com/``
  • Cronometer को जादुई सीधी रिपोर्ट निर्भरता न मानकर एक संरचित पोषण एक्सपोर्ट स्रोत की तरह मानें।

5. उत्पादन अपडेट जिन्हें एजेंट को संरक्षित करना चाहिए

इस स्टैक के वर्तमान संस्करण में कुछ महत्वपूर्ण व्यवहार हैं जिन्हें एजेंट को संरक्षित करना चाहिए।

एकल स्वामी मशीन

फिटनेस पाइपलाइन के पास एक प्राधिकृत सदैव-चालू मशीन होनी चाहिए। दो अलग-अलग कंप्यूटरों को एक ही आउटपुट रेपो के लिए रिपोर्ट उत्पन्न और तैनात न करने दें। सक्रिय मशीन वेंडर सिंक जॉब्स, रिपोर्ट जनरेशन, अनुकूली वर्कआउट जनरेशन, GitHub Pages पर डिप्लॉयमेंट और वॉचडॉग जाँच का स्वामित्व रखती है।

अन्य मशीनें रिपोर्टें देख सकती हैं या स्थानीय डैशबोर्ड होस्ट कर सकती हैं, लेकिन उन्हें फिटनेस रिपोर्ट पुनः उत्पन्न नहीं करनी चाहिए।

स्टैगर्ड क्रोन अनुमानों के बजाय क्रमिक पाइपलाइन

सुबह और रात्रि की पाइपलाइनों को क्रमित चरणों के रूप में चलना चाहिए:

  1. वेंडर डेटा सिंक करें
  2. आवश्यक समान-दिन डेटा सत्यापित करें
  3. रिपोर्ट उत्पन्न करें
  4. तैनात करें
  5. सूचनाएँ भेजें
  6. वॉइस सारांश उत्पन्न करें, यदि उपयोग किया गया हो
  7. वॉचडॉग सत्यापन चलाएँ

पुरानी गलती यह थी कि उन चरणों को निश्चित वॉल-क्लॉक ऑफ़सेट पर शेड्यूल किया जाता था और उम्मीद की जाती थी कि पिछला चरण पूरा हो गया होगा। बेहतर पैटर्न यह है कि एक ऑर्केस्ट्रेटर हो जो प्रत्येक चरण को तभी चलाए जब पिछला चरण सफलतापूर्वक समाप्त हो।

समान-दिन WHOOP रिकवरी गेट

इस स्टैक के लिए, समान-दिन WHOOP रिकवरी कोचिंग के लिए एक कठोर गेट है। यदि आज की रिकवरी गायब है, तो सिस्टम अभी भी पुराने-स्रोत चेतावनियों के साथ वेब रिपोर्ट प्रकाशित कर सकता है, लेकिन उसे ईमेल, वॉइस, टेलीग्राम कोचिंग और अनुकूली वर्कआउट भेजने से रोकना चाहिए।

वह एक नियम सबसे बुरे विफलता मोड को रोकता है: कल की रिकवरी पर आधारित एक विश्वसनीय दिखने वाली सिफारिश।

8Sleep विलंबित-डेटा हैंडलिंग

8Sleep पहले सुबह रन के बाद भी अपडेट हो सकता है। पुनः रन को पुनः उत्पन्न करने से पहले आज और कल को बलपूर्वक रिफ्रेश करना चाहिए, बजाय इसके कि केवल इसलिए कि एक मौजूदा स्थानीय JSON फ़ाइल है, उस पर भरोसा किया जाए।

केवल वास्तविक Garmin HR ज़ोन

औसत हृदय गति से हृदय गति क्षेत्र वितरण का अनुमान न लगाएं। यदि Garmin गतिविधि विवरण में टाइम-इन-ज़ोन डेटा शामिल है, तो इसका उपयोग करें। यदि ऐसा नहीं है, तो उस चार्ट को छिपा दें या अनुपलब्ध के रूप में चिह्नित करें।

योजना निष्पादन समीक्षा

रात्रि रिपोर्ट अब बेहतर काम करती है जब यह दिन की योजना की तुलना दिन के वास्तविक डेटा से करती है:

  • नियोजित BJJ बनाम WHOOP BJJ वर्कआउट
  • नियोजित Speediance सत्र बनाम पूर्ण किए गए Speediance सत्र
  • नियोजित रन बनाम Garmin रन दूरी
  • नियोजित कदम बनाम Garmin कदम

यह रात्रि रिपोर्ट को केवल सारांश के बजाय एक फीडबैक लूप में बदल देता है।

ओपन वियरेबल्स शैडो मोड

ओपन वियरेबल्स भविष्य के अमूर्तता परत के रूप में उपयोगी है, लेकिन मैं एक काम करने वाली व्यक्तिगत रिपोर्ट प्रणाली को एक साथ पूरी तरह से स्विच नहीं करूंगा। सुरक्षित माइग्रेशन शैडो मोड है:

  1. मौजूदा फ़ाइल-आधारित पाइपलाइन को अधिकृत रखें
  2. Garmin/WHOOP डेटा को ओपन वियरेबल्स में आयात या मिरर करें
  3. ओपन वियरेबल्स डेटा को वापस शैडो JSON फ़ाइलों में निर्यात करें
  4. शैडो फ़ाइलों की तुलना प्रोडक्शन फ़ाइलों से करें
  5. केवल काउंट, तिथियां और उसी दिन के रिकॉर्ड मेल खाने के बाद ही प्रचारित करें

पायलट के दौरान शैडो फ़ाइलें कभी भी प्रोडक्शन इनपुट को अधिलेखित नहीं करनी चाहिए।


6. Garmin: कार्डियो और गतिविधि-विवरण परत

यदि WHOOP उत्तर देता है "मैं कितना रिकवर हुआ?", तो Garmin उत्तर देता है "मैंने वास्तव में क्या किया?"

Garmin वह जगह है जहां रिपोर्ट मिलती है:

  • दूरी
  • गति और रफ्तार
  • अवधि
  • औसत और अधिकतम हृदय गति
  • हृदय गति क्षेत्र
  • कैडेंस
  • शक्ति
  • प्रशिक्षण प्रभाव
  • गतिविधि मेटाडेटा
  • व्यापक कार्डियो/प्रशिक्षण विवरण जिसे WHOOP उतने समृद्ध रूप से महत्व नहीं देता

उपयोग करने के लिए सार्वजनिक रेपो

अनुशंसित: cyberjunky/python-garminconnect

GitHub: https://github.com/cyberjunky/python-garminconnect

यह क्यों महत्वपूर्ण है:

  • यह सक्रिय रूप से उपयोग के लिए Garmin कनेक्ट पायथन रैपर के रूप में स्थित है
  • यह एक बहुत बड़ी Garmin एंडपॉइंट सतह को उजागर करता है
  • इसमें उदाहरण और टोकन हैंडलिंग पैटर्न शामिल हैं
  • इसने पुराने auth अनुमानों को बदल दिया जो पूर्व Garmin परिवर्तनों में टूट गए थे

महत्वपूर्ण Garmin संगतता नोट

ऐतिहासिक रूप से, कई बिल्ड्स ने garth का उपयोग किया।

GitHub: https://github.com/matin/garth

लेकिन garth अब स्पष्ट रूप से अप्रचलित है। यह महत्वपूर्ण है क्योंकि एक एजेंट को अप्रचलित auth पर नए कार्यान्वयन को केंद्रित नहीं करना चाहिए।

न्यूनतम निष्पादन योग्य Garmin उदाहरण

from garminconnect import Garmin
from datetime import date
from pathlib import Path
import json
import os

email = os.environ["GARMIN_EMAIL"]
password = os.environ["GARMIN_PASSWORD"]

client = Garmin(email=email, password=password)
client.login()

python
today = date.today().isoformat()
stats = client.get_stats(today)
activities = client.get_activities_by_date(today, today)

payload = {
    "date": today,
    "stats": stats,
    "activities": activities,
}

out = Path("data/garmin/raw")
out.mkdir(parents=True, exist_ok=True)
(out / f"{today}.json").write_text(json.dumps(payload, indent=2))

Garmin से क्या सामान्यीकृत करें

कच्चे Garmin पेलोड को सीधे अपनी अंतिम रिपोर्ट लॉजिक में न डालें। पहले उन्हें इन जैसे फ़ील्ड्स में सामान्यीकृत करें:

  • calendarDate
  • totalSteps
  • restingHeartRate
  • sleepingSeconds
  • bodyBattery
  • activityName
  • activityType
  • durationSeconds
  • distanceMeters
  • distanceMiles
  • averageHR
  • maxHR
  • calories
  • trainingEffect
  • cadence
  • power

अनुशंसित संग्रहण पैटर्न

  • data/garmin/raw/YYYY-MM-DD.json
  • data/garmin/normalized/YYYY-MM-DD.json
  • data/garmin/summary/latest.json

यह आपको रीप्ले क्षमता और तेज़ रिपोर्ट पहुँच दोनों देता है।


7. WHOOP: रिकवरी और तत्परता परत

WHOOP वह है जो रिपोर्ट्स को केवल गतिविधि लॉग के बजाय एक निर्णय इंजन के रूप में उपयोगी बनाता है।

यह योगदान देता है:

  • रिकवरी स्कोर
  • HRV
  • विश्राम हृदय गति
  • नींद प्रदर्शन
  • स्ट्रेन
  • चक्र संदर्भ
  • सुबह और रात की सिफ़ारिशों के लिए तत्परता फ्रेमिंग

उपयोग करने के लिए सार्वजनिक API

आधिकारिक WHOOP डेवलपर API का उपयोग करें:

प्रासंगिक एंडपॉइंट समूह:

  • /developer/v2/cycle
  • /developer/v2/recovery
  • /developer/v2/activity/sleep
  • /developer/v2/activity/workout
  • /developer/v2/user/profile/basic
  • /developer/v2/user/measurement/body

महत्वपूर्ण सीमा

सबसे महत्वपूर्ण कार्यान्वयन निष्कर्षों में से एक: जर्नल डेटा WHOOP API से उपलब्ध नहीं है

यदि आप जर्नल उत्तर या आदत एनोटेशन चाहते हैं, तो आप इसके लिए सार्वजनिक WHOOP API एंडपॉइंट पर निर्भर नहीं रह सकते। व्यावहारिक विकल्प हैं:

  • WHOOP से मैनुअल CSV निर्यात
  • आपकी अपनी समानांतर जर्नलिंग परत
  • सिंक के बाद आप जो अलग मेटाडेटा जोड़ते हैं

इस सीमा को लेख में स्पष्ट रूप से बताया जाना चाहिए क्योंकि यह किसी भी गंभीर बिल्ड को प्रभावित करती है।

न्यूनतम निष्पादन योग्य WHOOP उदाहरण

from pathlib import Path
import json
import os
import requests

BASE = "https://api.prod.whoop.com/developer/v2"
TOKEN = os.environ["WHOOP_ACCESS_TOKEN"]
headers = {"Authorization": f"Bearer {TOKEN}"}

def get(path):
    response = requests.get(f"{BASE}{path}", headers=headers, timeout=30)
    response.raise_for_status()
    return response.json()

payload = {
    "recovery": get("/recovery"),
    "sleep": get("/activity/sleep"),
    "workouts": get("/activity/workout"),
}

python
out = Path("data/whoop/raw")
out.mkdir(parents=True, exist_ok=True)
(out / "latest.json").write_text(json.dumps(payload, indent=2))

WHOOP से क्या सामान्यीकृत (normalize) करें

इन फ़ील्ड्स में सामान्यीकृत करें:

  • recovery_score
  • hrv_rmssd_milli
  • resting_heart_rate
  • spo2_percentage
  • skin_temp_celsius
  • sleep_performance_percentage
  • respiratory_rate
  • strain
  • cycle_start
  • cycle_end
  • workout_sport_name

अनुशंसित स्टोरेज पैटर्न

  • data/whoop/raw/recovery.json
  • data/whoop/raw/sleep.json
  • data/whoop/raw/workouts.json
  • data/whoop/normalized/latest.json

8. Speediance: स्ट्रेंथ-ट्रेनिंग लेयर

Speediance इस पूरे स्टैक में सबसे असामान्य कनेक्टर है।

Garmin और WHOOP के विपरीत, यह एक स्वच्छ आधिकारिक सार्वजनिक डेवलपर प्लेटफ़ॉर्म नहीं है। एजेंट को इन सार्वजनिक रिपॉज़ को कनेक्शन संदर्भ (reference) के रूप में उपयोग करना चाहिए:

सार्वजनिक एक्सट्रैक्शन/संदर्भ: https://github.com/clawdassistant85-netizen/speediance-smartgym-workout-manager

ANPC86/SmartGymWorkoutManager
GitHub: https://github.com/ANPC86/SmartGymWorkoutManager

वह रिपॉ मूल सार्वजनिक Speediance प्रोजेक्ट का स्वयं का एक व्यक्तिगत फ़ोर्क/Continuation है:

hbui3/UnofficialSpeedianceWorkoutManager
GitHub: https://github.com/hbui3/UnofficialSpeedianceWorkoutManager

ये रिपॉज़ महत्वपूर्ण शुरुआती बिंदु हैं क्योंकि ये दिखाते हैं कि कैसे:

  • Speediance एंडपॉइंट्स के विरुद्ध प्रमाणीकरण (authenticate) करें
  • वर्कआउट डेटा और API प्रतिक्रियाओं का निरीक्षण करें
  • ट्रेनिंग इतिहास ब्राउज़/एक्सपोर्ट करें
  • डेस्कटॉप-अनुकूल तरीके से टेम्पलेट्स/वर्कआउट्स प्रबंधित करें
  • टाइमज़ोन डिस्प्ले और इम्पीरियल/मेट्रिक वेट हैंडलिंग जैसी व्यावहारिक समस्याओं को संभालें

ये रिपॉज़ क्यों मायने रखते हैं

Speediance इंटीग्रेशन पैटर्न के लिए व्यावहारिक आधार के रूप में ANPC86 SmartGymWorkoutManager फ़ोर्क का उपयोग करें, जबकि प्रोवेनेंस के लिए hbui3 अपस्ट्रीम संदर्भ को सुरक्षित रखें। साथ में, ये आधिकारिक ऐप के बाहर Speediance डेटा के साथ काम करने के लिए सबसे स्पष्ट सार्वजनिक संदर्भ हैं।

स्थिरता चेतावनी

मूल प्रोजेक्ट नोट करता है कि Speediance सुरक्षा अपग्रेड लागू कर रहा है। इसका मतलब है:

  • यह इंटीग्रेशन टूट सकता है
  • हेडर और प्रमाणीकरण व्यवहार बदल सकते हैं
  • एंडपॉइंट्स स्थानांतरित हो सकते हैं
  • आपको इस कनेक्टर को सामान्यीकरण (normalization) चरण के पीछे अलग-थलग रखना चाहिए ताकि आपकी रिपोर्ट्स वेंडर-साइड बदलावों से बची रहें

Speediance के लिए न्यूनतम निष्पादन योग्य पैटर्न

यदि आप अपने शुरुआती बिंदु के रूप में ANPC86/SmartGymWorkoutManager का उपयोग करते हैं, जबकि मूल संदर्भ के लिए hbui3/UnofficialSpeedianceWorkoutManager अपस्ट्रीम की जाँच करते हैं, तो स्वच्छ दृष्टिकोण है:

  1. इसके ऐप या क्लाइंट लेयर को स्थानीय रूप से चलाएँ
  2. अपने Speediance खाते से प्रमाणित हों
  3. इसके द्वारा उजागर API तरीकों से वर्कआउट इतिहास प्राप्त करें

सामान्यीकृत JSON को अपनी डेटा डायरेक्टरी में निर्यात करें

उस क्लाइंट पैटर्न का उपयोग करते हुए उदाहरण:

# इसको api_client.py के अनुसार आकार दें:
# https://github.com/clawdassistant85-netizen/speediance-smartgym-workout-manager
from api_client import SpeedianceClient
from datetime import date
from pathlib import Path
import json
import os

client = SpeedianceClient()
success, msg, debug = client.login(
    os.environ["SPEEDIANCE_USER_ID"],
    os.environ["SPEEDIANCE_TOKEN"],
)
if not success:
    raise RuntimeError(msg)

start_date = os.environ.get("SPEEDIANCE_START_DATE", "2026-01-01")
end_date = date.today().isoformat()
records = client.get_training_data(start_date, end_date)

out = Path("data/speediance/raw")
out.mkdir(parents=True, exist_ok=True)
(out / "history.json").write_text(json.dumps(records, indent=2))

Speediance से क्या सामान्यीकृत करें

इन जैसे फ़ील्ड्स में सामान्यीकृत करें:

  • training_id
  • date
  • title
  • duration_seconds
  • calories
  • total_volume
  • exercise_count
  • template_name
  • planned_duration
  • actual_duration
  • exercise_breakdown
  • estimated_1rm

सर्वोत्तम-अभ्यास डेटा मॉडल

एक गंभीर रिपोर्ट सिस्टम के लिए, दो इंडेक्स रखें:

  1. bySession
  • प्रत्येक पूर्ण किए गए वर्कआउट के लिए एक रिकॉर्ड
  1. byExercise
  • प्रत्येक मूवमेंट नाम के लिए एक रिकॉर्ड स्ट्रीम
  • इसमें वेट, रेप्स, साइड, सेशन आईडी, टाइमस्टैम्प शामिल हैं

यह संरचना बाद में प्रोग्रेशन चार्ट और PR पहचान को आसान बनाती है।

अनुशंसित स्टोरेज पैटर्न

  • data/speediance/raw/monthly/YYYY-MM.json
  • data/speediance/normalized/history.json
  • data/speediance/normalized/by_exercise.json
  • data/speediance/dashboard/latest.json

अनुकूली Speediance वर्कआउट स्नैपशॉट्स

इस बिल्ड का अधिक उन्नत संस्करण केवल पूर्ण किए गए Speediance वर्कआउट को ही नहीं पढ़ता है। यह लाइव तत्परता डेटा से नियोजित वर्कआउट भी बनाता है।

उपयोगी पैटर्न यह है:

  1. उसी दिन का WHOOP रिकवरी, वर्तमान स्ट्रेन, BJJ स्ट्रेन, Garmin बॉडी बैटरी, विश्राम हृदय गति, हाल का रनिंग लोड, मौसम, और हाल का Speediance प्लान इतिहास लोड करें।
  2. दिन को build, maintain, recover, protect, या post_bjj_brutal जैसे बकेट में वर्गीकृत करें।
  3. पूरे वर्कआउट के लिए एक Speediance उपकरण चुनें, आमतौर पर हैंडल्स, बारबेल, या रस्सी।
  4. मुख्य Speediance वर्कआउट के लिए केवल ऑन-डिवाइस एक्सरसाइज़ चुनें।
  5. जब रिकवरी सहायता दे, तभी शून्य से दो ऑफ-Speediance एक्सेसरीज़ जोड़ें।
  6. प्लान को data/training_plans/YYYY-MM-DD_context.json पर लिखें।
  7. सुबह की सिफारिश और रात्रि प्लान-निष्पादन समीक्षा दोनों के लिए इस स्नैपशॉट का उपयोग करें।

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


9. Cronometer: पोषण संदर्भ परत

आप जो भी सटीक पोषण ऐप इस्तेमाल करें, भूमिका वही है: ऊर्जा सेवन के लिए रिपोर्ट को संदर्भ देना।

यह महत्वपूर्ण है क्योंकि पोषण संदर्भ के बिना प्रशिक्षण भार गलत निष्कर्षों की ओर ले जाता है।

रिपोर्ट यह पूछने में सक्षम होनी चाहिए:

  • क्या रिकवरी कम थी क्योंकि प्रशिक्षण भार अधिक था?
  • या क्योंकि नींद खराब थी और कैलोरी सेवन कम था?
  • क्या एथलीट आउटपुट की तुलना में कम ईंधन वाला था?

व्यावहारिक निर्माण सलाह

रेंडर के समय लाइव पोषण API पर निर्भर न रहें। इनमें से एक का उपयोग करें:

  • CSV निर्यात
  • webhook अंतर्ग्रहण
  • सामान्यीकृत JSON में निर्धारित सिंक

इन जैसे फ़ील्ड्स में सामान्यीकृत करें:

  • calories_consumed
  • protein_g
  • carbs_g
  • fat_g
  • fiber_g
  • target_calories
  • estimated_deficit

अनुशंसित भंडारण पैटर्न

  • data/nutrition/raw/YYYY-MM-DD.csv
  • data/nutrition/normalized/YYYY-MM-DD.json
  • data/nutrition/latest.json

10. 8Sleep: देर से आने वाली नींद संदर्भ परत

8Sleep वैकल्पिक है, लेकिन यदि यह कॉन्फ़िगर किया गया है तो एजेंट को इसे हर अन्य कनेक्टर की तरह मानना चाहिए: पहले सिंक, दूसरा सामान्यीकरण, अंत में फ़ाइलों से रेंडर।

महत्वपूर्ण व्यवहार देर से डेटा प्रबंधन है। पहली सुबह की रन के बाद नींद का डेटा बदल सकता है, इसलिए रिपोर्ट को पुनः जनरेट करने से पहले मैनुअल पुनः रन या निर्धारित पुनः प्रयास को आज और कल दोनों को बल-रिफ्रेश करना चाहिए।

इन जैसे फ़ील्ड्स को सामान्यीकृत करें:

  • sleep_score
  • sleep_start
  • sleep_end
  • time_in_bed_seconds
  • time_asleep_seconds
  • hrv
  • resting_heart_rate
  • temperature_adjustments
  • away_mode

अनुशंसित भंडारण पैटर्न:

  • data/eightsleep/raw/YYYY-MM-DD.json
  • data/eightsleep/normalized/YYYY-MM-DD.json
  • data/eightsleep/normalized/latest.json

11. इस स्टैक में OpenClaw वास्तव में क्या करता है

OpenClaw डेटा स्रोत नहीं है। यह समन्वय और तर्क परत है।

इसका काम है:

  • निर्धारित समय पर सिंक जॉब्स चलाना
  • स्थिर आउटपुट संग्रहीत करना
  • स्रोतों की तुलना करना
  • रिपोर्ट HTML जनरेट करना
  • लिंक प्रकाशित करना
  • सामान्यीकृत डेटा से मानव-अनुकूल सारांश तैयार करना

इसका मतलब है कि रिपोर्टिंग कोड को इन जैसी फ़ाइलों से पढ़ना चाहिए:

  • data/garmin/summary/latest.json
  • data/whoop/normalized/latest.json
  • data/speediance/normalized/history.json
  • data/nutrition/latest.json
  • data/eightsleep/normalized/latest.json

रिपोर्ट जनरेटर को कभी भी यह जानने की आवश्यकता नहीं होनी चाहिए कि Garmin auth कैसे काम करता है या इस सप्ताह Speediance हेडर कैसे बदले।


12. --max-tokens 8192 --no-fallback --system आप एक निर्धारक पेशेवर अनुवादक हैं। केवल अनुरोधित अंतिम JSON ऑब्जेक्ट लौटाएँ। तर्क या टिप्पणी शामिल न करें।

एजेंट-निर्माण योग्य निर्देशिका संरचना

यह एक ऐसी संरचना है जिसे कोई एजेंट किसी भी वास्तविक विक्रेता प्रमाणीकरण के सफल होने से पहले बना सकता है:

project/
  data/
    garmin/
      raw/
      normalized/
      summary/
    whoop/
      raw/
      normalized/
    speediance/
      raw/
      normalized/
      dashboard/
    nutrition/
      raw/
      normalized/
    eightsleep/
      raw/
      normalized/
    training_plans/
  scripts/
    sync_garmin.py
    sync_whoop.py
    sync_speediance.py
    sync_nutrition.py
    sync_eightsleep.py
    gate_same_day_recovery.py
    build_adaptive_plan.py
    build_report.py
  reports/
    morning/
      latest.html
    nightly/
      latest.html
  frontend/
    data/

फ़ाइल संरचना इंटरफ़ेस का हिस्सा है। इसे इतना सरल और साफ़ बनाएँ कि कोई भविष्य का एजेंट सिस्टम का निरीक्षण कर सके, हर कनेक्टर को ढूँढ सके, किसी एक सिंक को फिर से चला सके, और कच्चे (raw) पेलोड की तुलना सामान्यीकृत (normalized) आउटपुट से कर सके।


13. उदाहरण रिपोर्ट बिल्डर पैटर्न

जब एक बार हर कनेक्टर सामान्यीकृत JSON लिख देता है, तो असली रिपोर्ट कोड सरल हो जाता है।

import json
from pathlib import Path

base = Path("data")

garmin = json.loads((base / "garmin/summary/latest.json").read_text())
whoop = json.loads((base / "whoop/normalized/latest.json").read_text())
speediance = json.loads((base / "speediance/normalized/history.json").read_text())
nutrition = json.loads((base / "nutrition/latest.json").read_text())
eightsleep_path = base / "eightsleep/normalized/latest.json"
eightsleep = json.loads(eightsleep_path.read_text()) if eightsleep_path.exists() else {}

summary = {
    "recovery": whoop.get("recovery_score"),
    "hrv": whoop.get("hrv_rmssd_milli"),
    "rhr": whoop.get("resting_heart_rate"),
    "steps": garmin.get("totalSteps"),
    "body_battery": garmin.get("bodyBattery"),
    "lifting_volume": speediance.get("today", {}).get("total_volume"),
    "calories_in": nutrition.get("calories_consumed"),
    "sleep_score": eightsleep.get("sleep_score"),
}

html = f"""
<html>
  <body>
    <h1>Daily Fitness Report</h1>
    <ul>
      <li>Recovery: {summary['recovery']}</li>
      <li>HRV: {summary['hrv']}</li>
      <li>RHR: {summary['rhr']}</li>
      <li>Steps: {summary['steps']}</li>
      <li>Body Battery: {summary['body_battery']}</li>
      <li>Lifting Volume: {summary['lifting_volume']}</li>
      <li>Calories In: {summary['calories_in']}</li>
      <li>8Sleep Score: {summary['sleep_score']}</li>
    </ul>
  </body>
</html>
"""

out = Path("reports/morning")
out.mkdir(parents=True, exist_ok=True)
(out / "latest.html").write_text(html)

यहीं पर पूरे डिज़ाइन की सार्थकता सामने आती है: एक बार जब सिंक परत (sync layer) ठीक-ठाक हो जाती है, तो रिपोर्ट परत (report layer) सर्वोत्तम संभव तरीके से सीधी-सादी हो जाती है।


14. हर कनेक्टर वास्तव में किसके लिए है

यह सबसे सरल मानसिक मॉडल है:

WHOOP

इसके लिए उपयोग करें:

  • रिकवरी
  • HRV
  • RHR
  • नींद का प्रदर्शन
  • स्ट्रेन
  • तत्परता की रूपरेखा

Garmin

इसके लिए उपयोग करें:

  • दौड़ने और कार्डियो का विवरण
  • गति, शक्ति, कैडेंस
  • HR ज़ोन
  • प्रशिक्षण प्रभाव
  • विस्तृत गतिविधि इतिहास

Speediance

इसके लिए उपयोग करें:

  • शक्ति वर्कआउट इतिहास
  • कुल मात्रा
  • व्यायाम विवरण
  • नियोजित बनाम वास्तविक सत्र निष्पादन
  • यदि आप व्यायाम-दर-व्यायाम अनुक्रमण बनाते हैं तो गति-स्तर की प्रगति

Nutrition app

इसके लिए उपयोग करें:

  • कैलोरी सेवन
  • मैक्रो संदर्भ
  • अपर्याप्त ईंधन का पता लगाना

8Sleep

इसके लिए उपयोग करें:

  • देर से आने वाली नींद का विवरण
  • बिस्तर-विशिष्ट नींद अवधि और स्कोर
  • WHOOP और Garmin के विरुद्ध नींद-संदर्भ क्रॉस-चेक

OpenClaw फिर उन सभी को एक रिपोर्ट और सिफारिश सतह में संयोजित करता है।


15. सिस्टम द्वारा कनेक्शन डिलीवरेबल्स

यह वह चेकलिस्ट है जिसे रिपोर्ट UI को पॉलिश करने से पहले कार्यान्वयन एजेंट को पूरा करना चाहिए।

Garmin कनेक्शन पॉइंट्स

  • लाइब्रेरी: cyberjunky/python-garminconnect से garminconnect
  • प्रमाणीकरण: लाइब्रेरी के टोकन/सत्र प्रबंधन के साथ Garmin कनेक्ट ईमेल/पासवर्ड
  • पुल कैडेंस: दैनिक सुबह सिंक प्लस वैकल्पिक वर्कआउट-के-बाद सिंक
  • न्यूनतम पुल:
    • कदम, विश्राम हृदय गति, नींद सेकंड, बॉडी बैटरी, कैलोरी के लिए दैनिक आँकड़े
    • दौड़/सवारी/कार्डियो सत्रों के लिए तिथि अनुसार गतिविधियाँ
    • HR ज़ोन, गति, कैडेंस, शक्ति, प्रशिक्षण प्रभाव के लिए उपलब्ध होने पर गतिविधि विवरण
  • सामान्यीकृत आउटपुट: data/garmin/summary/latest.json

WHOOP कनेक्शन पॉइंट्स

  • API दस्तावेज़: https://developer.whoop.com/api
  • प्रमाणीकरण: OAuth2 एक्सेस टोकन + रिफ्रेश टोकन फ्लो
  • बेस URL: https://api.prod.whoop.com/developer/v2
  • न्यूनतम एंडपॉइंट समूह:
    • स्ट्रेन/साइकल संदर्भ के लिए /cycle
    • रिकवरी स्कोर, HRV, विश्राम हृदय गति के लिए /recovery
    • नींद के प्रदर्शन और नींद के समय के लिए /activity/sleep
    • वर्कआउट और WHOOP स्ट्रेन डेटा के लिए /activity/workout
    • ज़रूरत पड़ने पर प्रोफ़ाइल/शरीर संदर्भ के लिए /user/profile/basic और /user/measurement/body
  • सामान्यीकृत आउटपुट: data/whoop/normalized/latest.json

Speediance कनेक्शन पॉइंट्स

  • इस बिल्ड के लिए सार्वजनिक निष्कर्षण: https://github.com/clawdassistant85-netizen/speediance-smartgym-workout-manager
  • अपस्ट्रीम संदर्भ: https://github.com/hbui3/UnofficialSpeedianceWorkoutManager
  • प्रमाणीकरण: SmartGym क्लाइंट लेयर द्वारा उजागर अनौपचारिक टोकन/उपयोगकर्ता-आईडी आधारित फ्लो
  • न्यूनतम पुल:
    • वर्कआउट इतिहास
    • व्यायाम/सत्र विवरण
    • यदि आप नियोजित-बनाम-वास्तविक रिपोर्टिंग चाहते हैं तो कस्टम वर्कआउट/टेम्पलेट मेटाडेटा
    • बिना गोपनीय जानकारी के रॉ API/डिबग प्रतिक्रिया कैप्चर
  • सामान्यीकृत आउटपुट:
    • data/speediance/normalized/history.json
    • data/speediance/normalized/by_exercise.json

Cronometer कनेक्शन पॉइंट्स

  • सार्वजनिक स्रोत: https://cronometer.com/ exports/integrations
  • अनुशंसित कार्यान्वयन दृष्टिकोण: CSV एक्सपोर्ट या शेड्यूल्ड फ़ाइल ड्रॉप, लाइव रेंडर-टाइम API निर्भरता नहीं
  • न्यूनतम फ़ील्ड्स: दिनांक, कैलोरी, प्रोटीन, कार्ब्स, फैट, फाइबर, और रिकवरी विश्लेषण में चाहे गए कोई भी माइक्रोन्यूट्रिएंट्स
  • सामान्यीकृत आउटपुट: data/nutrition/latest.json

8Sleep कनेक्शन पॉइंट्स

  • प्रमाणीकरण: एनवायरनमेंट-बैक्ड लॉगिन/सेशन फ्लो, स्रोत में कोई क्रेडेंशियल नहीं
  • पुल कैडेंस: सुबह सिंक के साथ-साथ आज और कल के लिए रीरन/रिफ्रेश सपोर्ट
  • न्यूनतम पुल:
    • स्लीप स्कोर
    • स्लीप टाइमिंग
    • सोए हुए समय और बिस्तर में बिताया गया समय
    • उपलब्ध होने पर HRV और रेस्टिंग HR
    • उपलब्ध होने पर तापमान और अवे-मोड संदर्भ
  • सामान्यीकृत आउटपुट: data/eightsleep/normalized/latest.json

रिपोर्ट-जनरेशन कनेक्शन पॉइंट

रिपोर्ट बिल्डर को केवल स्थिर सामान्यीकृत फ़ाइलें और प्लान स्नैपशॉट्स पढ़ने चाहिए। एक व्यावहारिक आकार यह है:

data/garmin/summary/latest.json
data/whoop/normalized/latest.json
data/speediance/normalized/history.json
data/speediance/normalized/by_exercise.json
data/nutrition/latest.json
data/eightsleep/normalized/latest.json
data/training_plans/YYYY-MM-DD_morning.json
data/training_plans/YYYY-MM-DD_post_bjj.json

यह वास्तविक कनेक्शन सतह है। अपस्ट्रीम की हर चीज़ टूट सकती है और स्वतंत्र रूप से ठीक की जा सकती है।


16. असली कार्यान्वयन नियम

यदि कोई एजेंट इसे सफलतापूर्वक बनाने जा रहा है, तो ये नियम किसी भी एक कोड स्निपेट से अधिक महत्वपूर्ण हैं:

  1. हर वेंडर को अपने स्वयं के स्कीमा में सामान्यीकृत करें
    किसी भी रिपोर्ट को वेंडर पेलोड शेप पर निर्भर न होने दें।

  2. रॉ स्नैपशॉट्स रखें
    जब कोई सिंक टूटता है, तो रॉ पेलोड्स आपको बचाते हैं।

  3. यदि रिपोर्ट समय-संवेदनशील है तो लाइव API से कभी रेंडर न करें
    पहले सिंक करें, फिर रेंडर करें।

  4. अनौपचारिक इंटीग्रेशन को डिस्पोज़ेबल एडाप्टर मानें
    विशेष रूप से Speediance।

  5. Garmin और WHOOP को एक-दूसरे की पूरक बनाएं, प्रतिस्पर्धी नहीं
    WHOOP = रेडिनेस। Garmin = एक्ज़िक्यूशन डिटेल।

  6. स्ट्रेंथ डेटा को सत्र और व्यायाम दोनों स्तरों पर मॉडल करें
    अन्यथा प्रोग्रेशन रिपोर्टिंग उथली रहती है।

  7. कोचिंग को कल की नहीं, आज की रेडिनेस पर गेट करें
    समान-दिवस रिकवरी गायब होने पर सिस्टम को केवल वेब-रिपोर्टिंग तक डिग्रेड करना चाहिए।

  8. दिन का न्याय करने से पहले प्लान सेव करें
    एक रात्रिकालीन अनुपालन स्कोर तभी काम करता है जब सुबह या पोस्ट-BJJ प्लान को डेटा के रूप में स्टोर किया गया हो।

  9. नए बैकएंड्स को शैडो मोड में पायलट करें
    Open Wearables या कोई अन्य एब्स्ट्रैक्शन लेयर को स्रोत का सत्य बनने से पहले यह साबित करना चाहिए कि वह वर्तमान प्रोडक्शन फ़ाइलों से मेल खा सकती है।

--- --max-tokens 8192 --no-fallback --system You are a deterministic professional translator. Return only the requested final JSON object. Do not include reasoning or commentary.

अंतिम कार्यान्वयन संदर्भ सूची

ये वे सार्वजनिक संदर्भ हैं जो इस सिस्टम को लागू करते समय AI कोडिंग एजेंट को सबसे पहले दिए जाने चाहिए:

यदि आप यह लेख Claude Code, Codex, OpenClaw, या किसी अन्य कार्यान्वयन एजेंट को सौंप रहे हैं, तो सही निर्देश यह है: पहले कनेक्टर बनाएँ, दूसरा सामान्यीकृत JSON स्नैपशॉट लिखें, तीसरा उसी-दिन की रिकवरी गेट लागू करें, और अंत में रिपोर्ट रेंडरर बनाएँ। अंतिम HTML रिपोर्ट डिज़ाइन करके शुरू न करें।

#openclaw#garmin#whoop#speediance#फिटनेस रिपोर्ट्स#एआई सिस्टम