🚀 Live Demo
View the Live Operational Dashboard
(Note: If the demo is currently unreachable, please see the "Running Locally" section below.)
💡 The Architecture
This project was built with a "Logic-First" philosophy. By decoupling the Decision Engine from the UI, the system ensures that safety recommendations are computed with high precision, independent of UI render cycles.
State Controller: A centralized React state machine that synchronizes simulation ticks, incident reports, and manual gate overrides.
Visual Interface: A responsive dashboard built with Tailwind CSS, featuring a "Live Data Inspector" for real-time state verification.
Incident Dispatching: A streamlined reporting form for stewards to log and categorize medical or security incidents instantly.
Dynamic Recommendations: Automatically suggests gate openings and spectator rerouting when sector density crosses safety thresholds (Safe < 60% → Critical > 95%).
Fail-Safe Mode: Includes an "Offline/Mock" fallback service to ensure the dashboard remains fully functional even in low-connectivity environments. To verify the system's logic, we recommend the following test sequence:
Observe Baseline: Upon loading, the dashboard initializes all zones to a safe 40% occupancy.
Trigger Simulation: Toggle the Live Sim switch. Observe the Live Data Inspector (at the bottom) and see the JSON state "breathing" as values fluctuate.
Test Decision Logic: Manually increase occupancy in a zone to > 95% and observe the Flow Recommendations panel updating with emergency directives.
Log an Incident: Fill out the Field Incident Report and observe the Active Live Operations Log update instantly. If you wish to run this locally, ensure you have Node.js installed, then: # Clone the repository git clone (https://github.com/kaizo-x/stadium-ops-assistant)
npm install
npm run dev ⚙️ Tech Stack Framework: Next.js 16 (App Router)
Language: TypeScript
Styling: Tailwind CSS
State Management: React Hooks (Centralized State)
Logic: Pure TypeScript Decision Engine
Built for the PromptWars challenge | [Sayali Pagare]