BestYou Coach Dashboards
by @kentsteffen
Render BestYou health data as visual Dark Glass dashboards via OpenClaw canvas. Daily briefings, action plans, progress snapshots, weekly summaries, meal ana...
clawhub install bestyou-coachπ About This Skill
name: bestyou-coach description: > Render BestYou health data as visual Dark Glass dashboards via OpenClaw canvas. Daily briefings, action plans, progress snapshots, weekly summaries, meal analysis, and workout plans. Companion to the bestyou core skill. homepage: https://bestyou.ai/openclaw-setup metadata: openclaw: requires: env: - BESTYOU_API_KEY primaryEnv: BESTYOU_API_KEY
BestYou Coach Widgets
Render BestYou MCP tool responses as rich visual cards using OpenClaw's canvas.
First-Time Setup
Before calling any tools, check that mcporter is installed and the BestYou server is configured:
mcporter --config ~/.openclaw/workspace/config/mcporter.json list
mcporter is not found: npm install -g mcporterbestyou is not listed: walk the user through setup. See references/setup.md for the full guide.Setup summary:
1. User generates an API key in BestYou iOS (More β Connected Apps β OpenClaw)
2. Create config/mcporter.json with the key in the Authorization Bearer header (see references/setup.md for the exact JSON format)
3. Restart the OpenClaw gateway
Calling Tools via mcporter
All tools use this syntax:
mcporter --config config/mcporter.json call bestyou. [param=value ...]
If a custom config path is needed (e.g. calling from outside the workspace), use the full path:
mcporter --config ~/.openclaw/workspace/config/mcporter.json call bestyou. [param=value ...]
Examples:
mcporter call bestyou.get_account_link_status
mcporter call bestyou.get_daily_briefing date=2026-03-15
mcporter call bestyou.get_todays_action_plan date=2026-03-15
mcporter call bestyou.get_progress_snapshot date=2026-03-15
mcporter call bestyou.get_weekly_summary weekEndDate=2026-03-15
mcporter call bestyou.generate_workout type=strength duration=20 equipment=bodyweight experienceLevel=Intermediate goal="General strength"
mcporter call bestyou.analyze_meal_text description="chicken burrito bowl" timestamp=2026-03-15T12:30:00-06:00
If a custom mcporter config path is needed, add --config .
Tool-to-Template Map
| MCP Tool | Template | Description |
|----------|----------|-------------|
| get_account_link_status | assets/account-status.html | Connection status, scopes |
| get_daily_briefing | assets/daily-briefing.html | Readiness, insights, priorities |
| get_todays_action_plan | assets/action-plan.html | Timeline of today's blocks |
| get_progress_snapshot | assets/progress-snapshot.html | Domain scores, recommendations |
| get_weekly_summary | assets/weekly-summary.html | Weekly scores, trends, goals |
| analyze_meal_text | assets/meal-analysis.html | Macro breakdown, components |
| generate_workout | assets/workout.html | Exercise cards with images |
Rendering Workflow
1. Call the BestYou MCP tool via mcporter
2. Read the matching template from assets/
3. Replace the sample data in the HTML with the actual API response values (see data mapping below)
4. Inline the CSS: copy the contents of assets/shared.css into a tag in the HTML so the output is self-contained
5. Present the populated HTML via canvas(action="present") or canvas(action="a2ui_push")
6. Provide a brief text summary alongside the visual
Design System
All templates use the BestYou Dark Glass design system (assets/shared.css):
#0a0a0a, cards: #141414, borders: #1e1e1e#4ade80) = good, yellow (#facc15) = moderate, orange (#fb923c) = warning, red (#f87171) = poorHandling Missing Data
API responses may contain null or missing fields. Rules:
totalCalories or calorieGoal is null, omit the calorie summary rowData Mapping by Template
Daily Briefing
API response structure (nested):
| API Path | Template Element | Notes |
|----------|-----------------|-------|
| headline | .headline text | |
| readinessScore | .gauge-value + SVG stroke-dashoffset | Formula: 314 - (314 * score / 100) |
| dayType | .day-type .value | Capitalize, add emoji: recovery=π, active=πͺ, rest=π΄ |
| yesterday.highlights[] | .insight-card blocks | Positive insights (icon, title, description) |
| yesterday.areas[] | .insight-card blocks | Negative/improvement insights, render after highlights |
| today.priorities[] | .action-item blocks | Numbered, with title and description |
| today.plans[] | .plan-tag blocks | Emoji, plan name, week/day info |
| insightCards[] | Cross-domain section | Filter for domain: "multi" entries, render as cross-domain insight cards |
Action Plan
| API Path | Template Element | Notes |
|----------|-----------------|-------|
| readiness.score | .readiness-score + badge | |
| readiness.dayType | .rm-type | |
| blocks[] | .block-card items | Group by timePeriod: morning/afternoon/evening |
Block icon mapping by blockType:
wakeUp β π΄ (recovery icon bg)breakfast β π³ (nutrition icon bg)lunch β π₯ (nutrition icon bg)snack β π₯€ (nutrition icon bg, or π₯ for second snack)dinner β π½οΈ (nutrition icon bg)workout / cardio / strength β π (fitness icon bg)goToBed β π (recovery icon bg)Block status: completed β β
, upcoming or pending β β¬
Progress Snapshot
| API Path | Template Element | Notes |
|----------|-----------------|-------|
| domains[] | .domain-card grid | Each: name, score, color-coded mini bar |
| insights[] | .insight-item cards | With severity badge (high=red, medium=orange, low=blue) |
| recommendations[] | .rec-item cards | With actionSteps[] as list items |
| crossDomainPatterns[] | .cross-domain cards | With domain badges |
Weekly Summary
| API Path | Template Element | Notes |
|----------|-----------------|-------|
| overallScore | Gauge SVG + label | |
| domains[] | .domain-section blocks | Each: trend badge (improving/declining/stable), stats, insight |
| achievements[] | .achievement cards | Emoji + title + description |
| nextWeekFocus[] | .next-week-goal items | With priority badge |
Meal Analysis
| API Path | Template Element | Notes |
|----------|-----------------|-------|
| mealName | .meal-name | |
| calories | .meal-cal | |
| protein_g, fat_g, carbs_g, fiber_g | Macro bar segments + legend | Flex ratios = gram values |
| components[] | .component rows | Name, amount, calories, per-component macros |
| insights[] | .insight-row items | .positive or .negative indicator bar |
| dailyTotals | .daily-totals section | Calories, protein, fat, carbs |
Workout
| API Path | Template Element | Notes |
|----------|-----------------|-------|
| sessionName | Header h1 | |
| duration, equipment, level | Header .meta spans | |
| blocks[] | .block sections | Phase badge: warmup=green, main=orange, cooldown=blue |
Each exercise within a block:
imageUrl β ![]()
src (CDN: cdn.bestyou.ai)name β h3sets, reps, weight, rpe, rest β .rx-pill spansnotes β .exercise-notestargetMuscle, exerciseType β .exercise-cuesConversation Patterns
Morning check-in
User: "What's my day look like?" or "Morning briefing" 1.get_account_link_status β verify connected
2. get_daily_briefing β render briefing widget
3. get_todays_action_plan β render action plan widget
4. Summarize: readiness score, day type, top priorityProgress check
User: "How am I doing?" or "Show my progress" 1.get_progress_snapshot β render snapshot widget
2. Highlight strongest and weakest domains, top recommendationMeal logging
User: "I just had [food description]" 1.analyze_meal_text with the description β render meal widget
2. Note protein hit vs target, suggest next meal biasWorkout request
User: "Give me a workout" or "[duration] [type] workout" 1.generate_workout with parameters β render workout widget
2. Brief summary: duration, focus, number of exercisesWeekly review
User: "Weekly summary" or "How was my week?" 1.get_weekly_summary β render weekly widget
2. Highlight trends (improving/declining), top achievement, next week focusText Summary Style
Keep text summaries alongside widgets brief and actionable: