A fun, real-time web-based scoreboard for ARRL Field Day events using N3FJP logging software
Features β’ Screenshots β’ Installation β’ Configuration β’ Usage
Transform your Field Day operation with this techy, real-time scoreboard that connects directly to N3FJP's API. Display live statistics, operator performance, band activity, and worldwide contacts on any screen - from laptops to 4K TVs!
Built for clubs who want to:
- π― Engage operators with real-time stats and milestones
- π Track performance across multiple stations
- π Visualize global reach on an interactive map
- π Calculate accurate Field Day bonus points
- π Celebrate achievements with fun animations
- Live QSO Counter - Watch contacts climb in real-time
- Operator Leaderboards - Friendly competition tracking
- Band Activity - Visual breakdown by frequency
- Contact Rate Graphs - Hourly performance metrics
- Field Day Scoring - Automatic bonus point calculation
- Leaflet.js Integration - Professional mapping with offline support
- Contact Visualization - See every state and country worked
- Distance Lines - Connections from your QTH to each contact
- Theme-Aware Tiles - Matches dark/light mode automatically
- Milestone Celebrations - Animations at 100, 500, 1000+ contacts
- Band Goal Stars - Visual rewards when goals are met
- Fire Effect - Rates >100 QSOs/hr get special treatment π₯
- New Band Alerts - Celebrate first contact on each band
- Station Cards - Track each physical operating location
- Current Operator - See who's running each station
- Recent Contacts - Last 5 QSOs per station
- Band/Mode Display - Know what's happening at a glance
- 4-Page Carousel - Auto-rotating display (15s intervals)
- Dark/Light Themes - Easy on the eyes day or night
- Manual Navigation - Pause, prev/next controls
- Keyboard Shortcuts - Arrow keys, spacebar, number keys
- Responsive Design - Optimized for 1080p displays
- Live Weather - Current conditions at your QTH
Fully compliant with ARRL Field Day rules:
- Class multipliers (1A, 2O, etc.)
- Power multipliers (Emergency power = 2x)
- 11 bonus categories (100 pts each)
- NTS message tracking (10 pts each)
- Real-time final score calculation
Real-time contact counter with QSO points, bonus points, and final Field Day score. Operator leaderboards show both contacts and points earned.
Full-screen celebrations trigger at major milestones (100, 500, 1000 contacts) and when opening new bands. Keeps operators motivated!
Band activity with goal indicators (β stars when goals met), hourly timeline chart, multipliers, best hour, and live rate statistics with fire effect π₯
Track multiple physical stations simultaneously. See current operator, band, mode, and last 5 contacts for each location.
Leaflet.js powered map shows all countries and states worked. Lines connect your QTH to each contact. Click markers for location names.
- N3FJP Logging Software (Any contest logger with API enabled)
- Python 3.8+
- Network connectivity between scoreboard and N3FJP PC
- Clone the Repository
git clone https://github.com/kc9mne/N3FJP-Scoreboard-API.git
cd N3FJP-Scoreboard-API- Install Dependencies
pip install -r requirements.txt- Download Offline Map Support (one-time setup)
python download_leaflet.py- Configure Your Event (see Configuration)
nano config.json- Enable N3FJP API
- In N3FJP: Other β TCP/IP Interface
- Check "Enable TCP/IP Server"
- Note the port (default: 1100)
- Start the Server
python -m uvicorn server:app --host 0.0.0.0 --port 8080- Open in Browser
http://localhost:8080
# Linux/Raspberry Pi
chromium-browser --kiosk --app=http://localhost:8080
# Windows
chrome.exe --kiosk --app=http://localhost:8080
# macOS
open -a "Google Chrome" --args --kiosk --app=http://localhost:8080Edit config.json with your event details:
{
"n3fjp_host": "127.0.0.1",
"n3fjp_port": 1100,
"club_name": "Your Club Name",
"callsign": "N0CALL",
"event_name": "Winter Field Day 2026"
}{
"n3fjp_host": "192.168.1.100",
"n3fjp_port": 1100,
"seed_count": 5000,
"tail_count": 80,
"refresh_seconds": 3,
"club_name": "Your Amateur Radio Club",
"callsign": "M3OW",
"event_name": "Winter Field Day 2026",
"home_lat": 41.3,
"home_lon": -88.4,
"home_location": "McHenry, IL",
"field_day_class": "2O",
"emergency_power": true,
"media_publicity": false,
"public_location": true,
"public_information_table": true,
"nts_message_originated": 10,
"nts_message_handled": 10,
"satellite_qso": false,
"w1aw_bulletin": false,
"educational_activity": false,
"social_media": true,
"youth_participation": true,
"site_visit_official": false,
"weather_enabled": true,
"band_goals": {
"160": 5,
"80": 50,
"40": 100,
"20": 200,
"15": 50,
"10": 50,
"6": 10,
"2": 5
}
}| Parameter | Type | Description |
|---|---|---|
n3fjp_host |
string | IP address of N3FJP logging PC |
n3fjp_port |
int | N3FJP TCP/IP port (default: 1100) |
club_name |
string | Your club name (shown in header) |
callsign |
string | Event callsign |
event_name |
string | Event name (e.g., "Winter Field Day 2026") |
home_lat |
float | Latitude for map center and weather |
home_lon |
float | Longitude for map center and weather |
field_day_class |
string | Station class (1A, 2O, 3A, etc.) |
emergency_power |
bool | 100% emergency power bonus (100 pts + 2x mult) |
band_goals |
object | Target contacts per band (for star indicators) |
weather_enabled |
bool | Show live weather in header |
- Arrow Left/Right - Navigate pages
- Spacebar - Pause/resume auto-rotation
- 1, 2, 3, 4 - Jump to specific page
- βΈοΈ Pause /
βΆοΈ Play - Stop/start auto-rotation - β Prev | Next β - Manual page navigation
- βοΈ Light / π Dark - Toggle theme
- Main Scoreboard - Total contacts, operator charts, mode breakdown
- Performance Stats - Band activity, timeline, rates, multipliers
- Operating Stations - Multi-station tracking with recent QSOs
- World Map - Geographic visualization of contacts
The scoreboard calculates your complete Field Day score in real-time:
Final Score = (QSO Points Γ Class Multiplier Γ Power Multiplier) + Bonus Points
QSO Points: 2,175
Class: 2O (2 transmitters) = Γ2
Emergency Power: Yes = Γ2
Bonus Points: 700
Final Score = (2,175 Γ 2 Γ 2) + 700 = 9,400 points
β
100% Emergency Power (also provides 2x multiplier!)
β
Media Publicity
β
Public Location
β
Public Information Table
β
NTS Messages (10 pts each, max 100)
β
Satellite QSO
β
Bulletin Copy
β
Educational Activity
β
Social Media
β
Youth Participation (20% under 18)
β
Site Visit by Official
Edit the band_goals section to match your expectations:
"band_goals": {
"20": 300, // Increase for prime band
"40": 150, // Adjust for propagation
"160": 10 // Set realistic nighttime goal
}Bands meeting their goal get a β star indicator!
Edit index.html line ~1750:
setInterval(nextPage, 15000); // 15 seconds (15000ms)Set weather_enabled: false in config.json if no internet
- β Verify N3FJP TCP/IP interface is enabled
- β
Check
n3fjp_hostIP address in config.json - β Ensure both PCs are on same network
- β Check firewall isn't blocking port 1100
- β Look for errors in terminal where server is running
- β Verify internet connection
- β
Check
home_latandhome_lonare correct - β
Ensure
weather_enabled: true - β Weather requires internet on first load
- β
Run
python download_leaflet.pyonce - β
Check
/www/lib/directory exists - β Internet needed on first load (tiles are cached after)
- β Make sure QSOs have timestamps
- β Check browser console for errors (F12)
- β Verify N3FJP is populating DATE/TIME fields
- β
Verify
field_day_classis set (e.g., "2O") - β Check Field Day settings in config.json
- β Restart server after config changes
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β N3FJP βββββββββββ€ FastAPI βββββββββββ€ Browser β
β Logger β TCP/IP β Python β HTTP β Display β
β (Port 1100)β β Server β β (Client) β
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β
ββ Real-time polling (3s)
ββ Score calculation
ββ Data aggregation
ββ API endpoints
- Backend: FastAPI (Python), asyncio
- Frontend: Vanilla JavaScript, Chart.js, Leaflet.js
- API: N3FJP TCP/IP Interface
- Styling: Custom CSS with dark/light themes
- Maps: Leaflet.js with CartoDB tiles
- Weather: wttr.in (free, no API key)
- Python 3.8 or higher
- N3FJP Contest Logger (any version with TCP/IP API)
- Modern web browser (Chrome, Firefox, Edge)
- Any PC/Laptop/Raspberry Pi (even a Pi Zero 2 works!)
- Network connection to N3FJP logging PC
- Display (laptop screen, TV, projector, etc.)
- Local network connecting N3FJP PC and scoreboard
- Internet connection optional (for weather, map tiles on first load)
Contributions are welcome! Here's how you can help:
- π Report Bugs - Open an issue with details
- π‘ Suggest Features - Share your ideas
- π§ Submit Pull Requests - Code improvements welcome
- π Improve Documentation - Help others get started
- β Star the Project - Show your support!
This project is licensed under the MIT License - see the LICENSE file for details.
Created by: KC9MNE
Built with:
- N3FJP Software - Contest logging
- FastAPI - Python web framework
- Chart.js - Beautiful charts
- Leaflet.js - Interactive maps
- wttr.in - Weather data
Special thanks to:
- ARRL for organizing Field Day
- N3FJP for excellent logging software and API
- Ham radio operators everywhere for keeping the hobby alive!
Having issues or questions?
- π§ Email: Open an issue on GitHub
- π¬ Discussions: Use GitHub Discussions tab
- π Bug Reports: Open an issue with details
Future enhancements planned:
- Mobile-responsive design
- Historical event comparison
- Export to ADIF
- Custom color themes
- Audio alerts for milestones
- Multi-language support
- REST API for external integrations