https://buymeacoffee.com/hamradiohef

New Mobile App for iOS, iPadOS, MacOS and VisionOS that syncronizes Net Control Check-In's with the Web App. https://apps.apple.com/us/app/ham-radio-net-control/id6754520301
Android version in planning phase.
A modern web application for Ham Radio Net Control Operators to manage net operations, track check-ins, and export reports.
- Start and manage net operations in real-time
- Record check-ins with:
- Callsign (auto-uppercased)
- Name (auto-filled from QRZ)
- License Class (auto-filled from QRZ, displayed next to name)
- Location (City, State - auto-filled from QRZ)
- Staying for Comments (checkbox to track who stays for post-net discussion)
- Notes (optional, editable during or after net)
- Automatic callsign lookup via QRZ.com API integration
- Real-time check-in tracking and management
- Edit check-in notes during active net operations
- Delete individual check-ins as needed
- Complete net operations when finished
- Calendar view of all past and future net operations
- Schedule future nets without starting them immediately
- Recurring net operations with flexible repeat options:
- Daily (365 days ahead)
- Weekly (52 weeks ahead)
- Bi-Weekly (26 occurrences ahead)
- Monthly (12 months ahead)
- Start scheduled nets from Dashboard or Schedule page with one click
- Edit operation notes for completed nets
- Edit individual check-in notes for any saved check-in
- View detailed information for each operation including:
- Complete check-in lists with license class, location, and comment status
- Staying for Comments indicators
- Export individual net operations to PDF with custom logo
- Support for multiple nets per day with timestamps
- Delete past net operations as needed
- Color-coded status badges (Active, Scheduled, Completed)
- Dark/Light theme toggle with localStorage persistence
- Custom logo upload for branding (JPEG, PNG, GIF, SVG, WebP)
- Logo appears in navbar and on PDF exports
- QRZ.com API credentials configuration (username:password format)
- Personal preferences management
Advanced Reporting:
- Generate comprehensive PDF reports with custom filters
- Filter by Operator: All Operators or specific operator
- Filter by Date Range: Start date, end date, or both (optional)
- Clear Filters button for easy reset
- Professional PDF reports include:
- Custom logo (PNG/JPEG)
- Summary statistics (total ops, status breakdown, check-ins, averages)
- Detailed operations list with all data
- Complete check-in information with license class, location, and comment status
- Operation notes and check-in notes
- Page numbers and generation timestamp
User Management:
- User management dashboard with full CRUD operations
- Add new net operators with custom roles
- Edit user information:
- Username
- Callsign
- Email address
- Reset user passwords for any operator
- Role management: Toggle between Operator and Admin roles
- Delete users (with safety checks to prevent self-deletion)
- First registered user automatically becomes admin
- View user creation dates and statistics
- Secure authentication with JWT (30-day expiration)
- Username-based login (not email)
- User registration with validation
- Role-based access control (Operator/Admin)
- Protected routes and API endpoints
- Node.js - Runtime environment
- Express.js - Web framework
- MongoDB - Database
- Mongoose - ODM
- JWT - Authentication
- PDFKit - PDF generation
- QRZ.com API - Callsign lookup
- React - UI framework
- Vite - Build tool
- React Router - Navigation
- Axios - HTTP client
- React Calendar - Calendar component
- React Toastify - Notifications
- Docker - Containerization
- Docker Compose - Multi-container orchestration
- Nginx - Web server (frontend)
- Docker and Docker Compose installed
- QRZ.com account with XML API access (optional, for callsign lookup)
- Clone the repository:
git clone https://github.com/crypiehef/NetControlAPP.git
cd NetControlAPP- Create environment file:
cp .env.example .env- Edit
.envand set your JWT secret:
JWT_SECRET=your_very_secure_jwt_secret_key_here
Get a secret JWT Token here: https://jwtsecrets.com/#generator
- Start the application:
docker-compose up -d- Access the application:
- Frontend: http://localhost (port 80)
- Backend API: http://localhost:5001 (port 5001 to avoid macOS AirPlay conflict)
- Create your first account by visiting http://localhost and clicking "Register"
- First user automatically becomes admin! ⭐
- Subsequent users will be operators by default
cd backend
# Install dependencies
npm install
# Create .env file
cat > .env << EOF
PORT=5000
MONGODB_URI=mongodb://localhost:27017/netcontrol
JWT_SECRET=your_jwt_secret_key
NODE_ENV=development
EOF
# Start MongoDB (if not using Docker)
# Option 1: Using local MongoDB
mongod
# Option 2: Using Docker for MongoDB only
docker run -d -p 27017:27017 --name netcontrol-mongodb mongo:7
# Start the backend
npm run devcd frontend
# Install dependencies
npm install
# Start the development server
npm run devThe frontend will be available at http://localhost:3000
- Log in to your QRZ.com account
- Subscribe to the XML Data service (if not already subscribed) - https://www.qrz.com/XML/current_spec.html
- In the application, go to Settings
- Enter your QRZ credentials in one of these formats:
- Full format:
username:password(e.g., K4HEF:mypassword) - Simple format:
username(if you're an XML subscriber)
- Full format:
- Click "Save Credentials"
- The app will now automatically lookup callsign information when you enter a callsign:
- Name (First + Last)
- License Class (Technician, General, Extra, etc.)
- Location (City, State)
- And more...
- Go to Settings page
- Click "Choose File" under Logo section
- Select your logo image (JPG, PNG, GIF, SVG, or WebP)
- Click "Upload Logo"
- Your logo will appear in the navbar and on PDF exports
Toggle between light and dark mode using the theme button in the navbar or in the Settings page. Theme preference is saved automatically and persists across sessions.
- Navigate to "Net Control" page
- Fill in the net information:
- Net Name (default: York County Amateur Radio Society Net)
- Frequency (optional)
- Notes (optional)
- Click "Start Net Operation"
- Navigate to "Schedule" page
- Click "+ Schedule Future Net"
- Fill in the form:
- Net Name
- Date & Time (datetime picker)
- Frequency (optional)
- Repeat For: Choose recurrence pattern
- No Repeat (one-time)
- Daily (next 365 days)
- Weekly (next 52 weeks)
- Bi-Weekly (next 26 occurrences)
- Monthly (next 12 months)
- Notes (optional)
- Click "Schedule Net Operation"
- Scheduled nets appear on calendar with orange "SCHEDULED" badge
From Dashboard:
- View scheduled nets in "Recent Operations"
- Click "
▶️ Start Net" button - Automatically redirected to Net Control page
From Schedule:
- Select a date with scheduled operations
- Click "
▶️ Start Net" button on desired operation - Automatically redirected to Net Control page
- With an active net operation, use the check-in form
- Enter the callsign (3+ characters triggers auto-lookup)
- Auto-filled from QRZ (if configured):
- Name
- License Class (appears next to name)
- Location (City, State)
- All fields are editable - modify as needed
- Check "Staying for comments" if operator is staying for post-net discussion
- Add optional notes
- Click "Add Check-in"
- View all check-ins in the table with:
- Callsign, Name, License Class, Location, Time
- Comments status: "✓ Yes" or "Not staying"
- Notes (editable)
- Edit notes: Click ✏️ button to add/modify notes for any check-in
- Remove check-ins: Click "Remove" button to delete a check-in
Edit Operation Notes:
- Navigate to Schedule page
- Select a date with completed operations
- Click "✏️ Edit Notes" below the operation info
- Modify notes in the textarea
- Click "💾 Save Notes"
Edit Check-in Notes:
- On the same operation card, scroll to check-ins table
- Click ✏️ in the Actions column for any check-in
- Edit notes in the inline textarea
- Click "💾 Save" or "Cancel"
- When the net is finished, click "Complete Net Operation"
- Confirm the completion
- The net will be saved to your schedule with "COMPLETED" status
- Navigate to "Schedule" page
- Click on any date in the calendar
- View all operations for that date (Active, Scheduled, or Completed)
- Export any operation to PDF
- Delete operations if needed (trash icon)
- From the Schedule page, select a date with operations
- Click "Export to PDF" on the desired operation
- The PDF will download automatically with:
- Your custom logo (if uploaded)
- Net details
- Complete check-in list with all information
Advanced Reporting:
- Navigate to "Admin" page (only visible to admins)
- Advanced Reporting section at top of page
- Select Filters:
- Operator: Choose "All Operators" or specific operator from dropdown
- Start Date: Optional - leave blank for all-time
- End Date: Optional - leave blank for all-time
- Click "📄 Generate PDF Report"
- PDF downloads automatically with:
- Summary statistics
- Filtered operations list
- Complete check-in data
- All notes and comment status
- Use "🔄 Clear Filters" to reset all fields
User Management:
- Navigate to "Admin" page (only visible to admins)
- Add User: Click "+ Add Net Operator"
- Enter username, callsign, email, password
- Select role (Operator or Admin)
- Edit User: Click "✏️ Edit" button
- Modify username, callsign, or email
- Reset Password: Click "Reset Password"
- Enter new password (min 6 characters)
- Change Role: Click role toggle button
- Switch between Operator and Admin
- Delete User: Click "🗑️ Delete"
- Confirm deletion (cannot delete yourself)
POST /api/auth/register- Register new user (first user becomes admin)POST /api/auth/login- Login user (username + password)GET /api/auth/me- Get current user (requires auth)
POST /api/net-operations- Create new operationPOST /api/net-operations/schedule- Schedule future net operation(s) with recurrenceGET /api/net-operations- Get all operations (supports query filters)GET /api/net-operations/:id- Get single operationPUT /api/net-operations/:id- Update operationPUT /api/net-operations/:id/start- Start a scheduled net operationPUT /api/net-operations/:id/complete- Complete operationPUT /api/net-operations/:id/notes- Update operation notesPOST /api/net-operations/:id/checkins- Add check-in (with location, license class, stayingForComments)PUT /api/net-operations/:id/checkins/:checkinId/notes- Update check-in notesDELETE /api/net-operations/:id/checkins/:checkinId- Delete check-inDELETE /api/net-operations/:id- Delete net operationGET /api/net-operations/lookup/:callsign- Lookup callsign via QRZGET /api/net-operations/:id/pdf- Export to PDF
GET /api/settings- Get user settingsPUT /api/settings- Update settings (theme, QRZ credentials)POST /api/settings/logo- Upload logo (JPEG, PNG, GIF, SVG, WebP)DELETE /api/settings/logo- Delete logo
GET /api/users- Get all usersPOST /api/users- Create new userPUT /api/users/:id- Update user information (username, callsign, email)DELETE /api/users/:id- Delete userPUT /api/users/:id/reset-password- Reset user passwordPUT /api/users/:id/role- Update user role (operator/admin)POST /api/users/reports/generate- Generate PDF report with filters (operator, date range)
If you already have the app installed and want to update to the latest version:
- Navigate to your app directory:
cd NetControlAPP- Stop the running containers:
docker-compose down- Fetch all updates from GitHub:
git fetch --all --tags --prune- Pull the latest changes:
git pull origin main- Rebuild and restart containers:
docker-compose up -d --build- Verify the update:
# Check current version
git describe --tags
# View recent commits
git log --oneline -5To update to a specific version (e.g., v1.2):
# Stop containers
docker-compose down
# Fetch all tags
git fetch --all --tags
# Checkout specific version
git checkout v1.2
# Rebuild containers
docker-compose up -d --buildIssue: "Already up to date" but features are missing
- Solution: Run
docker-compose up -d --buildto rebuild containers
Issue: Database errors after update
- Your data is preserved in Docker volumes
- Check logs:
docker-compose logs backend - If needed, restart:
docker-compose restart
Issue: Port conflicts after update
- The app uses port 5001 (not 5000) for backend
- Frontend uses port 80
- Run
lsof -i :80andlsof -i :5001to check for conflicts
docker-compose up -ddocker-compose down# All services
docker-compose logs -f
# Specific service
docker-compose logs -f backend
docker-compose logs -f frontenddocker-compose up -d --builddocker-compose restart backend
docker-compose restart frontend# ⚠️ WARNING: This will delete all your data!
docker-compose down -vNetControlApp/
├── backend/
│ ├── src/
│ │ ├── config/ # Configuration files
│ │ ├── controllers/ # Route controllers
│ │ ├── middleware/ # Custom middleware
│ │ ├── models/ # MongoDB models
│ │ ├── routes/ # API routes
│ │ ├── services/ # Business logic
│ │ └── server.js # Entry point
│ ├── Dockerfile
│ └── package.json
├── frontend/
│ ├── src/
│ │ ├── components/ # React components
│ │ ├── contexts/ # React contexts
│ │ ├── pages/ # Page components
│ │ ├── services/ # API services
│ │ ├── styles/ # CSS files
│ │ ├── App.jsx # Main app component
│ │ └── main.jsx # Entry point
│ ├── Dockerfile
│ ├── nginx.conf
│ └── package.json
└── docker-compose.yml
If you see bind: address already in use on port 5000:
This app uses port 5001 to avoid conflicts with macOS AirPlay Receiver.
- Frontend: http://localhost (port 80)
- Backend API: http://localhost:5001
If you still have conflicts:
- Check what's using the port:
lsof -i :5001 - Disable AirPlay Receiver: System Settings → General → AirDrop & Handoff → Turn OFF AirPlay Receiver
# Check if MongoDB is running
docker ps | grep mongodb
# Restart MongoDB
docker-compose restart mongodb
# Check MongoDB logs
docker-compose logs mongodb# Check backend logs
docker-compose logs backend
# Ensure .env file exists with correct values
# Restart backend
docker-compose restart backend# Rebuild frontend
docker-compose up -d --build frontend- Verify your QRZ credentials are in correct format (username:password or username)
- Ensure you have an active QRZ XML subscription
- Check backend logs for API errors:
docker-compose logs backend - Test the credentials directly on QRZ.com
- Ensure file is an image format: JPEG, PNG, GIF, SVG, or WebP
- Maximum file size: 5MB
- Check backend logs if upload continues to fail
- Clear browser cache and localStorage
- Log out and log back in
- Theme is stored in localStorage and synced with backend
- Change the default JWT_SECRET in
.envto a strong, random value - Use strong, unique passwords for user accounts
- Consider using HTTPS with SSL/TLS certificates
- Set up proper firewall rules
- Regularly backup your MongoDB database
- Keep all dependencies updated
✅ Multer 2.0: Upgraded to fix all known vulnerabilities
- Protection against DoS attacks from malformed requests
- Memory leak prevention from unclosed streams
- Enhanced error handling for file uploads
- File type validation and size limits (5MB max)
✅ Authentication Security:
- JWT tokens with 30-day expiration
- Bcrypt password hashing
- Role-based access control (RBAC)
- Protected API endpoints
- Admin authorization for new user accounts (v2.2.4)
- Account enable/disable functionality for admin control
- Disabled accounts cannot login
✅ Bot Protection:
- Google reCAPTCHA v3 integration on registration form (v2.2.4)
- Invisible verification (no checkbox required)
- Backend token verification
- Configurable via environment variables
✅ Input Validation:
- File upload validation (type, size, name)
- Form input sanitization
- MongoDB injection prevention
- CORS configuration
- reCAPTCHA token validation
This project is licensed under the MIT License.
For issues, questions, or contributions, please contact K4HEF or open an issue in the repository.
Security & User Management Enhancement
Admin Authorization System:
- ✅ New user accounts require admin approval before login
- ✅ First user is automatically enabled (setup user)
- ✅ Admin can enable/disable user accounts
- ✅ Visual status indicators (Enabled/Pending) in admin panel
- ✅ Secure login check prevents disabled accounts from accessing system
reCAPTCHA Integration:
- ✅ Google reCAPTCHA v3 protection on registration form
- ✅ Invisible bot protection (no checkbox required)
- ✅ Backend verification service
- ✅ Configurable via environment variables
- ✅ Development mode bypass for testing
Enhanced User Management:
- ✅ Status column in admin panel showing account state
- ✅ Enable/Disable buttons for quick account management
- ✅ Color-coded status badges (Green = Enabled, Yellow = Pending)
- ✅ Improved user registration flow with clear messaging
- ✅ Admin cannot disable their own account (security)
Documentation:
- ✅ Complete reCAPTCHA setup guide (RECAPTCHA_SETUP.md)
- ✅ Environment variable configuration documentation
- ✅ Troubleshooting guide for common issues
Bug Fixes:
- ✅ Fixed registration flow for pending users
- ✅ Improved error messages for disabled accounts
- ✅ Enhanced admin panel user management UI
Major Release - Enterprise Features
Advanced Reporting System:
- ✅ Generate comprehensive PDF reports from Admin panel
- ✅ Multi-filter system (Operator, Date Range)
- ✅ All Operators option for organization-wide reports
- ✅ Professional PDF with summary statistics
- ✅ Complete check-in data in reports
- ✅ Custom logo support (PNG/JPEG)
- ✅ Clear Filters button
Enhanced Note-Taking:
- ✅ Edit operation notes for completed nets
- ✅ Edit individual check-in notes (during or after net)
- ✅ Inline editing in Net Control and Schedule pages
- ✅ All notes included in PDF reports
Staying for Comments Tracking:
- ✅ Checkbox in check-in form
- ✅ Tracks who stays for post-net discussion
- ✅ Visual indicators (✓ Yes / Not staying)
- ✅ Appears in tables and PDF reports
- ✅ Color-coded for easy scanning
Bug Fixes:
- ✅ WebP logo compatibility in PDFs
- ✅ UTC date handling for accurate filtering
- ✅ Operation notes now included in PDF reports
- ✅ Schedule future nets without starting (Thanks Dom The Dorito!)
- ✅ Recurring net scheduling (Daily, Weekly, Bi-Weekly, Monthly)
- ✅ Full year-ahead recurring schedules (365 daily, 52 weekly, etc.)
- ✅ Start scheduled nets from Dashboard and Schedule page
- ✅ Auto-navigation to Net Control after starting
- ✅ Edit user information in Admin panel
- ✅ Delete operations from Schedule
- ✅ Location and license class fields in check-ins
- ✅ Fixed all multer vulnerabilities (upgraded to 2.0.0)
- ✅ Username login instead of email (Thanks Dom The Dorito!)
- ✅ Fixed calendar dark mode text readability
- ✅ Fixed modal text readability in light mode
- ✅ Enhanced error handling for file uploads
Core Features:
- Net Control operations management
- Real-time check-in tracking
- QRZ.com API integration
- Schedule calendar with PDF export
- Admin panel for user management
- Theme switching with persistence
- Custom logo upload (WebP, PNG, JPEG, GIF, SVG)
- User authentication with JWT
- York County Amateur Radio Society - Sponsoring organization
- QRZ.com - Callsign lookup API
- Dom The Dorito (Discord) - Feature suggestions
- K4HCK (QRZ Forum) - Feature suggestion
- The Ham Radio Community - Continued support
73 de K4HEF 📻
Net Control by K4HEF - Making net operations simple and efficient for amateur radio operators worldwide.