ECTLogger
A Modern Radio Net Logger for Emergency Communications Teams and SKYWARN Spotter Nets
ECTLogger is a production-ready, web-based net logging application designed specifically for Emergency Communications Teams, SKYWARN spotter nets, and amateur radio net control operations. Built with modern technology, it provides real-time check-in tracking, multi-frequency support, and comprehensive net management capabilities.
Multi-frequency/band check-ins, in dark and light mode! β π· More screenshots
β¨ Features
- π Secure Authentication - Frictionless sign-in with magic link email authentication + OAuth (Google, Microsoft, GitHub)
- π» Multi-Frequency Support - Track stations across multiple frequencies and modes
- β‘ Real-Time Updates - WebSocket-powered live check-ins and status updates
- π₯ Role-Based Access - Admin, NCS, Logger, User, and Guest roles
- π§ Email Notifications - Automatic net start notifications and invitations
- π± Mobile Responsive - Works seamlessly on phones, tablets, and desktops
- π¨ Modern UI - Clean Material Design interface
- πΎ Flexible Database - SQLite, PostgreSQL, or MySQL support
- π Recheck Tracking - Automatically track stations checking in multiple times
- π Custom Fields - Admins can create custom fields for specific net requirements
- πΊοΈ Station Mapping - View check-in locations on OpenStreetMap (GPS, Maidenhead, UTM, MGRS)
- π Complete Net Logs - Automatic log generation and email delivery
π Security
ECTLogger implements comprehensive security measures to protect your data and prevent common vulnerabilities:
- Input Validation - All inputs validated with strict length limits and format checking
- XSS Protection - HTML sanitization and security headers prevent script injection
- SQL Injection Prevention - SQLAlchemy ORM with parameterized queries
- Rate Limiting - 200 requests/minute per IP prevents abuse and DDoS attacks
- Authenticated WebSockets - JWT token required for real-time connections
- Fail2Ban Integration - Optional automatic IP banning after repeated failed login attempts
- OWASP Top 10 - Protected against the most critical web application security risks
For complete security documentation, deployment best practices, and vulnerability reporting, see SECURITY.md.
For Fail2Ban setup instructions, see FAIL2BAN.md.
π Quick Start
β‘ One-Line Install (Debian/Ubuntu)
Fresh system? Run this single command to download and install everything:
curl -fsSL https://raw.githubusercontent.com/bradbrownjr/ectlogger/main/bootstrap.sh | bash
This installs all prerequisites (Git, Python, Node.js), clones the repository, and runs the installer.
Linux/macOS (Manual)
# 1. Clone the repository
git clone https://github.com/bradbrownjr/ectlogger.git
cd ectlogger
# 2. Make scripts executable and install
chmod +x *.sh
./install.sh
# 3. Configure and start
./configure.sh
./start.sh
# 4. Open http://localhost:3000 and sign in!
Windows
# 1. Clone the repository
git clone https://github.com/bradbrownjr/ectlogger.git
cd ectlogger
# 2. Run the setup script
.\start.ps1
# 3. Open http://localhost:3000 and sign in!
See QUICKSTART.md for detailed instructions.
π Documentation
Getting Started
- QUICKSTART.md - Get up and running in 5 minutes (recommended!)
- MANUAL-INSTALLATION.md - Step-by-step manual installation for advanced users
Deployment
- PRODUCTION-DEPLOYMENT.md - Deploy to production with SSL/reverse proxy
- SECURITY.md - Security features and best practices
Configuration
- MAGIC-LINK-CONFIGURATION.md - Configure magic link expiration for extended operations
- EMAIL-DELIVERABILITY.md - Email setup, troubleshooting, and spam prevention
- LOGGING.md - Configure log levels and debug output
Development
- DEVELOPMENT.md - Development guide and architecture
π οΈ Technology Stack
Technology
- Frontend: React with TypeScript and Material-UI (MUI)
- Backend: Python FastAPI with async/await support
- Database: SQLAlchemy ORM (SQLite, PostgreSQL, MySQL)
- Authentication: OAuth2 + Magic Link email authentication
- Real-Time: WebSockets for live updates
- Email: SMTP with HTML templates
π₯ User Roles
ECTLogger has two types of roles: global roles (system-wide) and net roles (per-net assignments).
Global Roles
- π‘οΈ Admin - Full system access, user management, view all nets, configure custom fields
- π€ User - Create nets, check into nets, receive notifications
- ποΈ Guest - View-only access to public nets (no account required)
Net Roles
When a user creates a net, they automatically become its NCS (Net Control Station). The net creator can then assign these roles to other users for that specific net:
- π NCS - Full control of the net: start/close, manage check-ins, assign roles
- π Logger - Log check-ins and manage station status
- π‘ Relay - Check in stations on behalf of others (for contacts NCS canβt hear directly)
This means any registered user can run their own nets without needing admin privileges. A user might be a regular participant in one net while serving as NCS for another.
π― Key Capabilities
Multi-Frequency Net Support
Net loggers typically track one frequency, but ECT and SKYWARN nets often move between frequencies to meet participants where they are. ECTLogger tracks:
- Multiple frequencies per net
- Active frequency indication
- Per-station frequency tracking
- Real-time frequency change notifications
Station Status Tracking
Visual indicators for:
- β Checked In
- π Just Listening
- π» Available
- βΈοΈ Away
- π Checked Out
- π Recheck (returning stations)
Role Assignments
- Designate NCS, loggers, and relay stations
- Multiple NCS support for large nets
- Relay station tracking for extended coverage
π Net Workflow
1. Create Net
- User creates a new net with name and description
- Define communication plan (frequencies, modes, talkgroups)
- Configure required and optional check-in fields
- Assign net roles (NCS, Logger, Relay) to other users
- Save as draft for later editing
2. Schedule Net (Optional)
- Set date, time, and timezone for the net
- Configure recurring schedule (daily, weekly, monthly)
- Set up NCS rotation - automatically assign NCS duties across scheduled instances
- System sends reminders to assigned NCS before their scheduled net
- Scheduled nets auto-start at the configured time
3. Start Net
- NCS starts the net manually, or it auto-starts if scheduled
- Email notifications sent to subscribers
- Real-time WebSocket connections established
- Guests can view, users can participate
4. Log Check-ins
- NCS or designated logger enters check-ins
- Stations can self-check-in via web interface
- Support for relay stations (checking in contacts NCS canβt hear)
- Real-time updates to all connected clients
- Edit or delete check-ins as needed
5. Track Participation
- Monitor station status changes
- Track frequency usage per station
- Identify recheck stations
- View check-in timeline
6. Close Net
- NCS or logger closes the net
- Complete log generated automatically
- Log emailed to NCS in text format
- Net archived for reports and history
π Check-in Fields
Required Fields
- Call sign
- Name
-
Location
- SKYWARN spotter number - For weather net tracking
- Weather observation - Current conditions
- Power source - Battery, generator, grid, etc.
- Feedback - Signal reports, comments
- Notes - Additional information
Custom Fields
- Admins create custom fields for the system
- Field types: text, number, textarea, select dropdown
- NCS selects which custom fields to use when creating a net
- Set fields as required or optional per net
- Flexible for different net types and requirements
π₯οΈ System Requirements
- Server: Windows, Linux, or macOS
- Python: 3.9 or higher
- Node.js: 18 or higher
- Database: SQLite (included) or PostgreSQL/MySQL
- Browser: Modern browser (Chrome, Firefox, Safari, Edge)
π¦ Installation
See MANUAL-INSTALLATION.md for complete installation instructions.
Quick Install
Linux/macOS:
chmod +x *.sh
./install.sh # Automated installation
./configure.sh # Interactive configuration
./start.sh # Start the application
Optional: Install as systemd service (Linux):
./install-service.sh # Install systemd service
sudo systemctl start ectlogger
Windows:
.\start.ps1 # Automated installation and startup
Manual Install
# 1. Install backend dependencies
cd backend
python3 -m venv venv
source venv/bin/activate # Linux/macOS
# OR: .\venv\Scripts\Activate.ps1 # Windows
pip install -r requirements.txt
# 2. Install frontend dependencies
cd ../frontend
npm install
# 3. Configure environment
cp .env.example backend/.env
# Edit backend/.env with your settings
π Migration
Use migrate.sh (Linux/macOS) or migrate.ps1 (Windows) to change host addresses when moving between environments (e.g., LAN development to production) without modifying other configuration settings.
Quick Migration Examples
Linux/macOS:
# Production domain (with reverse proxy)
./migrate.sh --host ect.example.com
# LAN IP (development)
./migrate.sh --lan-ip 192.168.1.100
Windows PowerShell:
# Production domain (with reverse proxy)
.\migrate.ps1 -Host ect.example.com
# LAN IP (development)
.\migrate.ps1 -LanIP 192.168.1.100
The script automatically updates backend/.env and frontend/.env, and configures the Vite allowed hosts for security.
See PRODUCTION-DEPLOYMENT.md for complete deployment instructions.
π§ Configuration
Key configuration in backend/.env:
# Database
DATABASE_URL=sqlite:///./ectlogger.db
# Security (generate secure key!)
SECRET_KEY=your-secret-key-here
# Email (required for authentication)
SMTP_HOST=smtp.gmail.com
SMTP_USER=your-email@gmail.com
SMTP_PASSWORD=your-app-password
# Magic Link Configuration
MAGIC_LINK_EXPIRE_DAYS=30 # Valid for 30 days (great for long events!)
# Logging
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR
# OAuth (optional)
GOOGLE_CLIENT_ID=your-google-client-id
MICROSOFT_CLIENT_ID=your-microsoft-client-id
GITHUB_CLIENT_ID=your-github-client-id
π API Documentation
When the backend is running, access interactive API documentation at:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
π§ͺ Testing
# Backend tests
cd backend
source venv/bin/activate # Linux/macOS
# OR: .\venv\Scripts\Activate.ps1 # Windows
pytest
# Frontend tests
cd frontend
npm test
π’ Production Deployment
- Set production environment variables
- Use PostgreSQL or MySQL database
- Configure SSL/TLS certificates
- Set up reverse proxy (nginx/Apache)
- Build frontend:
npm run build - Use production WSGI server (gunicorn)
See PRODUCTION-DEPLOYMENT.md for detailed deployment guide.
π€ Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
π License
This project is licensed under the MIT License - see the LICENSE file for details.
This means you can:
- β Use commercially
- β Modify
- β Distribute
- β Use privately
With the requirement to:
- π Include copyright notice and license
- π Provide attribution to original authors
π Acknowledgments
Built for the amateur radio and emergency communications community.
Special thanks to all NCS operators, loggers, and participants who make emergency communication nets possible.
π Support
- Issues: GitHub Issues
- Documentation: See QUICKSTART.md and DEVELOPMENT.md
- Questions: Open a discussion on GitHub
πΊοΈ Roadmap
Future enhancements planned:
Participant station mappingβ Complete!- Progressive Web App (PWA) for offline capability
- SMS notifications via Twilio/AWS SNS
- Advanced reporting and analytics
- Export logs in multiple formats (CSV, PDF)
- Mobile native apps (iOS/Android)
- Integration with amateur radio logging software
- Voice check-in via phone bridge
- Automated NCS assistant features
Stretch Goals
- TUI/Packet Radio Client - Terminal-based client for packet radio and low-bandwidth operations
β Tested Environments
| Environment | Status | Notes |
|---|---|---|
| Debian Trixie | β Tested | Python 3.13, production with Caddy reverse proxy |
| Windows Server | β¬ Untested | Should work with PowerShell scripts |
| Host Migration | β Tested | LAN to production domain migration |
73 and stay safe! π»