A comprehensive Electron-based desktop application for managing BMX Freestyle competitions with real-time scoring, UCI API integration, and advanced competition management features.
- Multi-competition support - Manage multiple competitions simultaneously
- Category management - Create and organize categories by gender and age group
- Club management - Register clubs with logos and track athletes
- Athlete registration - Manual registration or UCI API integration
- Real-time UCI database search - Search riders by UCI ID
- Automatic data filling - Auto-populate rider information from UCI database
- UCI ranking support - Import UCI rankings for seeding
- Excel import - Bulk import riders from Excel files
- Case-insensitive column recognition (UPPERCASE, lowercase, Capital Case)
- Automatic duplicate detection (by UCI ID or name)
- Automatic category creation
- Excel export - Export all competition data to Excel
- Detailed import reports - Shows imported riders, duplicates skipped, and errors
- Real-time score submission - Judges can submit scores via web interface
- Socket.IO integration - Instant score updates across all devices
- Score validation - Head judge validates all scores before official recording
- Timer management - Configurable run duration with visual countdown
- DNS/DNF tracking - Mark riders as Did Not Start or Did Not Finish
- Multiple seeding methods:
- UCI Ranking
- Custom Ranking
- Snake seeding
- Random
- Manual ordering
- Drag-and-drop reordering - Easy startlist adjustments
- Multi-phase support - Qualification, Semifinal, Final
- Real-time results - Live updating results board
- Display interface - Large screen display for audiences
- Score averaging - Automatic calculation of final scores
- Rankings export - Export final standings
- Node.js 16.x or higher
- npm 7.x or higher
- Electron 28.x (included in dependencies)
```bash git clone https://github.com/ihillslogicalis/bmx-freestyle-scoring.git cd bmx-freestyle-scoring ```
```bash npm install ```
Create a `.env` file in the root directory: ```env AZURE_CLIENT_ID=your_client_id AZURE_CLIENT_SECRET=your_client_secret AZURE_SCOPE=https://ucidataride.org/[your-scope]/.default AZURE_TOKEN_URL=https://login.microsoftonline.com/ucidataride.org/oauth2/v2.0/token ```
```bash npm start ```
```bash npm run start:judge ```
```bash npm run start:display ```
```bash npm run build:mac ```
```bash npm run build:win ```
```bash npm run build:all ```
The application runs a local server on port 3000. Other devices on the same network can connect using:
- Head Judge: `http://[SERVER_IP]:3000/head-judge.html`
- Judge: `http://[SERVER_IP]:3000/judge.html`
- Display: `http://[SERVER_IP]:3000/display.html`
The server IP is displayed in the application's menu: `Server > View Connection IP`
The Excel import accepts the following columns (case-insensitive):
| Column | Alternative Names | Required |
|---|---|---|
| Full Name | Name, FULLNAME | ✅ Yes |
| UCI ID | UCIID, UCI_ID | ❌ No |
| Country | COUNTRY | ✅ Yes |
| Club | CLUB | ❌ No |
| Category | CATEGORY | ✅ Yes |
| Gender | GENDER | ✅ Yes |
| Age Group | AGE GROUP, AGEGROUP | ✅ Yes |
| Photo Path | PHOTO | ❌ No |
The application uses SQLite for local data storage. The database file is created automatically at `bmx_freestyle.db`.
- Frontend: HTML, CSS, JavaScript (Vanilla)
- Backend: Node.js, Express
- Real-time: Socket.IO
- Desktop: Electron
- Database: SQLite (better-sqlite3)
- Excel: xlsx library
- UCI API: Axios with OAuth2 (Azure AD)
MIT
Ivan Hills (ivan.hills@gmail.com)
Contributions, issues, and feature requests are welcome!
For support, email ivan.hills@gmail.com or create an issue in the GitHub repository.
Co-Authored-By: Warp agent@warp.dev