A comprehensive real-time tournament management system for FIRST LEGO League competitions featuring audience displays with chroma key support, table displays, match scheduling, and live rankings integration.
- Unified control panel for managing all displays and tournament operations
- Real-time display mode switching (Match Overlay, Rankings, Sponsors, Blank)
- Match timer control with audio cues (start bell, warning beep, stop buzzer)
- Session control for managing match schedules across table displays
- Live status monitoring (connection status, client counts, last rankings update)
- Authentication management with token expiry tracking
- Chroma key ready - Magenta (#ff00ff) background for video mixing
- Match overlay mode - Timer, event info, and team assignments for up to 4 tables
- Rankings display - Full-screen auto-scrolling rankings table
- Sponsor slideshow - Rotating sponsor logos with smooth transitions
- Auto-refresh rankings every 15 seconds (pauses during active matches)
- Match-aware timing - Automatically pauses rankings refresh during matches
- Individual table screens showing team information per table
- Unlimited table support - Dynamically detects tables from schedule
- Table selection screen - Choose which table each display represents
- Session synchronization - All tables update together via controller
- Dynamic font sizing - Automatically adjusts for long team names
- Match schedule display - Shows session number and time
- Match schedule viewer - Sortable table view of all sessions
- Team scores viewer - Rankings with detailed scoring information
- Live FLL Nexus integration - Real-time data synchronization
- OAuth authentication - Secure login with token management
- Event selection - Choose region and event dynamically
nexus-fll/
├── app.py # Flask + Socket.IO server
├── main.py # FLLNexusConnector API client
├── requirements.txt # Python dependencies
├── templates/
│ ├── index.html # Landing page
│ ├── controller.html # Main control panel
│ ├── display.html # Audience display (chroma key)
│ ├── table_display.html # Individual table screens
│ ├── setup.html # Event setup & authentication
│ ├── schedule.html # Match schedule viewer
│ └── scores.html # Team scores viewer
├── static/
│ ├── css/
│ │ ├── controller.css # Shared controller styling
│ │ └── display.css # Display styling (chroma key)
│ ├── images/
│ │ ├── flltm.svg # FLL logo
│ │ ├── flllogo.svg # Event logo
│ │ └── sponsors/ # Sponsor logos
│ └── audio/
│ ├── startbell.mp3 # Match start sound
│ ├── warning.mp3 # 30-second warning
│ └── stopbell.mp3 # Match end sound
└── firebase_refresh_token.txt # OAuth refresh token (generated on first auth)
- Python 3.7 or higher
- Modern web browser with WebSocket support
- FLL Nexus account (for live data integration)
-
Clone the repository:
cd nexus-fll -
Install dependencies:
pip install -r requirements.txt
-
Run the server:
python app.py
-
Access the application:
- Landing page: http://localhost:5000
- Controller: http://localhost:5000/controller
- Event Setup: http://localhost:5000/setup
- Navigate to Controller → Event Setup
- Click 🔐 Authenticate
- Log in with your FLL Nexus credentials
- Your refresh token will be saved to
firebase_refresh_token.txt - Token expiry is displayed and tracked automatically
- In Event Setup, enter your region (e.g., "socal", "norcal")
- Click 📋 Load Events to see available events
- Select your event from the dropdown
- Click ✓ Set Event to configure the system
- Rankings will automatically refresh
For Audience Display:
- Open
/displayon the computer connected to your video mixer - Configure chroma key for magenta (#ff00ff) background
- The display will show the selected mode from the controller
For Table Displays:
- Open
/table_displayon each table screen - When first opened, you'll see a table selection screen
- The system automatically detects the number of tables from your schedule
- Click the appropriate table button for each screen (supports unlimited tables)
- Use the controller to navigate sessions
- Open Controller on your control station
- Open Audience Display on your video mixer computer
- Open Table Display on each table screen (if using)
- Set the current event in Event Setup
- Switch audience display to Rankings or Sponsors
- In the controller, use Session Control to select the current match
- Table displays will update to show team assignments
- Click
▶️ Start Match to begin the countdown - The display automatically switches to Match Overlay mode
- Audio cues play at key times:
- Start bell - Match begins (2:29)
- Warning beep - 30 seconds remaining
- Stop buzzer - Match ends (0:00)
- Use ⏸️ Pause to pause if needed
- Use 🔄 Reset to reset the timer
- Switch to Rankings to show current standings
- Rankings auto-refresh every 15 seconds
- Use Session Control arrows to advance to next match
- Table displays update automatically
- Event Setup - Configure event and authentication
- Audience Display - Open audience display window
- Table Display - Open table display window
- Match Schedule - View full tournament schedule
- Team Scores - View detailed rankings and scores
Select the display mode:
- Match Overlay - Show timer and team info during matches
- Rankings - Display current team standings
- Event Info - Show event information with QR code to event page
- Sponsors - Show sponsor slideshow
- Blank Screen - Hide all overlays (chroma key only)
▶️ Start - Begin countdown (auto-switches to match overlay)- ⏸️ Pause - Pause the timer
- 🔄 Reset - Reset to 2:30
- ⬅️ Previous - Go to previous match
- Next ➡️ - Advance to next match
- Jump to Session - Select specific session from dropdown
- Last Rankings Update - Timestamp of last data refresh
- 🔄 Refresh Rankings Now - Manually fetch latest data
- Timer with color coding:
- White: >30 seconds
- Yellow: 10-30 seconds
- Red: <10 seconds
- Event name and logos
- Team assignments for up to 4 tables
- Lower third showing team numbers and names
- Full-screen table with:
- Rank
- Team Number
- Team Name
- High Score
- Average Score
- Rounds Played
- Sticky header while scrolling
- Auto-scroll through all teams
- Pauses during active matches
- QR code in bottom-right corner linking to live leaderboard
- Event name with FLL Nexus logo
- Large QR code linking to event page
- Clean, centered design
- Perfect for pre-event display or breaks
- Rotating sponsor logos
- 5-second display per sponsor
- Smooth fade transitions
- Customizable logo set
- Add SVG files to
static/images/sponsors/ - Edit
display.htmlline ~501:sponsorLogos = ['flllogo.svg', 'viasat.svg', 'your-logo.svg'];
Edit static/css/display.css:
body {
background-color: #ff00ff; /* Change to your preferred color */
}Edit controller.html:
let currentSeconds = 150; // 2:30 in seconds (change as needed)The audience display match overlay shows 4 tables by default in the lower third. To change this, edit display.html line ~481:
const tables = ['Table 1', 'Table 2', 'Table 3', 'Table 4']; // Add/remove tables for audience viewNote: Individual table displays support unlimited tables automatically based on your schedule data.
Replace files in static/audio/:
startbell.mp3- Match start soundwarning.mp3- 30-second warningstopbell.mp3- Match end sound
register_client- Register display type (audience_display, table_display)set_overlay- Change audience display modetimer_update- Update match timerrequest_rankings- Fetch fresh rankings datarequest_schedule- Fetch match schedulerequest_scores- Fetch team scoresset_event- Change event/regionload_events- List available eventsset_session- Change current sessionrequest_event_info- Get current event inforequest_user_info- Get authentication statuslogout- Clear authentication
connection_established- Connection confirmationoverlay_selection- Display mode updatetimer_data- Timer state updaterankings_data- Rankings updateschedule_data- Schedule updatescores_data- Scores updateevents_list- Available eventsevent_info- Current event informationuser_info- User authentication statussession_update- Current session changeclient_counts- Connected client statisticsauth_status- Authentication statelogout_success- Logout confirmation
- Backend: Flask + Flask-SocketIO for WebSocket communication
- Frontend: Vanilla JavaScript with Socket.IO client
- Styling: CSS3 with FLL brand colors and gradients
- Real-time sync: All displays update instantly via WebSockets
- Chrome/Edge (recommended)
- Firefox
- Safari
- Requires JavaScript and WebSocket support
- All devices must be on the same network
- Server broadcasts to all connected clients
- Minimal bandwidth required (WebSocket events are small)
- Lightweight client-side rendering
- Efficient WebSocket communication
- Auto-cleanup of disconnected clients
- No database required (uses FLL Nexus API)
- Check connection status in controller (should show "Connected")
- Open browser console (F12) for error messages
- Verify all devices are on same network
- Refresh the page to reconnect WebSocket
- Ensure you're using valid FLL Nexus credentials
- Check that
firebase_refresh_token.txtexists and is readable - Token expires after a period - re-authenticate if needed
- Check server logs for authentication errors
- Verify authentication in Event Setup
- Confirm region and event_id are correct
- Check server logs for API errors
- Try clicking "🔄 Refresh Rankings Data"
- Ensure controller is connected (check status indicator)
- Refresh audience display page
- Check browser console for WebSocket errors
- Click anywhere on the display page to enable audio (browser requirement)
- Check that audio files exist in
static/audio/ - Verify browser audio is not muted
- Ensure schedule data is loaded (check controller)
- Verify table parameter is correct (0-3)
- Check that session is selected in controller
python app.pyServer runs on http://0.0.0.0:5000 by default.
- Flask - Web framework
- Flask-SocketIO - WebSocket support
- python-socketio - Socket.IO implementation
- requests - HTTP client for API calls
- FLLNexusConnector - Custom API client
- Add WebSocket event handlers in
app.py - Create frontend listeners in HTML templates
- Update this README with new functionality
Built for FIRST LEGO League tournaments. Inspired by the CowFLLTM tournament management system.
This project is provided as-is for FIRST LEGO League events.
For issues or questions:
- Check the troubleshooting section
- Review server logs for errors
- Open browser console (F12) for client-side errors
- Verify all setup steps are completed
FLL Nexus Tournament Management System - Professional tournament display solution for FIRST LEGO League competitions.