Skill: bohdanpodvirnyi/strava (version 1.0.0)

--- name: strava description: Load and analyze Strava activities, stats, and workouts using the Strava API homepage: https://developers.strava.com/ metadata: {"clawdbot":{"emoji":"🏃","requires":{"bins":["curl"],"env":["STRAVA_ACCESS_TOKEN"]},"primaryEnv":"STRAVA_ACCESS_TOKEN"}} --- # Strava Skill Interact with Strava to load activities, analyze workouts, and track fitness data. ## Setup ### 1. Create a Strava API Application 1. Go to https://www.strava.com/settings/api 2. Create an app (use `http://localhost` as callback for testing) 3. Note your **Client ID** and **Client Secret** ### 2. Get Initial OAuth Tokens Visit this URL in your browser (replace CLIENT_ID): ``` https://www.strava.com/oauth/authorize?client_id=CLIENT_ID&response_type=code&redirect_uri=http://localhost&approval_prompt=force&scope=activity:read_all ``` After authorizing, you'll be redirected to `http://localhost/?code=AUTHORIZATION_CODE` Exchange the code for tokens: ```bash curl -X POST https://www.strava.com/oauth/token \ -d client_id=YOUR_CLIENT_ID \ -d client_secret=YOUR_CLIENT_SECRET \ -d code=AUTHORIZATION_CODE \ -d grant_type=authorization_code ``` This returns `access_token` and `refresh_token`. ### 3. Configure Credentials Add to `~/.clawdbot/clawdbot.json`: ```json { "skills": { "entries": { "strava": { "enabled": true, "env": { "STRAVA_ACCESS_TOKEN": "your-access-token", "STRAVA_REFRESH_TOKEN": "your-refresh-token", "STRAVA_CLIENT_ID": "your-client-id", "STRAVA_CLIENT_SECRET": "your-client-secret" } } } } } ``` Or use environment variables: ```bash export STRAVA_ACCESS_TOKEN="your-access-token" export STRAVA_REFRESH_TOKEN="your-refresh-token" export STRAVA_CLIENT_ID="your-client-id" export STRAVA_CLIENT_SECRET="your-client-secret" ``` ## Usage ### List Recent Activities Get the last 30 activities: ```bash curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \ "https://www.strava.com/api/v3/athlete/activities?per_page=30" ``` Get the last 10 activities: ```bash curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \ "https://www.strava.com/api/v3/athlete/activities?per_page=10" ``` ### Filter Activities by Date Get activities after a specific date (Unix timestamp): ```bash # Activities after Jan 1, 2024 curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \ "https://www.strava.com/api/v3/athlete/activities?after=1704067200" ``` Get activities in a date range: ```bash # Activities between Jan 1 - Jan 31, 2024 curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \ "https://www.strava.com/api/v3/athlete/activities?after=1704067200&before=1706745600" ``` ### Get Activity Details Get full details for a specific activity (replace ACTIVITY_ID): ```bash curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \ "https://www.strava.com/api/v3/activities/ACTIVITY_ID" ``` ### Get Athlete Profile Get the authenticated athlete's profile: ```bash curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \ "https://www.strava.com/api/v3/athlete" ``` ### Get Athlete Stats Get athlete statistics (replace ATHLETE_ID): ```bash curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \ "https://www.strava.com/api/v3/athletes/ATHLETE_ID/stats" ``` ### Pagination Navigate through pages: ```bash # Page 1 (default) curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \ "https://www.strava.com/api/v3/athlete/activities?page=1&per_page=30" # Page 2 curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \ "https://www.strava.com/api/v3/athlete/activities?page=2&per_page=30" ``` ## Token Refresh Access tokens expire every 6 hours. Refresh using the helper script: ```bash bash {baseDir}/scripts/refresh_token.sh ``` Or manually: ```bash curl -s -X POST https://www.strava.com/oauth/token \ -d client_id="${STRAVA_CLIENT_ID}" \ -d client_secret="${STRAVA_CLIENT_SECRET}" \ -d grant_type=refresh_token \ -d refresh_token="${STRAVA_REFRESH_TOKEN}" ``` The response includes a new `access_token` and `refresh_token`. Update your configuration with both tokens. ## Common Data Fields Activity objects include: - `name` — Activity title - `distance` — Distance in meters - `moving_time` — Moving time in seconds - `elapsed_time` — Total time in seconds - `total_elevation_gain` — Elevation gain in meters - `type` — Activity type (Run, Ride, Swim, etc.) - `sport_type` — Specific sport type - `start_date` — Start time (ISO 8601) - `average_speed` — Average speed in m/s - `max_speed` — Max speed in m/s - `average_heartrate` — Average heart rate (if available) - `max_heartrate` — Max heart rate (if available) - `kudos_count` — Number of kudos received ## Rate Limits - **200 requests** per 15 minutes - **2,000 requests** per day If you hit rate limits, responses will include `X-RateLimit-*` headers. ## Tips - Convert Unix timestamps: `date -d @TIMESTAMP` (Linux) or `date -r TIMESTAMP` (macOS) - Convert meters to km: divide by 1000 - Convert meters to miles: divide by 1609.34 - Convert m/s to km/h: multiply by 3.6 - Convert m/s to mph: multiply by 2.237 - Convert seconds to hours: divide by 3600 - Parse JSON with `jq` if available, or use `grep`/`sed` for basic extraction ## Examples Get running activities from last week with distances: ```bash LAST_WEEK=$(date -d '7 days ago' +%s 2>/dev/null || date -v-7d +%s) curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \ "https://www.strava.com/api/v3/athlete/activities?after=${LAST_WEEK}&per_page=50" \ | grep -E '"name"|"distance"|"type"' ``` Get total distance from recent activities: ```bash curl -s -H "Authorization: Bearer ${STRAVA_ACCESS_TOKEN}" \ "https://www.strava.com/api/v3/athlete/activities?per_page=10" \ | grep -o '"distance":[0-9.]*' | cut -d: -f2 | awk '{sum+=$1} END {print sum/1000 " km"}' ``` ## Error Handling If you get a 401 Unauthorized error, your access token has expired. Run the token refresh command. If you get rate limit errors, wait until the limit window resets (check `X-RateLimit-Usage` header).

path: README.md
content: # Strava Skill for Clawdbot

🏃 **Load and analyze your Strava activities, stats, and workouts** using the Strava API.

## Features

- ✅ List recent activities with pagination
- ✅ Filter activities by date ranges
- ✅ Get detailed activity stats (distance, pace, heart rate, elevation)
- ✅ Access athlete profile and cumulative statistics
- ✅ Auto token refresh helper script
- ✅ Rate limit aware (200/15min, 2000/day)
- ✅ Works with curl only (no additional dependencies)

## Quick Start

### 1. Create Strava API Application

Visit https://www.strava.com/settings/api and create an app.

### 2. Get OAuth Tokens

Follow the setup instructions in [SKILL.md](./SKILL.md) to obtain your access token and refresh token.

### 3. Configure

Add to `~/.clawdbot/clawdbot.json`:

```json
{
  "skills": {
    "entries": {
      "strava": {
        "enabled": true,
        "env": {
          "STRAVA_ACCESS_TOKEN": "your-access-token",
          "STRAVA_REFRESH_TOKEN": "your-refresh-token",
          "STRAVA_CLIENT_ID": "your-client-id",
          "STRAVA_CLIENT_SECRET": "your-client-secret"
        }
      }
    }
  }
}
```

## Usage Examples

Ask your agent:
- "Show me my last 10 Strava activities"
- "What activities did I do last week?"
- "Get details for my most recent run"
- "What's my total distance this month?"
- "Show my Strava profile and stats"

## What You Can Do

- **List Activities**: Recent workouts with customizable page size
- **Filter by Date**: Query specific date ranges using Unix timestamps
- **Activity Details**: Full metrics including pace, heart rate, elevation
- **Athlete Stats**: Profile info and cumulative statistics
- **Token Management**: Auto-refresh expired tokens (expire every 6 hours)

## API Coverage

- `GET /athlete/activities` - List activities
- `GET /activities/{id}` - Activity details
- `GET /athlete` - Athlete profile
- `GET /athletes/{id}/stats` - Athlete statistics
- `POST /oauth/token` - Token refresh

## Documentation

See [SKILL.md](./SKILL.md) for complete setup instructions, API reference, and advanced usage.

## Requirements

- `curl` (bundled with macOS/Linux)
- Strava API application credentials
- OAuth access token

## Links

- **Strava Developers**: https://developers.strava.com/
- **API Docs**: https://developers.strava.com/docs/reference/
- **Create App**: https://www.strava.com/settings/api

## License

MIT

## Author

Created for Clawdbot AI Assistant

---

🦞 Part of the Clawdbot skill ecosystem


path: scripts/refresh_token.sh
content: #!/usr/bin/env bash
# Refresh Strava access token using refresh token

set -e

if [ -z "$STRAVA_CLIENT_ID" ] || [ -z "$STRAVA_CLIENT_SECRET" ] || [ -z "$STRAVA_REFRESH_TOKEN" ]; then
  echo "Error: Required environment variables not set"
  echo "Need: STRAVA_CLIENT_ID, STRAVA_CLIENT_SECRET, STRAVA_REFRESH_TOKEN"
  exit 1
fi

RESPONSE=$(curl -s -X POST https://www.strava.com/oauth/token \
  -d client_id="$STRAVA_CLIENT_ID" \
  -d client_secret="$STRAVA_CLIENT_SECRET" \
  -d grant_type=refresh_token \
  -d refresh_token="$STRAVA_REFRESH_TOKEN")

# Extract tokens using grep/sed (works without jq)
NEW_ACCESS_TOKEN=$(echo "$RESPONSE" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)
NEW_REFRESH_TOKEN=$(echo "$RESPONSE" | grep -o '"refresh_token":"[^"]*' | cut -d'"' -f4)
EXPIRES_AT=$(echo "$RESPONSE" | grep -o '"expires_at":[0-9]*' | cut -d':' -f2)

if [ -n "$NEW_ACCESS_TOKEN" ]; then
  echo "✓ Token refreshed successfully"
  echo "New access [REDACTED_SECRET]"
  echo "New refresh [REDACTED_SECRET]"
  echo "Expires at: $(date -r "$EXPIRES_AT" 2>/dev/null || date -d "@$EXPIRES_AT" 2>/dev/null || echo "$EXPIRES_AT")"
  echo ""
  echo "Update your config with:"
  echo "  STRAVA_ACCESS_TOKEN=\"$NEW_ACCESS_TOKEN\""
  echo "  STRAVA_REFRESH_TOKEN=\"$NEW_REFRESH_TOKEN\""
else
  echo "Error: Token refresh failed"
  echo "$RESPONSE"
  exit 1
fi


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)