A complete live broadcast overlay system designed for the brazilian AeroDesign competitions, allowing you to display dynamic information over your video stream in OBS.
- Real-time Overlays: Display team information, aircraft photos, flight results and more
- Web-based Control Panel: Easy-to-use interface to control what appears on the stream
- OBS Integration: Works seamlessly with OBS Browser Sources
- Mock API: Pre-loaded with sample data for testing
- Customizable: Show/hide different elements, add custom messages, etc
- Responsive Design: Professional-looking overlays with smooth animations
- Web Components: Modular, reusable components for easy team development
The overlay can show:
- Team Information: Team name, university, aircraft photo
- Current Battery: Which round (battery) the team is currently flying
- Flight Results: Results from previous batteries with validation status and scores
- Custom Messages: Display important announcements or messages
โโโโโโโโโโโโโโโโโโโ
โ Control Panel โ โ You control the overlay here
โ (Web Browser) โ
โโโโโโโโโโฌโโโโโโโโโ
โ
โ
โโโโโโโโโโโโโโโโโโโ
โ Python Backend โ โ FastAPI server with REST API
โ (Port 8000) โ
โโโโโโโโโโฌโโโโโโโโโ
โ
โ
โโโโโโโโโโโโโโโโโโโ
โ Overlay Page โ โ Add this as Browser Source in OBS
โ (Polls API) โ
โโโโโโโโโโโโโโโโโโโ
The project is built with native Web Components for better team collaboration:
- Backend Developer: Works on
backend/main.py(Python/FastAPI) - UI/UX Developer: Works on component styles and animations
- Frontend Logic Developer: Works on component behavior and state management
- Python 3.11 or higher
- UV package manager (or pip)
- OBS Studio (for broadcasting)
- A modern web browser
- Clone the repository:
git clone git@github.com:rafaellehmkuhl/AeroDesign-Live-Streaming-System.git- Install dependencies:
./dev.sh installNotice you need uv installed on your system, as it is used for package management on this repository.
- Start the backend server:
./dev.sh startThe server will start on http://localhost:8000
- Open the Control Panel:
Open your web browser and go to:
http://localhost:8000/control-panel/index.html
There you can show and hide the overlays, decide which team will appear in the screen, etc.
- Test the overlay in browser:
Before adding to OBS, you can see the overlay in any browser at:
http://localhost:8000/overlay/index.html
-
Open OBS Studio
-
Add a Browser Source:
- Click the
+button in the Sources panel - Select "Browser"
- Name it "Aero Design Overlay"
- Click the
-
Configure the Browser Source:
- URL:
http://localhost:8000/overlay/index.html - Width:
1920 - Height:
1080 - โ Check "Shutdown source when not visible"
- โ Check "Refresh browser when scene becomes active"
- URL:
-
Position the overlay:
- The overlay is designed for 1920x1080 (Full HD)
- It should cover your entire video canvas
- Elements are positioned to not obstruct the center of the video
-
Layer it over your camera:
- Make sure the Browser Source is above your camera/video source in the layers
- Show Overlay: Make the overlay visible on stream
- Hide Overlay: Hide all overlay elements
- Toggle Overlay: Switch visibility on/off
Click on any team card to:
- Select that team
- Automatically show their information on the overlay
- Display their current battery and flight results
- Show Team Info: Toggle the team information card
- Show Flight Results: Toggle the flight results panel
- Show Current Battery: Toggle the current battery badge
- Custom Message: Add a custom message that appears at the top
Click "Apply Settings" after making changes.
The backend provides a REST API that you can use programmatically:
GET /api/overlay/state- Get current overlay state (polled by OBS)PUT /api/overlay/state- Update overlay statePOST /api/overlay/show?team_id=<id>- Show overlay for specific teamPOST /api/overlay/hide- Hide overlayPOST /api/overlay/toggle- Toggle overlay visibility
GET /api/teams- Get all teamsGET /api/teams/{team_id}- Get specific teamPOST /api/teams- Create new teamPUT /api/teams/{team_id}- Update teamDELETE /api/teams/{team_id}- Delete team
POST /api/teams/{team_id}/results- Add flight resultPUT /api/teams/{team_id}/battery- Update current battery
# Show overlay with team
curl -X POST "http://localhost:8000/api/overlay/show?team_id=team001"
# Hide overlay
curl -X POST "http://localhost:8000/api/overlay/hide"
# Get all teams
curl "http://localhost:8000/api/teams"
# Add flight result
curl -X POST "http://localhost:8000/api/teams/team001/results" \
-H "Content-Type: application/json" \
-d '{"battery_number": 4, "status": "validated", "score": 9.5, "notes": "Excellent performance"}'The system comes pre-loaded with some teams that participated in the 2025 competition. Each team has sample (fake) flight results you can use for testing.
In overlay/index.html, modify the POLL_INTERVAL constant:
const POLL_INTERVAL = 500; // milliseconds (default: 500ms)Lower values = more responsive, higher CPU usage Higher values = less responsive, lower CPU usage
In backend/main.py, modify the port in the if __name__ == "__main__": block:
uvicorn.run(app, host="0.0.0.0", port=8000) # Change 8000 to your portaero-tv-transmission-overlayer/
โโโ backend/
โ โโโ main.py # FastAPI backend server
โ โโโ mock_data.json # Team data
โโโ shared/
โ โโโ components/
โ โโโ base-component.js # Base class for all components
โ โโโ api-service.js # Centralized API communication
โโโ overlay/
โ โโโ index.html # OBS browser source overlay
โ โโโ components/
โ โโโ team-info-card.js # Team info display component
โ โโโ flight-results.js # Flight results component
โ โโโ custom-message.js # Custom message component
โโโ control-panel/
โ โโโ index.html # Control panel interface
โ โโโ components/
โ โโโ status-indicator.js # Status display component
โ โโโ team-card.js # Team selection card component
โ โโโ control-buttons.js # Quick action buttons
โ โโโ notification-toast.js # Notification system
โโโ pyproject.toml # Python dependencies (UV)
โโโ README.md
- Make sure the backend is running
- Check the OBS browser source URL is correct
- Try refreshing the browser source (right-click โ Properties โ Refresh cache of current page)
The backend has CORS enabled for all origins in development. If you need to restrict it, modify the CORSMiddleware configuration in backend/main.py.
If port 8000 is already in use:
- Change the port in
backend/main.py - Update the API_URL in
overlay/index.html - Update the API_BASE in
control-panel/index.html
Feel free to customize and extend this system for your competition needs!
This project is open source and available for use in your competitions.
Built for the Aero Design competition with โค๏ธ
Need help? Check the API documentation at http://localhost:8000/docs (FastAPI automatic docs)