- name
- daily-strava-roast
- description
- Generate a playful or sharp daily roast of recent Strava activity. Use when asked to roast, recap, tease, or humorously summarize a Strava workout or a recent day of training. Useful for scheduled daily activity roasts, playful fitness summaries, or lightly sarcastic post-workout commentary. Prefer the deterministic package/script for data prep and fallback; when running inside OpenClaw, use the connected/default runtime model only for the final paragraph if available, then fall back to the deterministic roast path on failure.
Daily Strava Roast
Use this skill to turn recent Strava activity into a short roast-style summary.
Default workflow
- Use the deterministic implementation first to fetch and summarize activity.
- If you are inside OpenClaw and want the V2 path, use the structured context/prompt output as model input for the final paragraph only.
- If connected-model generation is unavailable or weak, fall back to the deterministic roast output.
- Do not pretend the standalone Python package has a built-in OpenClaw connected-model API if it does not.
What this skill does
This skill provides:
- deterministic Strava fetch + summary tooling
- adjustable tones and spice levels
- V1 roast fallback that is stable and testable
- V2 context/prompt building for better final-paragraph generation in the OpenClaw runtime
Preferred commands
Use the packaged CLI for deterministic preparation and fallback:
uv run --project {baseDir} daily-strava-roast summary --json --pretty
uv run --project {baseDir} daily-strava-roast context --pretty
uv run --project {baseDir} daily-strava-roast prompt
uv run --project {baseDir} daily-strava-roast roastDo not rely on the removed legacy script path. Use the packaged CLI commands only.
Runtime guidance
When invoked inside OpenClaw for an actual roast reply:
- run deterministic preparation first
- use the connected/default runtime model only to write the final roast paragraph
- keep that paragraph to one short paragraph
- do not invent stats
- if generation fails, return the deterministic roast instead of erroring
Runtime recipe
Use this sequence:
- Build context JSON:
uv run --project {baseDir} daily-strava-roast context --pretty- Build the constrained prompt:
uv run --project {baseDir} daily-strava-roast prompt- Ask the connected/default OpenClaw runtime model to write the final paragraph from that prompt.
- Before replying, sanity-check the generated paragraph:
- exactly one paragraph - one or two sentences max unless unusually short - no bullet points - no invented stats - no stat dump; usually no more than two concrete metrics unless a third really earns its place - not generic AI filler - avoids banned phrases, stale identity/relationship jokes, pet phrases, and over-clever wording - avoids poetic or cosmic phrasing - tone matches requested spice/tone closely enough
- If the paragraph fails those checks or generation is unavailable, fall back to:
uv run --project {baseDir} daily-strava-roast roastFallback triggers
Fall back immediately if any of these happen:
- no connected/default runtime model is available
- generated output is empty
- generated output invents numbers, activities, or claims not present in the prompt/context
- generated output is multiple paragraphs or list-like
- generated output crams in too many stats without real comedic payoff
- generated output uses banned phrases or obvious close variants
- generated output leans on stale identity, relationship, or defining-trait jokes
- generated output leans on polished LLM-clever wording instead of dry mockery
- generated output drifts into poetic, cosmic, or overly ornate phrasing
- generated output is obviously generic, repetitive, or less readable than the deterministic roast
When falling back:
- do not apologize unless the user needs to know
- just return the deterministic roast text
When working purely from the repo/CLI:
- treat connected-model generation as a runtime concern, not a packaged-CLI feature
- keep the deterministic path working without extra runtime dependencies
Inputs
By default the skill reads Strava app config from:
~/.openclaw/secure/strava_app.jsonAnd by default the token file is:
~/.openclaw/workspace/agents/tars-fit/strava_tokens.jsonNormal auth behaviour:
- treat
~/.openclaw/secure/strava_app.jsonas the canonical app-credentials source - if setup already exists, expired access tokens should refresh automatically using the refresh token
- if Strava still returns 401, retry once after a forced refresh
- if the token file is missing, invalid, or missing required fields, treat that as initial setup required and tell the user clearly
- if the token file exists but app credentials are missing or incomplete, return config_incomplete clearly
- if setup exists but refresh/reauthorisation is needed, return the reauth-required path instead of pretending it is a rest day
- avoid depending on sourced shell profiles for routine auth
Use this to inspect auth readiness:
uv run --project {baseDir} daily-strava-roast auth-urlUse JSON mode when another agent needs machine-readable status:
uv run --project {baseDir} daily-strava-roast roast --json --prettyTones
Supported tones:
dryplayfulsavagecoach
Spice
Spice controls roast intensity:
0— gentle1— light tease2— proper roast3— scorched earth
References
Read as needed:
references/design.mdfor roast heuristics and failure casesdocs/V2.mdfor the V2 architecture and package/runtime boundary