{
  "schemaVersion": "1.0",
  "item": {
    "slug": "habit-ai",
    "name": "Habit AI",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/habitclaw/habit-ai",
    "canonicalUrl": "https://clawhub.ai/habitclaw/habit-ai",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/habit-ai",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=habit-ai",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/api.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/habit-ai"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/habit-ai",
    "agentPageUrl": "https://openagent3.xyz/skills/habit-ai/agent",
    "manifestUrl": "https://openagent3.xyz/skills/habit-ai/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/habit-ai/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Habit AI",
        "body": "Track health and nutrition through the Habit AI REST API."
      },
      {
        "title": "Setup (100% Free)",
        "body": "Habit AI is a completely free service — no subscription, no credit card, no usage limits.\n\nCreate a free account at https://habitapp.ai (or download the free iOS app)\nGo to Settings → API Keys → Create Key (free, up to 5 keys)\nStore key in environment: export HABITAI_API_KEY=\"hab_...\"\n\nAll requests use:\n\nBase URL: https://habitapp.ai/api/v1\nAuth header: Authorization: Bearer $HABITAI_API_KEY\nContent-Type: application/json"
      },
      {
        "title": "Quick Reference",
        "body": "ActionMethodEndpointLog a mealPOST/mealsToday's mealsGET/meals?date=YYYY-MM-DDDaily nutritionGET/nutrition/daily?date=YYYY-MM-DDWeekly nutritionGET/nutrition/weekly?date=YYYY-MM-DDLog water (ml)POST/waterLog weight (kg)POST/weightLog stepsPOST/stepsLog meditationPOST/meditationJournal entryPOST/journalAI eating coachPOST/coaches/eatingAI mindfulness coachPOST/coaches/mindfulnessAI meditation coachPOST/coaches/meditationGet profileGET/profileUpdate profilePUT/profile\n\nFor full endpoint details (request/response schemas, all parameters), see references/api.md."
      },
      {
        "title": "⚠️ CRITICAL: Use the AI model to analyze food, then POST /meals with the EXACT structure below",
        "body": "Do NOT call /analyze/food-image or /analyze/meal-description — instead, use your own vision/language capabilities to analyze the food, then construct the exact JSON structure below and POST it to /meals."
      },
      {
        "title": "Step 0: Check user profile for allergens/diet",
        "body": "Before analyzing, call GET /profile to check foodSensitivities and diet fields. Factor these into:\n\nhealthScore — lower the score if the meal contains ingredients the user is sensitive to\nhealthScoreExplanation — mention the general nutritional pros/cons\nhealthSensitivityExplanation — if the meal contains any of the user's allergens/sensitivities, explain which ingredients are problematic and why. Leave empty string if no sensitivities match."
      },
      {
        "title": "Step 1: Analyze the food yourself",
        "body": "For photos: Look at the image and identify each ingredient, estimate portions, and calculate nutrition using USDA data.\n\nFor descriptions: Parse the meal description and calculate nutrition the same way."
      },
      {
        "title": "Step 2: POST /meals with the EXACT structure",
        "body": "Every field matters. iOS reads from nutritionalSummary (nested object) — if it's missing, meals show as 0 calories.\n\n{\n  \"mealName\": \"Grilled Chicken Salad with Ranch\",\n  \"calories\": 520,\n  \"protein\": 42,\n  \"carbs\": 18,\n  \"fat\": 32,\n  \"fiber\": 4,\n  \"sodium\": 890,\n  \"sugar\": 6,\n  \"healthScore\": 7,\n  \"healthScoreExplanation\": \"Lean protein from grilled chicken and fiber from greens, but ranch dressing adds significant fat and sodium.\",\n  \"mealType\": \"lunch\",\n  \"analysisConfidenceLevel\": 8,\n  \"ingredients\": [\n    {\n      \"name\": \"grilled chicken breast\",\n      \"calories\": 280,\n      \"protein\": 35,\n      \"carbs\": 0,\n      \"fat\": 14,\n      \"sugar\": 0,\n      \"fiber\": 0,\n      \"sodium\": 400,\n      \"healthScore\": 8,\n      \"measurementType\": \"grams\",\n      \"measurementValue\": 200\n    },\n    {\n      \"name\": \"mixed salad greens\",\n      \"calories\": 20,\n      \"protein\": 2,\n      \"carbs\": 4,\n      \"fat\": 0,\n      \"sugar\": 1,\n      \"fiber\": 2,\n      \"sodium\": 30,\n      \"healthScore\": 9,\n      \"measurementType\": \"cups\",\n      \"measurementValue\": 2\n    },\n    {\n      \"name\": \"ranch dressing\",\n      \"calories\": 220,\n      \"protein\": 5,\n      \"carbs\": 14,\n      \"fat\": 18,\n      \"sugar\": 5,\n      \"fiber\": 2,\n      \"sodium\": 460,\n      \"healthScore\": 3,\n      \"measurementType\": \"spoons\",\n      \"measurementValue\": 3\n    }\n  ]\n}"
      },
      {
        "title": "Field Reference",
        "body": "FieldTypeRequiredDescriptionmealNamestringYesDisplay name (e.g. \"Chicken Caesar Salad\"). Without this, the meal has no name in the app.caloriesnumberYesTotal calories (kcal). Must be > 0.proteinnumberYesTotal protein in gramscarbsnumberYesTotal carbohydrates in gramsfatnumberYesTotal fat in gramsfibernumberYesTotal fiber in gramssodiumnumberYesTotal sodium in milligramssugarnumberYesTotal sugar in gramshealthScoreintegerYes1-10. How healthy is this meal overall? (1=very unhealthy, 10=very healthy)mealTypestringYesOne of: breakfast, lunch, dinner, snackanalysisConfidenceLevelintegerYes1-10. How confident are you in the nutrition estimates? (1=wild guess, 10=exact data from packaging). For photo analysis use 6-8, for descriptions use 5-7.healthScoreExplanationstringYes1-2 sentence explanation of the nutritional pros/cons (e.g. \"Good protein from chicken but high sodium from the sausage and dressing.\")healthSensitivityExplanationstringYesIf the meal contains any of the user's allergens/food sensitivities (from profile), explain which ingredients are problematic. Empty string \"\" if no sensitivities match or user has none set.ingredientsarrayYesArray of ingredient objects (see below)imageUrlstringNoURL of the food photo. Get this from POST /meals/upload-image first (see below).dateScannedstringNoISO 8601 timestamp. Defaults to now if omitted.servingnumberNoServing multiplier (defaults to 1.0)"
      },
      {
        "title": "Ingredient Object",
        "body": "Each ingredient in the ingredients array must have:\n\nFieldTypeDescriptionnamestringIngredient name (e.g. \"grilled chicken breast\")caloriesnumberCalories for this ingredient's portion (kcal)proteinnumberProtein in gramscarbsnumberCarbs in gramsfatnumberFat in gramssugarnumberSugar in gramsfibernumberFiber in gramssodiumnumberSodium in milligramshealthScoreinteger1-10 health score for this specific ingredientmeasurementTypestringMust be one of: grams, ounces, cups, spoons, servings. Use servings for pieces/slices/bowls/items. Use spoons for tablespoons/teaspoons.measurementValuenumberAmount in the specified unit"
      },
      {
        "title": "Important Rules",
        "body": "All nutrition values must be numbers, not strings. \"calories\": 520 not \"calories\": \"520\"\nIngredient calories should sum to the total calories (approximately — within 5%)\nmealName is mandatory — without it, the meal is invisible on iOS\nhealthScore is 1-10 integer — use your judgment (fast food = 2-4, home-cooked balanced = 6-8, raw salad = 9-10)\nanalysisConfidenceLevel is 1-10 integer — be honest about uncertainty\nSodium is in milligrams, everything else is in grams (except calories in kcal)"
      },
      {
        "title": "Uploading a meal photo (thumbnail)",
        "body": "If you have a food photo, upload it first to get a URL:\n\ncurl -X POST https://habitapp.ai/api/v1/meals/upload-image \\\n  -H \"Authorization: Bearer $HABITAI_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"imageBase64\": \"<base64-encoded-image>\"}'\n\nReturns: {\"success\": true, \"imageUrl\": \"https://firebasestorage.googleapis.com/...\"}\n\nThen pass imageUrl in your POST /meals call. You can also attach to an existing meal:\n\n{\"imageBase64\": \"<base64>\", \"mealId\": \"<existing-meal-id>\"}\n\nFull flow with photo:\n\nPOST /meals/upload-image with base64 photo → get imageUrl\nPOST /meals with nutrition data + imageUrl"
      },
      {
        "title": "Check remaining calories",
        "body": "GET /nutrition/daily for today's totals\nGET /profile for calorie goal\nSubtract: caloriesGoal - totalCalories"
      },
      {
        "title": "Quick water log",
        "body": "curl -X POST https://habitapp.ai/api/v1/water \\\n  -H \"Authorization: Bearer $HABITAI_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"amount\": 500}'\n\nAmount is in milliliters. 1 cup ≈ 237ml, 1 glass ≈ 250ml."
      },
      {
        "title": "Notes",
        "body": "Dates default to today if omitted (uses user's timezone from profile)\nWater amount is in milliliters\nWeight is in kilograms (1 lb ≈ 0.4536 kg)\nSteps auto-calculate calories burned if profile has height/weight/gender\nMax 5 API keys per account"
      }
    ],
    "body": "Habit AI\n\nTrack health and nutrition through the Habit AI REST API.\n\nSetup (100% Free)\n\nHabit AI is a completely free service — no subscription, no credit card, no usage limits.\n\nCreate a free account at https://habitapp.ai (or download the free iOS app)\nGo to Settings → API Keys → Create Key (free, up to 5 keys)\nStore key in environment: export HABITAI_API_KEY=\"hab_...\"\n\nAll requests use:\n\nBase URL: https://habitapp.ai/api/v1\nAuth header: Authorization: Bearer $HABITAI_API_KEY\nContent-Type: application/json\nQuick Reference\nAction\tMethod\tEndpoint\nLog a meal\tPOST\t/meals\nToday's meals\tGET\t/meals?date=YYYY-MM-DD\nDaily nutrition\tGET\t/nutrition/daily?date=YYYY-MM-DD\nWeekly nutrition\tGET\t/nutrition/weekly?date=YYYY-MM-DD\nLog water (ml)\tPOST\t/water\nLog weight (kg)\tPOST\t/weight\nLog steps\tPOST\t/steps\nLog meditation\tPOST\t/meditation\nJournal entry\tPOST\t/journal\nAI eating coach\tPOST\t/coaches/eating\nAI mindfulness coach\tPOST\t/coaches/mindfulness\nAI meditation coach\tPOST\t/coaches/meditation\nGet profile\tGET\t/profile\nUpdate profile\tPUT\t/profile\n\nFor full endpoint details (request/response schemas, all parameters), see references/api.md.\n\nLogging Meals — The Right Way\n⚠️ CRITICAL: Use the AI model to analyze food, then POST /meals with the EXACT structure below\n\nDo NOT call /analyze/food-image or /analyze/meal-description — instead, use your own vision/language capabilities to analyze the food, then construct the exact JSON structure below and POST it to /meals.\n\nStep 0: Check user profile for allergens/diet\n\nBefore analyzing, call GET /profile to check foodSensitivities and diet fields. Factor these into:\n\nhealthScore — lower the score if the meal contains ingredients the user is sensitive to\nhealthScoreExplanation — mention the general nutritional pros/cons\nhealthSensitivityExplanation — if the meal contains any of the user's allergens/sensitivities, explain which ingredients are problematic and why. Leave empty string if no sensitivities match.\nStep 1: Analyze the food yourself\n\nFor photos: Look at the image and identify each ingredient, estimate portions, and calculate nutrition using USDA data.\n\nFor descriptions: Parse the meal description and calculate nutrition the same way.\n\nStep 2: POST /meals with the EXACT structure\n\nEvery field matters. iOS reads from nutritionalSummary (nested object) — if it's missing, meals show as 0 calories.\n\n{\n  \"mealName\": \"Grilled Chicken Salad with Ranch\",\n  \"calories\": 520,\n  \"protein\": 42,\n  \"carbs\": 18,\n  \"fat\": 32,\n  \"fiber\": 4,\n  \"sodium\": 890,\n  \"sugar\": 6,\n  \"healthScore\": 7,\n  \"healthScoreExplanation\": \"Lean protein from grilled chicken and fiber from greens, but ranch dressing adds significant fat and sodium.\",\n  \"mealType\": \"lunch\",\n  \"analysisConfidenceLevel\": 8,\n  \"ingredients\": [\n    {\n      \"name\": \"grilled chicken breast\",\n      \"calories\": 280,\n      \"protein\": 35,\n      \"carbs\": 0,\n      \"fat\": 14,\n      \"sugar\": 0,\n      \"fiber\": 0,\n      \"sodium\": 400,\n      \"healthScore\": 8,\n      \"measurementType\": \"grams\",\n      \"measurementValue\": 200\n    },\n    {\n      \"name\": \"mixed salad greens\",\n      \"calories\": 20,\n      \"protein\": 2,\n      \"carbs\": 4,\n      \"fat\": 0,\n      \"sugar\": 1,\n      \"fiber\": 2,\n      \"sodium\": 30,\n      \"healthScore\": 9,\n      \"measurementType\": \"cups\",\n      \"measurementValue\": 2\n    },\n    {\n      \"name\": \"ranch dressing\",\n      \"calories\": 220,\n      \"protein\": 5,\n      \"carbs\": 14,\n      \"fat\": 18,\n      \"sugar\": 5,\n      \"fiber\": 2,\n      \"sodium\": 460,\n      \"healthScore\": 3,\n      \"measurementType\": \"spoons\",\n      \"measurementValue\": 3\n    }\n  ]\n}\n\nField Reference\nField\tType\tRequired\tDescription\nmealName\tstring\tYes\tDisplay name (e.g. \"Chicken Caesar Salad\"). Without this, the meal has no name in the app.\ncalories\tnumber\tYes\tTotal calories (kcal). Must be > 0.\nprotein\tnumber\tYes\tTotal protein in grams\ncarbs\tnumber\tYes\tTotal carbohydrates in grams\nfat\tnumber\tYes\tTotal fat in grams\nfiber\tnumber\tYes\tTotal fiber in grams\nsodium\tnumber\tYes\tTotal sodium in milligrams\nsugar\tnumber\tYes\tTotal sugar in grams\nhealthScore\tinteger\tYes\t1-10. How healthy is this meal overall? (1=very unhealthy, 10=very healthy)\nmealType\tstring\tYes\tOne of: breakfast, lunch, dinner, snack\nanalysisConfidenceLevel\tinteger\tYes\t1-10. How confident are you in the nutrition estimates? (1=wild guess, 10=exact data from packaging). For photo analysis use 6-8, for descriptions use 5-7.\nhealthScoreExplanation\tstring\tYes\t1-2 sentence explanation of the nutritional pros/cons (e.g. \"Good protein from chicken but high sodium from the sausage and dressing.\")\nhealthSensitivityExplanation\tstring\tYes\tIf the meal contains any of the user's allergens/food sensitivities (from profile), explain which ingredients are problematic. Empty string \"\" if no sensitivities match or user has none set.\ningredients\tarray\tYes\tArray of ingredient objects (see below)\nimageUrl\tstring\tNo\tURL of the food photo. Get this from POST /meals/upload-image first (see below).\ndateScanned\tstring\tNo\tISO 8601 timestamp. Defaults to now if omitted.\nserving\tnumber\tNo\tServing multiplier (defaults to 1.0)\nIngredient Object\n\nEach ingredient in the ingredients array must have:\n\nField\tType\tDescription\nname\tstring\tIngredient name (e.g. \"grilled chicken breast\")\ncalories\tnumber\tCalories for this ingredient's portion (kcal)\nprotein\tnumber\tProtein in grams\ncarbs\tnumber\tCarbs in grams\nfat\tnumber\tFat in grams\nsugar\tnumber\tSugar in grams\nfiber\tnumber\tFiber in grams\nsodium\tnumber\tSodium in milligrams\nhealthScore\tinteger\t1-10 health score for this specific ingredient\nmeasurementType\tstring\tMust be one of: grams, ounces, cups, spoons, servings. Use servings for pieces/slices/bowls/items. Use spoons for tablespoons/teaspoons.\nmeasurementValue\tnumber\tAmount in the specified unit\nImportant Rules\nAll nutrition values must be numbers, not strings. \"calories\": 520 not \"calories\": \"520\"\nIngredient calories should sum to the total calories (approximately — within 5%)\nmealName is mandatory — without it, the meal is invisible on iOS\nhealthScore is 1-10 integer — use your judgment (fast food = 2-4, home-cooked balanced = 6-8, raw salad = 9-10)\nanalysisConfidenceLevel is 1-10 integer — be honest about uncertainty\nSodium is in milligrams, everything else is in grams (except calories in kcal)\nUploading a meal photo (thumbnail)\n\nIf you have a food photo, upload it first to get a URL:\n\ncurl -X POST https://habitapp.ai/api/v1/meals/upload-image \\\n  -H \"Authorization: Bearer $HABITAI_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"imageBase64\": \"<base64-encoded-image>\"}'\n\n\nReturns: {\"success\": true, \"imageUrl\": \"https://firebasestorage.googleapis.com/...\"}\n\nThen pass imageUrl in your POST /meals call. You can also attach to an existing meal:\n\n{\"imageBase64\": \"<base64>\", \"mealId\": \"<existing-meal-id>\"}\n\n\nFull flow with photo:\n\nPOST /meals/upload-image with base64 photo → get imageUrl\nPOST /meals with nutrition data + imageUrl\nOther Workflows\nCheck remaining calories\nGET /nutrition/daily for today's totals\nGET /profile for calorie goal\nSubtract: caloriesGoal - totalCalories\nQuick water log\ncurl -X POST https://habitapp.ai/api/v1/water \\\n  -H \"Authorization: Bearer $HABITAI_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"amount\": 500}'\n\n\nAmount is in milliliters. 1 cup ≈ 237ml, 1 glass ≈ 250ml.\n\nNotes\nDates default to today if omitted (uses user's timezone from profile)\nWater amount is in milliliters\nWeight is in kilograms (1 lb ≈ 0.4536 kg)\nSteps auto-calculate calories burned if profile has height/weight/gender\nMax 5 API keys per account"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/habitclaw/habit-ai",
    "publisherUrl": "https://clawhub.ai/habitclaw/habit-ai",
    "owner": "habitclaw",
    "version": "1.2.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/habit-ai",
    "downloadUrl": "https://openagent3.xyz/downloads/habit-ai",
    "agentUrl": "https://openagent3.xyz/skills/habit-ai/agent",
    "manifestUrl": "https://openagent3.xyz/skills/habit-ai/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/habit-ai/agent.md"
  }
}