A Web3 fitness training platform that gamifies NFT fighter training through real-world activities. Train your NFT fighters by running (Strava), practicing yoga, or meditating. Fighter attributes are stored off-chain and dynamically generate OpenSea-compatible NFT metadata in real-time.
Fighters Unbound connects real-world fitness activities with NFT gaming. Users own NFT fighters that can be trained through:
- 🏃 Strava Running: Sync your running activities to boost fighter endurance
- 🧘 Yoga Sessions: Complete yoga courses to improve agility and mental strength
- 🧘 Meditation Sessions: Practice meditation to enhance mental strength and leadership
The platform features an AI-Powered Personal Training Coach that provides personalized recommendations based on your goals, training history, and fighter needs.
- Real-World Activity Integration: Connect Strava to sync running activities automatically
- Interactive Training Courses: Complete yoga and meditation sessions with quizzes
- Dynamic Stat Tracking: Fighter attributes update in real-time based on training
- Training Cycles: Monthly cycles with progressive stat caps for balanced progression
- Daily Limits: Fair training limits to ensure balanced gameplay
- Personalized Recommendations: AI analyzes your goals, history, and fighter stats
- Two Coach Personalities: Choose between "Butch" (direct, motivational) or "Dead" (calm, reflective)
- Goal-Based Logic: 7 different training goals with intelligent recommendation algorithms
- Runner Level Detection: Automatically classifies your fitness level and adjusts recommendations
- Share Cards: Generate beautiful shareable images with your coach's recommendations
- Dynamic Metadata: Real-time NFT metadata generation for OpenSea and Mintify
- Off-Chain Stats: All fighter stats stored off-chain in SQLite for fast updates
- OpenSea Compatible: Full compatibility with major NFT marketplaces
- 5,200+ Fighters: Support for large-scale NFT collections
The platform uses a microservices architecture with three main components:
┌─────────────────────────────────────────────────────────────┐
│ Frontend (React/Next.js) │
│ - User Interface │
│ - Wallet Connectivity (RainbowKit/wagmi) │
│ - Share Card Generation │
└──────────────────────┬──────────────────────────────────────┘
│ HTTP/REST API
┌──────────────────────▼──────────────────────────────────────┐
│ Backend API (TypeScript/Express) │
│ - Training Data Management │
│ - Strava Integration │
│ - Fighter Stat Tracking │
│ - NFT Metadata Generation │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ AI Trainer Agent (Python/FastAPI) │
│ - LangGraph Workflow Orchestration │
│ - Recommendation Generation │
│ - Training Analysis │
│ - Natural Language Generation (Ollama) │
└─────┬─────────────┬──────────────┬──────────────────────────┘
│ │ │
┌─────▼──────┐ ┌────▼────────┐ ┌───▼──────────┐
│ SQLite │ │ ChromaDB │ │ Ollama LLM │
│ (Structured│ │ (Vector) │ │ (Generation)│
│ Data) │ │ - Actions │ │ │
│ │ │ - Analysis │ │ │
│ │ │ - Knowledge│ │ │
└────────────┘ └─────────────┘ └──────────────┘
unbound/
├── squad-unbound-games-frontend/ # React/Next.js frontend
├── squad-unbound-games-backend/ # TypeScript/Express backend
├── squad-unbound-games-trainer-agent/ # Python/FastAPI AI agent
└── README.md # This file
-
Fighters Unbound is live and actively used by a growing core community.
-
Based on current wallet and training data:
-
𝟳𝟯 𝘂𝗻𝗶𝗾𝘂𝗲 𝘄𝗮𝗹𝗹𝗲𝘁 𝗮𝗱𝗱𝗿𝗲𝘀𝘀𝗲𝘀 have participated
-
𝟭𝟰,𝟬𝟬𝟬+ 𝗸𝗶𝗹𝗼𝗺𝗲𝘁𝗲𝗿𝘀 𝗹𝗼𝗴𝗴𝗲𝗱 through real-world running activities
-
𝟭𝟮𝟬+ 𝘆𝗼𝗴𝗮 𝘀𝗲𝘀𝘀𝗶𝗼𝗻𝘀 completed
-
𝟭𝟯𝟬+ 𝗺𝗲𝗱𝗶𝘁𝗮𝘁𝗶𝗼𝗻 𝘀𝗲𝘀𝘀𝗶𝗼𝗻𝘀 completed
Engagement ranges from high-volume runners with over 𝟮,𝟬𝟬𝟬 𝗸𝗺 logged to users focusing entirely on meditation or yoga. All activities are consistently reflected in fighter progression, training history, and dynamic NFT metadata.
Fighters Unbound is built around two core ideas: 𝗿𝗲𝗳𝗹𝗲𝗰𝘁𝗶𝗼𝗻 and 𝗺𝗼𝘁𝗶𝘃𝗮𝘁𝗶𝗼𝗻.
-
Each fighter mirrors real-world behavior.
-
Movement, focus, and consistency are transformed into visible, persistent progress.
-
Effort becomes something tangible — owned, tracked, and remembered.
-
Progress is earned through real action, not simulated inputs.
-
Knowing that daily activity shapes a lasting digital character creates accountability and long-term motivation without artificial pressure or exploitative gamification.
-
Fighters Unbound acts as an open training layer:
-
Activities can originate from multiple sources
-
Progress is not locked to a single app or provider
-
Training history remains portable and extensible
This enables a decentralized approach to training and self-development.
-
Beyond individual use, the system can serve groups and organizations:
-
Aggregate, privacy-aware tracking of member activity
-
Incentives through NFTs, access rights, reputation, or off-chain rewards
-
Shared goals without centralized surveillance or control
Instead of extracting value from user data, Fighters Unbound returns value by turning activity into ownership and progression.
- Open the frontend application
- Click "Connect Wallet" in the top right
- Select your preferred wallet (MetaMask, WalletConnect, etc.)
- Sign the authentication message (no gas fee required)
- After connecting your wallet, you'll be prompted to set up your profile
- Choose your coach personality:
- Butch: Direct, motivational, action-oriented
- Dead: Calm, reflective, supportive
- Select 1-3 training goals (e.g., "improve endurance", "reduce stress")
- Choose your preferred activities
- Set your practice level
- If you own Fighters Unbound NFTs, they will be automatically detected
- Your fighters will appear in the carousel
- Each fighter shows current stats and training status
- Go to your profile settings
- Click "Connect Strava"
- Authorize the application
- Your running activities will automatically sync
- Click "Get Recommendation" to receive personalized training advice
- The AI coach analyzes:
- Your goals
- Training history
- Fighter needs
- Activity balance
- Accept the recommendation to start a 12-hour training window
- Complete the training to earn fight points and stat bonuses
- Go for a run and record it in Strava
- Return to the app and sync your activity
- Fighter endurance increases based on distance
- Daily limit: 20 syncs per athlete
- Cycle limit: 20 km per fighter per month
- Select a yoga course
- Watch the lesson
- Answer the quiz questions
- Earn agility and mental strength bonuses
- Daily limit: 1 completion per fighter
- Select a meditation course
- Complete the session
- Answer the quiz questions
- Earn mental strength and leadership bonuses
- Daily limit: 1 completion per fighter
- Check fighter stats in the carousel
- View training history
- Track your streak
- See fight points earned
- Monitor level progression
WalletConnect Project ID (Recommended):
- Visit https://cloud.reown.com
- Create a project
- Copy your Project ID
- Add to
.env.local:NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID=your_id
Shape Network (Auto-configured):
- Automatically switches to Shape Network when wallet connects
- No additional configuration needed
Strava API:
- Create an app at https://www.strava.com/settings/api
- Set redirect URI:
http://localhost:3001/strava/callback - Add credentials to
.env
Training Cycles:
Edit src/config/config.js to modify training cycles and stat caps.
Ollama Setup:
- Download from https://ollama.ai
- Run:
ollama pull gemma:7b - Ensure Ollama is running on
http://localhost:11434
Vector Databases:
- Automatically created on first run
- Stored in
./data/vector_db/ - Contains: Action Recording, Training Analysis, Knowledge Base
| Activity | Bonuses | Limits |
|---|---|---|
| Strava Running | Endurance: +0.2/km (if < 90) or +0.1/km (if ≥ 90) Level: +1 per cycle (max) |
20 syncs/day 20 km/cycle per fighter |
| Yoga | Agility: +0.1 Mental Strength: +0.1 |
1 completion/day per fighter |
| Meditation | Mental Strength: +0.1 Leadership: +0.1 |
1 completion/day per fighter |
Monthly cycles with progressive stat caps:
| Cycle | Max Level | Max Endurance |
|---|---|---|
| 1-6 | 1-6 | 95-100 |
| 7-12 | 7-12 | 100 (capped) |
The AI coach uses 7 data sources to generate recommendations:
- User Profile & Goals: Personality, goals, preferences, practice level
- Training History: Session counts, last activity, success rate
- Strava Data: Running distance, frequency, fitness level
- Fighter Training Data: Owned fighters, undertrained attributes
- Activity Patterns: Consistency, streaks, preferred times
- Action History: Recent app interactions
- Training Analysis: Overall progress and insights
| Goal | Primary Method | Secondary Method |
|---|---|---|
| Improve Body Composition | Running/Walking (Strava) | Yoga |
| Build Strength | Yoga | Running (Strava) |
| Improve Endurance | Running (Strava) | Yoga |
| Move More | Balanced (less-used activity) | Recent activity |
| Reduce Stress | Meditation | Yoga |
| Build Routine | Most recent activity | Meditation |
| Explore Movement | Meditation | Yoga or light movement |
Health Check
GET /health- Server status
Fighter Metadata
GET /fighter-metadata/:tokenId- Get NFT metadata for OpenSea/Mintify
Strava Integration
POST /strava/connect- Connect Strava accountPOST /strava/sync- Sync Strava activitiesGET /strava/status/:walletAddress- Get connection status
Training
GET /training/media/:mediaType- Get available coursesGET /training/questions/:mediaId- Get quiz questionsPOST /training/submit/yoga- Submit yoga trainingPOST /training/submit/meditation- Submit meditation trainingGET /training/status/:walletAddress- Get training status
Fighter Management
GET /fighter/:tokenId/stats- Get fighter statsGET /fighter/:tokenId/history- Get stat change historyPOST /fighter/link- Link fighter to walletGET /fighter/wallet/:walletAddress- Get fighters by wallet
Recommendations
POST /recommendations/generate- Generate new recommendationPOST /recommendations/accept- Accept recommendationPOST /recommendations/decline- Decline recommendationPOST /recommendations/check-completion- Check if training matches recommendationGET /recommendations/active/:wallet_address- Get active recommendation
Profile Setup
POST /profile-setup- Create or update user profile
Agent Actions
POST /agent/record-action- Record user actionGET /agent/status/:wallet_address- Get agent statusGET /agent/actions/:wallet_address- Get user actions
Main tables:
- tokens: User wallet addresses, Strava tokens, linked fighters
- FighterStat: Current fighter stats (baseValue + deltaValue)
- FighterStatHistory: Complete history of stat changes
- StravaStat: Per-cycle mileage tracking
- StravaSyncHistory: Daily sync attempt tracking
- mediainfo: Yoga and meditation course metadata
- media_questions: Questions and answers for courses
- user_submissions_log: Training submission history
- user_retry_cooldown: Cooldown tracking for failed attempts
- user_profile_setup: User profiles, goals, coach personality
- training_recommendations: AI-generated recommendations
Three collections:
- action_recording: User actions with semantic search
- training_analysis: Training pattern analysis
- knowledge_base: System rules, personality guidelines, evaluation logic
- Insert course into
mediainfotable:
INSERT INTO mediainfo (media_id, media_type, description)
VALUES ('yoga-course-2', 'yoga', 'Advanced Yoga Session');- Insert questions into
media_questionstable:
INSERT INTO media_questions (media_id, questions_json, correct_indexes)
VALUES ('yoga-course-2', '[...]', '[1, 2]');Edit squad-unbound-games-backend/src/config/config.js:
{
CYCLE_ID: 13,
START_TIMESTAMP: 1746057600,
END_TIMESTAMP: 1748736000,
MAX_LEVEL: 13,
MAX_ENDURANCE: 100
}Backend:
cd squad-unbound-games-backend
npm run typecheck # TypeScript type checking
npm run db-stats # View database statistics
npm run verify # Verify setupFrontend:
cd squad-unbound-games-frontend
npm run lint # Run linter
npm run build # Build for production- Base Values: Never modify
baseValueinFighterStat- they represent original minted stats - Delta Values: Only
deltaValueshould be modified through training - UTC Timezone: All daily limits reset at midnight UTC
- Leftover Mileage: Carries over within the same cycle, discarded when moving to new cycle
- Multi-Fighter Support: Users can own multiple fighters; each has independent limits
- Off-Chain Stats: All fighter stats are stored off-chain for fast updates and low gas costs
If you encounter database errors:
# Verify database exists
ls squad-unbound-games-backend/src/database/
# Check database stats
cd squad-unbound-games-backend
npm run db-stats- Verify
STRAVA_CLIENT_IDandSTRAVA_CLIENT_SECRETare correct - Ensure redirect URI matches Strava app settings:
http://localhost:3001/strava/callback - Check that required scopes are enabled:
read,activity:read_all
- Ensure Ollama is running:
ollama serve - Verify model is installed:
ollama list - Check connection:
curl http://localhost:11434/api/tags
- Clear browser cache and localStorage
- Ensure wallet extension is installed and unlocked
- Check network configuration (Shape Network)
- AI System Summary - Complete AI coach system overview
- How to Check Recommendations - Database queries and API usage
- Backend README - Detailed backend documentation
- Frontend README - Frontend setup and configuration
- Trainer Agent README - AI agent architecture
- Framework: Next.js 14 (React)
- Language: TypeScript
- Wallet: RainbowKit, wagmi, viem
- Styling: Tailwind CSS
- Framework: Express.js
- Language: TypeScript 5.x
- Database: SQLite3
- Blockchain: Ethers.js
- Framework: FastAPI
- Language: Python 3.8+
- AI: LangGraph, LangChain
- Vector DB: ChromaDB
- LLM: Ollama (Gemma 7B)
ISC
This is a private project. For issues or questions, please contact the development team.
Note: This platform stores all fighter data off-chain. The on-chain NFT contract's tokenURI should point to https://api.unbound.games/metadata/{tokenId} for proper marketplace integration.