model avatar πŸ“– TactiScout Project Story Inspiration The Problem: The Grassroots Scouting Gap I watched grassroots football coaches evaluate players with paper and gut instinct. Meanwhile, professional clubs deploy AI-powered scouting systems costing $1,000+ per monthβ€”tools like Wyscout, StatsBomb, and Opta Sports that aren't accessible to the 99% of coaches working in grassroots academies.

This inequality bothered me.

A talented 14-year-old in a rural area has ==zero chance== of professional evaluation because scouts only visit elite academies in major cities. Yet the data to scout them exists:

Match footage (video recordings) League statistics (goals, assists, pass completion) Performance metrics (speed, positioning, decision-making) What was missing? Accessible AI.

The Spark When I learned about the AWS + Anthropic Hackathon, I realized this was the perfect opportunity to build something that could ==democratize scouting==. The combination of:

Technology Why It Matters Strands Agents SDK Multi-agent orchestration Claude 3.5 Sonnet Enterprise-grade reasoning AWS Serverless Affordable, scalable infrastructure Amazon Bedrock No GPU costs, pay-per-token ...meant I could build enterprise-grade analysis for pocket-change costs.

Vision Statement ✨ "How can AI close the grassroots scouting gap?" What It Does TactiScout is an autonomous multi-agent AI system that transforms raw player data into professional scouting reports in ==under 5 minutes== for $0.30–$1.50 per report.

Core Capabilities 1️⃣ Multi-Source Data Ingestion Coaches can input player data in 4 ways:

Player ID β€” Query API-Football database in real-time CSV Upload β€” Bulk stats from league systems JSON β€” Raw structured data Match Video β€” Phone recording β†’ Claude Vision extracts stats frame-by-frame 2️⃣ Tactical Intelligence The system doesn't just score playersβ€”it understands their role:

Compares against 14 positional archetypes (CB, RB, LB, CM, AM, LW, RW, ST, GK, etc.) Identifies archetype matches (e.g., "This player is similar to Virgil van Dijk") Generates gap analysis (what's missing actionable development areas to reach elite level) 3️⃣ Multi-Dimensional Evaluation Scores across 5 key dimensions:

Dimension Range Example πŸƒ Athleticism 0–100 Speed, strength, endurance ⚽ Technical Skill 0–100 Ball control, passing accuracy 🧠 Decision-Making 0–100 Tactical awareness, timing πŸ“ Positioning 0–100 Game reading, spatial awareness πŸ‘₯ Leadership 0–100 Communication, influence Hybrid Scoring Philosophy:

Final Score = Base Score (algorithmic) + LLM Adjustment (bounded Β±10) 80% algorithmic (position-weighted baseline) 20% LLM (contextual adjustment, bounded to Β±10 for fairness) 4️⃣ Personalized Development Identifies the 2 weakest dimensions and generates an ==8-week training plan==:

Weeks Phase Focus 1–2 Foundation πŸ—οΈ Basic skill drills 3–4 Intermediate πŸ“ˆ 1v1 scenarios 5–8 Advanced πŸš€ Game-realistic situations 5️⃣ Beautiful Report Generation HTML scouting report with:

Overall score & tier (Youth, Amateur, Semi-Pro, Professional) 5-dimension radar chart Archetype comparison with elite profiles Training plan checklist Downloadable PDF How We Built It System Architecture β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Coach (Web Browser) β”‚ β”‚ React UI: Input form β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ API Gateway (REST) β”‚ β”‚ POST /scout (async) β”‚ β”‚ GET /scout/{jobId} β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ AWS Lambda: Ingest Function β”‚ β”‚ βœ“ Validate input β”‚ β”‚ βœ“ Start DynamoDB job β”‚ β”‚ βœ“ Invoke orchestrator β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Orchestrator Agent β”‚ β”‚ (Strands SDK) β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Data Retrieval Agent │─┐ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ Tactical Analyst Agent β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ Evaluation Agent β”‚β—€β”˜ β”‚ β”‚ β””β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Development Agent β”‚ β”‚ β”‚ β””β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Report Agent β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β–Ό β–Ό β–Ό DynamoDB S3 CloudWatch (Job state) (Reports) (Logs) 7 Autonomous Agents Each agent has a ==single responsibility== and independent reasoning capability:

Agent Responsibility Primary Tools 🎯 Orchestrator Pipeline control, state management invoke_step, update_status πŸ“Š Data Retrieval Normalize stats (4 sources) fetch_api, fetch_s3, normalize 🎭 Tactical Analyst Compare archetypes compare_profiles, generate_dna βš–οΈ Evaluation Score 5 dimensions compute_scores, write_results πŸ“š Development Generate training plans analyze_gaps, create_plan πŸ“„ Report Generate HTML output compile_data, upload_s3 🎬 Video Analysis Extract from footage extract_frames, claude_vision Technical Stack Layer Technology Why πŸ€– AI/LLM Claude 3.5 Sonnet Best reasoning + vision Amazon Bedrock Managed inference, no infra πŸ”— Agent Framework Strands Agents SDK Multi-agent orchestration Kiro Dev environment & steering TypeScript Type-safe, production-ready βš™οΈ Compute AWS Lambda Serverless, event-driven Node.js 20.x Fast cold starts 9 functions Modular, independent πŸ’Ύ Storage DynamoDB State, jobs, caching S3 Report storage, file uploads 🌐 API API Gateway REST endpoints Async/polling Non-blocking UX πŸ“‘ Observability CloudWatch Logs, metrics, alarms Structured logging Debugging & analytics πŸ“‹ IaC AWS SAM Infrastructure as Code template.yaml Reproducible deployment πŸ”— External API-Football Player stats database Agent Implementation: Evaluation Agent // evaluation.js (AWS Lambda function) const invokeEvaluationAgent = async (playerStats, tacticaDNA) => { // Step 1: Compute base scores using position weights const baseScores = computePositionWeights( playerStats, tacticaDNA.position );

// Step 2: Get LLM contextual adjustment const llmResponse = await bedrock.invoke({ modelId: "anthropic.claude-3-5-sonnet", messages: [{ role: "user", content: ` Base scores: ${JSON.stringify(baseScores)} Tactical DNA: ${JSON.stringify(tacticaDNA)}

    Should we adjust scores? Return JSON with:
    { adjustment: number (bounded -10 to +10), rationale: string }
  `
}]

});

const { adjustment } = parseJSON(llmResponse);

// Step 3: Apply bounded adjustment const finalScores = { athleticism: Math.min(100, Math.max(0, baseScores.athleticism + adjustment)), technical: Math.min(100, Math.max(0, baseScores.technical + adjustment)), decisionMaking: Math.min(100, Math.max(0, baseScores.decisionMaking + adjustment)), positioning: Math.min(100, Math.max(0, baseScores.positioning + adjustment)), leadership: Math.min(100, Math.max(0, baseScores.leadership + adjustment)) };

return finalScores; }; Cost Optimization Cost breakdown per report:

Component Cost Data Retrieval (API call) $0.01 Claude Sonnet (tokens) $0.15–0.40 Claude Vision (if video) $0.10–0.30 Lambda execution $0.0000002 DynamoDB writes $0.01 S3 storage $0.01 Total per report $0.30–$1.50 vs. professional tools at $1,000+/month = ==667x cheaper== πŸš€

Challenges We Ran Into Challenge 1: Agent Autonomy vs. Orchestration Problem: How do we ensure 7 independent agents work together without constant human intervention?

Solution:

Strands SDK provides tool contractsβ€”agents can only call defined tools Orchestrator agent maintains state machine (validates transitions) DynamoDB ensures idempotency (if Agent 2 fails, retry doesn't re-run Agent 1) Key Insight: Constraints enable autonomy.

Challenge 2: Fairness in Scoring Problem: LLMs can have bias. How do we prevent Claude from unfairly adjusting scores based on player demographics?

Solution: ==Bounded adjustment== with explicit filtering

LLM Adjustment ∈ [-10, +10] This ensures:

Algorithm is primary driver (80% of score) LLM provides context, not overrides (20% of score) No demographic data passed to LLM (position-only) Challenge 3: Video Analysis at Scale Problem: Processing 100+ frames from a match video is expensive. Claude Vision costs $0.003 per image.

Statistics:

Cost = 100 frames Γ— $0.003/frame = $0.30 Time = 100 frames Γ— 0.18s/frame = 18.3 seconds Optimization:

βœ… Parallel frame processing (AWS Lambda concurrent executions) βœ… Key frame extraction (skip redundant frames) βœ… Caching (store frame analysis for 7 days) Learned: Parallelization beats optimization.

Challenge 4: Position-Specific Weights Problem: Centre-backs and strikers excel in different dimensions. How do we fairly evaluate them?

Solution: Position-specific weight matrices

For centre-back:

Ξ±_CB = 0.30, 0.25, 0.25, 0.15, 0.05 For striker:

α_ST = [0.20, 0.35, 0.20, 0.15, 0.10] Each position has different priorities 🎯

Challenge 5: AWS Lambda Cold Starts Problem: First invocation of Lambda takes 2–5s (cold start). For async scouting, latency matters.

Solution:

βœ… Provisioned concurrency (keep 1 Lambda warm) βœ… Node.js 20.x (faster startup than Python) βœ… Lightweight dependencies (minimal vendor code) Challenge 6: Report Generation HTML Problem: Generating beautiful, printable HTML reports programmatically is tedious.

Solution:

βœ… Template library (EJS or Handlebars) βœ… CSS Grid for responsive design βœ… SVG for radar chart (scales infinitely) Accomplishments We're Proud Of 1️⃣ End-to-End Autonomous Pipeline βœ… ==No human intervention required.== From input β†’ report, 7 agents work independently with zero orchestration overhead. The system:

Validates itself Retries on failure Logs everything 2️⃣ Real-World Video Analysis βœ… Tested on a real Chelsea vs Arsenal U18 match:

Metric Result 🎬 Frames processed 100 ⏱️ Processing time 18.3 seconds 🏟️ Arsenal possession 58% ⚽ Pass success rate 74% πŸ•΅οΈ Player #7 detection 90% of frames Insight: Claude Vision can extract tactical data from amateur footage.

3️⃣ Hybrid Evaluation (Fair AI) βœ… Combined algorithmic precision with LLM context:

80% algorithmic (position-weighted baseline) 20% LLM (contextual adjustment, bounded to Β±10) Result: ==Fair, explainable, reproducible scores== 4️⃣ Cost Efficiency βœ… Tool Cost/Report Enterprise tools (Wyscout, StatsBomb, Opta) $33+/report TactiScout $0.30–$1.50/report Order of magnitude: ==22x cheaper== πŸ’°

5️⃣ 94 Unit Tests βœ… βœ“ Every agent tested βœ“ Every tool tested βœ“ Every edge case covered βœ“ Smoke tests validate full pipeline end-to-end 6️⃣ Responsible AI Framework βœ… Principle Implementation 🀝 Fairness No demographics in scoring πŸ‘οΈ Transparency Rationale + confidence on every score πŸ›‘οΈ Bounded AI LLM adjustments capped at Β±10 πŸ”’ Privacy 7-day URL expiry, KMS encryption ✨ Honesty Video-derived stats labelled as estimates 7️⃣ Open Source & Reproducible βœ… Full GitHub repo with:

AWS SAM template (deploy in 5 minutes) 94 unit tests Real smoke test results (timestamps, costs) React frontend ready to run What We Learned 1️⃣ Multi-Agent Orchestration is Hard, But Strands Makes It Easy Lesson: Without Strands SDK, building 7 independent agents would require:

Manual state management (error-prone) Tool contract definitions (boilerplate) Agent loop implementations (complexity) Strands abstraction: Define agents in YAML, tools in TypeScript, ==let framework handle orchestration==.

2️⃣ Cost Scales With Intelligence, Not Infrastructure We started worried about Lambda costs. Reality:

Component Cost Lambda cost $0.0000002/invocation Bedrock cost $0.003/1K tokens The expensive part is thinking, not computing. Optimize inference, not infrastructure.

3️⃣ Claude Vision Changes What's Possible Prior to Claude Vision, extracting player stats from video required:

Computer vision pipeline (pose detection) Optical character recognition (jersey numbers) Temporal modeling (frame sequences) Claude Vision does this in one API call. ==Multimodal reasoning== is a game-changer for real-world data.

4️⃣ Fairness Requires Active Design AI bias doesn't disappear by accident. We had to:

Design bounded adjustments (prevent unchecked LLM authority) Remove demographics from scoring (explicit filtering) Test edge cases (extreme scores, minority positions) Lesson: ==Responsible AI is architecture, not an afterthought.==

5️⃣ Async APIs Are Essential for User Experience Original design: Synchronous (coach waits for report)

Problem: 180-second latency = poor UX 😞

Solution: ==Async pattern==:

POST /scout ↓ Returns jobId immediately

Poll: GET /scout/{jobId} ↓ Status + report URL Coach can close browser, check back in 5 minutes. Better engagement 🎯

6️⃣ Serverless Scales, But Observability Matters At scale (100+ concurrent requests), debugging becomes hard. We invested in:

Structured logging (CloudWatch Insights queries) Request tracing (unique jobId per request) Metrics dashboards (token usage, latency percentiles) Without observability, serverless is a black box. πŸ“¦

7️⃣ Sports Domain Knowledge > Hype Not every LLM output is correct. We had to encode:

Position archetypes (14 profiles) Physical benchmarks (100m sprint times) Tactical concepts (pressing, positioning, decision trees) Lesson: ==AI amplifies expertise. Give it good domain models.==

What's Next for TactiScout Phase 2: Real Deployments πŸš€ 2.1 Grassroots Partnership Pilot with 5–10 grassroots clubs Collect feedback on report accuracy Validate cost model (prove $0.30–$1.50) 2.2 Web Interface Polish Drag-and-drop video upload Real-time agent status (show which agent is running) Comparative analysis (compare 2 players side-by-side) Export to PDF/Excel Phase 3: Advanced Features 🎯 3.1 Team-Level Analysis Instead of individual players, analyze entire teams:

Team Strength = (1/n) Γ— Ξ£(Overall Score_i) Generate formation recommendations, tactical weaknesses.

3.2 Opponent Analysis Upload opponent match footage β†’ Generate tactical counter-strategy.

3.3 Injury Risk Prediction Multi-agent system predicts injury likelihood based on:

Movement patterns (from video) Load history (minutes played) Physical metrics (speed, acceleration changes) Phase 4: Monetization πŸ’° Pricing Model Tier Price/Month Reports/Month πŸ†“ Free $0 5 ⚽ Grassroots $9.99 100 πŸ“ˆ Semi-Pro $49.99 500 πŸ† Professional $199.99 Unlimited Platform revenue covers AWS + Bedrock costs, funds development.

Phase 5: Global Expansion 🌍 5.1 Multi-Language Support πŸ‡ͺπŸ‡Έ Spanish (LATAM + Spain) πŸ‡«πŸ‡· French (Africa) πŸ‡΅πŸ‡Ή Portuguese (Brazil) πŸ‡¨πŸ‡³ Mandarin (Asia) 5.2 Regional Archetypes Different leagues have different playstyles (Premier League vs Serie A vs La Liga). Create region-specific archetype databases.

Phase 6: Sports Beyond Football ⚾ Generalize to other sports:

πŸ€ Basketball: 5 dimensions + positional archetypes (PG, SG, SF, PF, C) 🏈 American Football: Position-specific evaluation (QB, WR, CB, etc.) 🏐 Volleyball: Positional analysis (setter, outside hitter, libero) Conclusion TactiScout demonstrates that ==autonomous multi-agent AI can democratize professional-grade analysis==. By combining:

Strands Agents SDK

  • Claude 3.5 Sonnet
  • AWS Serverless ↓ Enterprise AI at grassroots prices The system is:

βœ… Autonomous: 7 agents, zero human intervention βœ… Fair: Bounded LLM, position-weighted, explainable βœ… Affordable: $0.30–$1.50 vs $1,000+ competitors βœ… Real-World Tested: Video analysis proven on live matches βœ… Open Source: Deploy in minutes, modify for your use case Imagine thousands of grassroots coaches armed with AI-powered scouting. Imagine ==no talented player going unnoticed== because they didn't play in the right city.

That's the vision. TactiScout is the first step. βš½πŸ€–

Appendix: Key Metrics Performance ⚑ Metric Value ⏱️ End-to-end pipeline time 178.8s πŸš€ API response time (async) <100ms πŸ“„ Report generation time 32.1s 🎬 Video analysis (100 frames) 18.3s Cost Analysis πŸ’΅ Component Cost/Report Claude Sonnet inference $0.15–0.40 Claude Vision (if video) $0.10–0.30 Lambda execution <$0.01 DynamoDB $0.01 S3 storage $0.01 TOTAL $0.30–$1.50 Quality Metrics ✨ Metric Value πŸ§ͺ Unit test coverage 94 tests πŸ€– Responsible AI principles 5/5 ⚽ Positional archetypes 14 πŸ“Š Scoring dimensions 5 Quick Links πŸ”— 🏠 GitHub Repository πŸ“– Full README 🎬 Demo Video πŸ† DevPost Submission Built with ❀️ for grassroots football. Powered by AWS + Anthropic. βš½πŸ€–

Football for Good. AI for All.

Built With

Share this project:

Updates