Universal challenge tracker with flexible cadence, intelligent insights, and cross-challenge learning detection. Use when user wants to track any personal challenge - learning, habits, building, fitness, creative, or custom. Supports daily, weekly, or N-day check-ins with type-adaptive preferences, backlog, and context files.
/plugin marketplace add ooiyeefei/ccc/plugin install ooiyeefei-ccc-skills@ooiyeefei/cccThis skill inherits all available tools. When active, it can use any tool Claude has access to.
README.mdreferences/achievements.mdreferences/file-templates.mdreferences/flows-detailed.mdreferences/types.mdtools/Dockerfiletools/README.mdtools/docker-compose.ymltools/requirements.txttools/streak-bot.pytools/streak-notify.pyA universal, flexible challenge tracking system for Claude Code. Track any personal challenge with intelligent insights and cross-challenge learning detection.
Works for any challenge type: Learning, Building, Fitness, Creative, Habit, or Custom.
Trigger phrases -> Flows:
| User Says | Flow |
|---|---|
| "new challenge", "start a streak", "track a goal" | Flow 1: New Challenge |
| "check in", "log progress", "update my streak" | Flow 2: Check-in |
| "list challenges", "show all challenges" | Flow 3: List |
| "switch to [name]", "change challenge" | Flow 4: Switch |
| "show stats", "my progress" | Flow 5: Statistics |
| "show insights", "cross-challenge" | Flow 6: Insights |
| "export calendar", "create reminders" | Flow 7: Calendar |
| "reset challenge", "start fresh" | Flow 8: Reset |
| "pause [name]", "put on hold" | Flow 9: Pause |
| "archive [name]", "shelve challenge" | Flow 10: Archive |
| "resume [name]", "reactivate" | Flow 11: Resume |
| "setup notifications", "telegram reminders" | Flow 12: Notifications |
| "setup telegram bot", "deploy telegram", "streak-telegram" | Flow 13: Telegram Bot Deploy |
All data in .streak/ folder:
.streak/
├── config.md # Global settings
├── active.md # Current challenge pointer
└── challenges/
└── [challenge-id]/
├── challenge-config.md # Metadata, goal, progress
├── challenge-log.md # Progress log with summary
├── today.md # Today's session context
├── backlog.md # Ideas to try
├── preferences.md # Type-adaptive setup
├── context.md # Linked resources
├── insights.md # Auto-generated insights
└── sessions/
└── session-XXX/
└── notes.md # Session notes
File templates: See references/file-templates.md
| Type | Best For | Key Questions |
|---|---|---|
| Learning | Courses, books, skills | "Any aha moments?", "Progress on milestones?" |
| Building | Projects, shipping | "What did you ship?", "Any blockers?" |
| Fitness | Workouts, health | "What exercises?", "How did body feel?" |
| Creative | Art, writing, music | "What did you create?", "Any inspiration?" |
| Habit | Routines, consistency | "Did you complete it?", "How did it feel?" |
| Custom | Anything else | User-defined questions |
Type details: See references/types.md
.streak/ folder if neededreferences/types.mdDetailed steps: See references/flows-detailed.md
Two modes: Pre-session (planning) and Post-session (wrap-up)
references/types.mdreferences/achievements.mdShortcuts during flow:
| Say | Action |
|---|---|
| "Just research" | Only research step |
| "Skip to suggestions" | Skip research |
| "I know what I'm doing: [idea]" | Skip ideation |
| "Done" / "Finished" / "Back" | Jump to wrap-up |
| "Quick check-in" | Minimal logging |
Detailed steps: See references/flows-detailed.md
Display challenges grouped by status, sorted by priority then recency.
Default: Show active + paused challenges
With --all flag: Include archived challenges
Sorting order (within each group):
Display format:
## Active Challenges
| | Name | Type | Pri | Streak | Last Check-in | Sessions |
|---|------|------|-----|--------|---------------|----------|
| * | python-courses | Learning | 10 | 5 days | 1 day ago | 3 |
| | home-fitness | Fitness | 5 | 2 days | 2 days ago | 8 |
## Paused Challenges
| | stories-to-novels | Writing | 0 | - | 10 days ago | 5 |
(2 archived challenges hidden - use --all to show)
* = Active challenge
Pri = Priority (edit in challenge-config.md)
With --all flag, also show:
## Archived Challenges
| | old-project | Building | 0 | - | 2 months ago | 20 |
active.mdShow for active challenge:
Analyze ALL challenges to detect:
Insight formats: See references/achievements.md
Generate .ics file with check-in reminders:
Template: See references/file-templates.md
Archives current progress and starts fresh:
challenge-log-archived-[date].mdTemporarily pause a challenge (plan to resume later):
challenge-config.md: set **Status:** paused/streak-resume [name] to reactivate."Use cases: Seasonal challenges, focusing on other priorities, taking a break
Move challenge to long-term storage (out of daily view):
challenge-config.md: set **Status:** archived/streak-list --all to see archived challenges."Use cases: Completed goals, abandoned challenges, historical record
Bring a paused or archived challenge back to active:
challenge-config.md: set **Status:** activeactive.mdNote: Resuming does NOT reset streak - it continues from where you left off.
Set up push notifications for due/overdue check-ins via Telegram.
/newbot and follow prompts123456789:ABCdefGHI...)123456789)Add to .streak/config.md:
## Notifications (Optional)
- **Notifications:** enabled
- **Telegram Bot Token:** 123456789:ABCdefGHI...
- **Telegram Chat ID:** 123456789
Option A: Cron (Linux/Mac)
# Run daily at 9am
0 9 * * * cd /path/to/project && python .streak/../tools/streak-notify.py
Option B: GitHub Actions
# .github/workflows/streak-notify.yml
name: Streak Reminder
on:
schedule:
- cron: '0 9 * * *' # 9am UTC daily
jobs:
notify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- run: python tools/streak-notify.py .streak
python tools/streak-notify.py /path/to/.streak
Detailed steps: See tools/streak-notify.py header comments.
One-command deployment of the interactive Telegram bot with Docker.
/newbot → save token/start to your bot (required before it can message you).env file in your project root:
cat > .env << EOF
TELEGRAM_BOT_TOKEN=your-bot-token
ALLOWED_USERS=your-chat-id
EOF
Verify prerequisites:
.env file exists in project rootTELEGRAM_BOT_TOKEN is set (not empty/placeholder)docker --version)Locate skill tools directory:
# Plugin location (typical paths)
~/.claude-code/plugins/ccc-skills@ccc/streak/tools/
# Or within the ccc repo if running locally
Copy bot files to project root:
cp [tools-dir]/streak-bot.py ./streak-bot.py
cp [tools-dir]/Dockerfile ./Dockerfile
cp [tools-dir]/docker-compose.yml ./docker-compose.yml
Ensure .gitignore protects secrets:
# Add if not present
echo ".env" >> .gitignore
Start the bot:
docker-compose up -d --build
Verify bot is running:
docker-compose ps
docker-compose logs --tail=20
Confirm to user:
✅ Telegram bot deployed!
Bot is running in Docker and will auto-restart on reboot.
Commands:
- docker-compose logs -f # View logs
- docker-compose restart # Restart bot
- docker-compose down # Stop bot
Open Telegram and send /start to your bot to test!
| Issue | Response |
|---|---|
| No .env file | Show: "Create .env first with TELEGRAM_BOT_TOKEN and ALLOWED_USERS" |
| Empty token | Show: "TELEGRAM_BOT_TOKEN in .env is empty - add your bot token from @BotFather" |
| Docker not found | Show: "Docker not installed. Install from https://docker.com" |
| Docker not running | Show: "Docker daemon not running. Start Docker Desktop or run: sudo systemctl start docker" |
| Port conflict | Show: "Another service using the port. Stop other bots first: docker-compose down" |
| Badge | Requirement |
|---|---|
| :fire: First Flame | 3-day streak |
| :fire::fire: On Fire | 7-day streak |
| :fire::fire::fire: Unstoppable | 30-day streak |
| :gem: Diamond Streak | 100-day streak |
| Badge | Requirement |
|---|---|
| :footprints: First Step | First check-in |
| :star: Dedicated | 10 sessions |
| :100: Centurion | 100 sessions |
| Badge | Requirement |
|---|---|
| :link: Connected | First cross-challenge insight |
| :muscle: Comeback | Resume after 7+ days |
| :mortar_board: Graduate | Complete challenge goal |
Full list: See references/achievements.md
| Situation | Response |
|---|---|
No .streak/ folder | "No challenges found. Say: Start a new challenge" |
| No active challenge | List available challenges, prompt to switch or create |
| Challenge not found | List available, suggest closest match |
Your challenges are interconnected. Your fitness affects your work. Your learning enables your building. Your habits shape your creativity.
Streak detects cross-challenge connections - patterns you might miss:
This is the unique value - not just tracking, but understanding how challenges interact.
Put ALL challenges in ONE .streak/ folder, regardless of life area:
.streak/challenges/
├── work-project # Work
├── morning-fitness # Health
├── learn-rust # Learning
└── daily-meditation # Habit
Use /streak-switch to navigate. Use /streak-insights to discover connections.
Don't create separate .streak/ folders for different challenges. That defeats the purpose.
.streak/ folder for ALL challenges (work, health, learning, etc.)For detailed content, see:
| File | Contains |
|---|---|
references/file-templates.md | All file templates and structures |
references/types.md | Type-specific questions, preferences, ideation |
references/flows-detailed.md | Step-by-step flow instructions |
references/achievements.md | Achievement system, insight generation |
Type: Building
Goal: Ship one AI-powered micro-app per day
Cadence: Daily
Stack: Python, TypeScript, Claude Code
Type: Learning
Goal: Complete Rustlings and build a CLI tool
Cadence: Every 2 days
Resources: Rustlings, The Rust Book
Type: Fitness
Goal: Build consistent strength training habit
Cadence: Daily (with rest days)
Equipment: Home gym - dumbbells, pull-up bar
Type: Creative
Goal: Draw one sketch per day for 100 days
Cadence: Daily
Medium: Digital art (Procreate)
Type: Habit
Goal: Meditate 10 minutes every morning
Cadence: Daily
Trigger: After coffee, before email
This skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.