One of the key problems addressed by the platform is the manual processing of match-result screenshots. Tournament staff traditionally need to read screenshots, identify players and teams, enter kills and rankings, calculate points, and update standings manually.
My responsibilities included end-to-end implementation of the platform and the AI workflow:
The application uses a web frontend backed by a centralized PHP API and MySQL database. Browser requests communicate with named API actions, while the AI scanner processes screenshots server-side through a multimodal AI endpoint.
Player / Staff / Admin
│
▼
HTML + CSS + JavaScript UI
│
│ JSON / Multipart Requests
▼
PHP API (api/index.php)
│
├─────────────┼─────────────┐
│ │ │
▼ ▼ ▼
MySQL Multimodal AI Firebase
Database API FCM
│ │ │
│ ▼ │
│ Image Processing │
│ & Data Extraction │
│ │ │
└─────────────┴─────────────┘
│
▼
Match Results
│
▼
Leaderboards
A pragmatic, production-oriented stack combining classic web engineering with modern multimodal AI capabilities.
The scanner supports multiple screenshots for a single scan. The backend validates image content and size, generates a scoped cache key, sends the multimodal request, validates the returned JSON, and presents the results as editable entries for staff review.
Match Screenshot
↓
Image Validation
↓
Multimodal AI Processing
↓
Structured JSON Extraction
↓
Response Validation
↓
Player / Team Matching
↓
Staff Review & Correction
↓
Point Calculation
↓
Database Persistence
↓
Leaderboard Update
The scanner uses a server-side multimodal AI request rather than a separate standalone OCR SDK. The current implementation uses the configured Qwen vision model qwen/qwen3.7-flash through an OpenAI-compatible API with non-streaming output and deterministic temperature settings.
AI-generated player names may contain spelling differences or formatting variations, so the backend performs additional matching against registered players using multiple strategies:
similar_text().The scanner does not directly publish AI-generated results. Every extraction passes through a verification, review, and correction stage before being saved to the database.
AI Result → Validation → Review → Correction if required → Save
Staff can perform the following actions during review:
Roster entries below the configured confidence threshold are explicitly marked for review and cannot be saved until corrected.
The scanner extracts kills and placement information rather than directly deciding the final tournament score. The application then calculates points using the configured kill-point value and placement-point template. The final standings are calculated using the stored match results and configured scoring rules.
The administration system provides centralized management for tournament operations. Implemented capabilities include:
The platform uses MySQL for persistent application data. The primary saved match-result flow connects registrations with map-level point records, while temporary rosters provide a match-specific player snapshot without modifying the permanent team roster.
esports_teams
esports_players
registrations
match_points
match_proofs
payment_orders
session_tokens
fcm_tokens
scheduled_notifications
staff_activity_logs
match_temporary_roster
The implementation includes several safeguards for concurrent activity. The system is implemented as a centralized PHP API rather than a distributed worker architecture, so AI processing remains synchronous at request time. Caching and locking are used to reduce duplicate work and unnecessary provider requests.
The implementation currently supports:
Eagle Esports combines full-stack web engineering with practical AI integration to solve a real operational problem in tournament management. The AI Magic Point Scanner transforms match screenshots into structured player, kill, and placement data; validates the results; matches players to registered teams; allows staff review and correction; calculates tournament points; and persists the final results into the tournament system.
The project demonstrates experience across: