Inspiration
As League of Legends players, we've all asked ourselves: "How did I really perform this season?" Current stat sites like op.gg give you numbers, but they don't tell your story. We wanted to create something that goes beyond cold statistics—something that captures the journey, the struggles, the breakthroughs, and the unforgettable moments that make each season unique.
We envisioned an AI-powered platform that transforms raw match data into personalized, engaging narratives. Using AWS AI services and the Riot Games API, Summoner Chronicle creates comprehensive year-end recaps with multiple features: AI-generated stories in 5 distinct personalities, voice narration, savage but helpful roasts, personalized coaching, performance analytics, and social sharing capabilities.
What It Does
Summoner Chronicle is an AI-powered agent that creates comprehensive, shareable year-end recaps for League of Legends players. Here's what makes it unique:
Core Features:
AI Chronicle with 5 Personality Styles
- Uses AWS Bedrock (Claude 3.5 Sonnet) to generate epic 3-act narratives
- 5 distinct personalities : Analyst, Champion, Hype, Sensei, and Bard
- Each personality provides a completely different storytelling perspective
Voice Narration
- AWS Polly brings your chronicle to life with neural voices
- Different voice for each personality (Matthew, Joey, Brian, Joanna)
- Audio player with professional UI
Roast Master 3000
- Claude 3.5 Sonnet delivers savage but constructive AI roasts
- 3 roast modes: Savage, Friendly, and Meme
- Uses League memes and community humor
AI Coaching Agent
- Personalized improvement tips based on match data
- Answers specific player questions
- Identifies persistent strengths and weaknesses
Performance Timeline Analysis
- Lambda-powered pattern detection
- Clutch moment identification
- Tilt score calculation
- Interactive visualizations
Live Game Tracker
- Real-time match tracking using Riot Spectator API v5
- Shows current game participants and stats
- Team composition analysis
Social Sharing
- 1200x675 shareable image cards
- QR codes for chronicle links
- Discord webhook integration
- X (Twitter) sharing with auto-generated text
AI-Narrated Video Chronicles
- Titan image generation
- AWS Polly voiceover
- FFmpeg rendering in Lambda
- 30-second highlight videos
Real-Time Stats Dashboard
- KDA, win rates, champion mastery
- Data from Riot API v5 cached in DynamoDB
- Performance visualizations with Recharts
How We Built It
Architecture:
Frontend:
- Next.js 16 (App Router with Turbopack)
- React 19 with TypeScript
- TailwindCSS for modern, responsive UI
- Recharts for data visualizations
Backend (100% Serverless on AWS):
- AWS Lambda - 7 serverless functions for different agents
- AWS Step Functions - Orchestrates chronicle generation pipeline
- Amazon DynamoDB - Stores chronicles, stats, and match data
- Amazon S3 - Stores match data, generated audio, videos, and images
- AWS API Gateway - RESTful API endpoints
AI Services:
- Amazon Bedrock (Claude 3.5 Sonnet) - Narrative generation, coaching, roasting
- Amazon Polly - Neural voice synthesis (5 different voices)
- Amazon Titan Image Generator - AI image generation for videos
Riot Games Integration:
- Riot API v5 - Match history, player stats, live game data
- Fetches full-year match history (up to 100 matches)
- Aggregates stats across multiple matches
- Regional routing support
Infrastructure as Code:
- AWS CDK (TypeScript) for all infrastructure
- Automated deployment with
cdk deploy - Tagged resources:
rift-rewind-hackathon: 2025
Data Flow:
- User Input → Riot ID (GameName#TAG)
- Region Detection → AWS Lambda detects player region
- Match Fetching → Step Functions triggers match data retrieval
- Data Aggregation → Lambda processes 100 matches, calculates stats
- AI Generation → Bedrock generates personalized narrative
- Voice Synthesis → Polly creates audio narration
- Storage → DynamoDB + S3 store results
- Frontend Display → Next.js renders with modern UI
Challenges We Ran Into
Match Data Volume & Performance
- Problem: Processing 100 matches sequentially took 30+ seconds, causing timeouts
- Solution: Implemented parallel processing with Promise.allSettled() in Lambda, reduced to 5 seconds
Regional Riot API Routing
- Problem: Different regions (NA, EUW, KR) require different API endpoints
- Solution: Built region detection Lambda with automatic routing to correct regional API base
Step Functions State Management
- Problem: Passing personality parameter through multiple Step Functions states
- Solution: Properly structured task input with
personality.$: "$.personality"notation
DynamoDB Query Optimization
- Problem: Chronicle lookups by puuid were slow without proper indexing
- Solution: Designed partition key strategy with GSI for efficient queries
Video Generation Lambda Timeout
- Problem: Titan image generation + FFmpeg rendering exceeded 15-minute Lambda limit
- Solution: Optimized by generating 4 images concurrently and pre-compiling FFmpeg binary
Text-to-Speech Quality
- Problem: Emojis in narratives caused Polly to read descriptions ("microphone", "fire")
- Solution: Comprehensive Unicode emoji removal (10+ ranges) before synthesis
Accomplishments We're Proud Of
- Multi-Modal AI Integration - Successfully combined Bedrock (text), Polly (voice), and Titan (images) in one cohesive experience
- Production-Grade Architecture - Fully serverless, auto-scaling AWS infrastructure handling 100+ match processing
- 5 Distinct Personalities - Advanced prompt engineering creates genuinely different narrative styles
- Complex Video Pipeline - Orchestrated Titan image generation, Polly narration, and FFmpeg rendering in Lambda
- Real-Time Features - Live game tracking with Riot Spectator API v5
- Zero Dummy Data - All features use real Riot API v5 data
- Social Sharing - Complete sharing suite (QR codes, Discord webhooks, X integration)
- Roast Quality - Claude generates hilarious but constructive feedback
What We Learned
AWS Bedrock Prompt Engineering
- How to structure prompts for consistent, high-quality output
- Using system/task/context/rules framework
- Personality injection techniques
AWS Polly Best Practices
- Neural vs standard voices
- Text preprocessing for clean audio
- SSML alternatives
Step Functions Orchestration
- Parallel execution for efficiency
- Error handling and retries
- Parameter passing between states
DynamoDB Design
- Partition key design for fast queries
- GSI for secondary access patterns
- Caching strategies
Riot API v5
- Regional routing differences
- Rate limiting strategies
- Match data structure
Cost Optimization
- Using smaller Bedrock models (Claude Sonnet vs Opus)
- Caching in DynamoDB to avoid redundant API calls
- Efficient Lambda memory allocation
What's Next for Summoner Chronicle
Champion-Specific Deep Dives
- Per-champion performance analysis
- Matchup win rates
- Build recommendations
Friend Comparisons
- Compare stats with friends
- Joint chronicles
- Team synergy analysis
Seasonal Tracking
- Month-over-month progress
- Rank progression visualization
- Meta adaptation insights
More Personalities
- Add 5 more narrative styles
- Community-voted personalities
- Custom personality builder
Mobile App
- iOS/Android native apps
- Push notifications for new chronicles
- Offline mode
Advanced Video Generation
- Longer videos (2-3 minutes)
- Match highlight integration
- Custom music selection
Here’s the added “Testing & Validation” section you can include at the end of your Devpost submission 👇
🧪 Testing & Validation
To help judges and testers experience Summoner Chronicle with real data, we’ve provided actual Riot player IDs and match IDs for validation.
✅ Riot ID for Real Player
- Player:
NattyNatt#RANK1 - Region: Korea (KR) Use this Riot ID to generate a real chronicle, including AI storytelling, voice narration, roast, analytics etc.
✅ Match ID for Performance Pattern Analyzer
- Match ID:
KR_7902692963This match belongs to the above player and can be used to test the Performance Pattern Analyzer feature. It will demonstrate: - Clutch moment detection
- Tilt score calculation
- Interactive timeline rendering
✅ Live Game Tracker Testing
For the Live Game Tracker feature:
- You must use a player currently in an active game.
- The app automatically detects if the player is live using the Riot Spectator API v5.
When a live game is detected, the system displays:
- Real-time participants
- Team compositions
- Live stats and match progress
This ensures real-time validation of the tracking pipeline and AWS-Lambda-based updates.
🧩 Note: You can also test with any real Riot player ID, and Summoner Chronicle will automatically fetch their live or recent match data using the Riot API — no dummy data, only authentic results.
Built With
- amazon-dynamodb
- amazon-polly
- amazon-titan-image-generator
- amazon-web-services
- aws-api-gateway
- aws-bedrock
- aws-cdk
- aws-lambda
- aws-step-functions
- claude-3.5-sonnet
- html2canvas
- next.js-16
- react-19
- recharts
- riot-games-api-v5
- spectator-api-v5
- tailwindcss
- typescript
Log in or sign up for Devpost to join the conversation.