Amateur Radio Log Server - A web-based ADIF log management system for amateur radio operators.
LogShackBaby provides a secure, containerized solution for uploading, storing, and managing amateur radio QSO logs in ADIF 3.1.6 format with multi-factor authentication and API support.
- User Guide - Complete guide for end users
- Administration Guide - Setup, deployment, and maintenance
- Development Guide - Technical documentation and API reference
- β ADIF 3.1.6 Support - Full compliance with ADIF 3.1.6 specification
- β Complete ADIF Field Processing - Captures ALL ADIF fields from uploaded logs
- β ADIF Log Upload - Parse and store amateur radio logs in ADIF format
- β ADIF Log Export - Download logs in standard ADIF format
- β Automatic Deduplication - Prevent duplicate QSO entries
- β Web Interface - Clean, responsive UI for log management
- β Search & Filter - Find logs by callsign, band, mode, and date
- β Statistics Dashboard - View QSO counts, bands, modes, and more
- β Additional Fields Display - View all extra ADIF fields captured in logs
- π User Registration & Authentication - Secure account management
- π Role-Based Access Control - Four user roles: user, contestadmin, logadmin, sysop
- π Multi-Factor Authentication (MFA) - TOTP support for Google Authenticator, Authy, and Microsoft Authenticator
- π API Keys - Secure programmatic access for log uploads
- π Password Hashing - bcrypt-based secure password storage
- π Session Management - Database-backed sessions for multi-worker support
- π³ Containerized - Docker-based deployment
- π Python Backend - Flask web framework with SQLAlchemy ORM
- ποΈ PostgreSQL Database - Reliable data storage with persistent volumes
- π JavaScript Frontend - Client-side rendering, no frameworks required
- π NGINX Reverse Proxy - SSL/TLS termination support
cd /home/pi/source/LogShackBaby
./install-docker.sh # First time setup
./start-docker.sh # Start servicesAccess at: http://localhost
cd /home/pi/source/LogShackBaby
./install-local.sh # First time setup (includes template initialization)
./start-local.sh # Start servicesAccess at: http://localhost:5000
π For detailed installation instructions, see Administration Guide
Note: The installation automatically creates default contest templates (Grid Square Globetrotter, Band-Hopper, Elmer's Choice) for ContestAdmin users.
-
Register an account
- Click "Register" on the login page
- Enter your callsign (e.g., W1ABC)
- Provide your email and password
- Click "Register"
- Note: The first registered user automatically becomes a sysop (system administrator)
-
User Roles
- user (default) - Can manage their own logs
- contestadmin - Read-only access to all user logs with custom report generator
- logadmin - Can view and reset logs for all users
- sysop - Full administrative access to create, modify, and delete users
-
Enable Two-Factor Authentication (Recommended)
- Login to your account
- Go to Settings tab
- Click "Enable 2FA"
- Scan QR code with your authenticator app
- Enter the 6-digit code to verify
-
Create an API Key
- Go to "API Keys" tab
- Click "Create New API Key"
- Add a description (e.g., "N1MM Logger")
- Save the key immediately - it won't be shown again!
-
Upload Your First Log
- Go to "Upload" tab
- Choose your ADIF file (.adi or .adif)
- Click "Upload ADIF File"
- Enter your API key when prompted
For contestadmin users, a powerful report generator is available:
-
Navigate to Contest Admin Tab
- Click "Report Generator" subtab
-
Select Fields
- Choose from standard ADIF fields (QSO Date, Time, Call, Band, Mode, etc.)
- All 100+ ADIF 3.1.6 fields are displayed as selection options
- Fields marked with β contain actual data in uploaded logs
- Fields without marker are available for future logs
-
Apply Filters (Optional)
- Date range (from/to)
- Bands (comma-separated: 20m, 40m, 80m)
- Modes (comma-separated: FT8, SSB, CW)
-
Generate Report
- Click "Generate Report" to view results
- Export to CSV for analysis in Excel or other tools
-
Save and Use Templates
- Save frequently-used reports as templates for quick access
- Three default contest templates are included:
- Grid Square Globetrotter - Track unique Maidenhead grids (30-day contests)
- Band-Hopper - Work as many different bands as possible
- Elmer's Choice (Mode Diversity) - Balance across CW, Phone, and Digital modes
- See CONTEST_TEMPLATES.md for detailed contest rules and usage
-
Features
- Read-only access to all user logs
- Complete ADIF 3.1.6 field selection (100+ fields available)
- Visual indicators show which fields contain data
- CSV export for external analysis
- Up to 10,000 records per report
- Template system for recurring reports and contests
All API endpoints except /register and /login require authentication via:
- Session Token (Web UI):
X-Session-Tokenheader - API Key (Programmatic):
X-API-Keyheader
POST /api/register
Content-Type: application/json
{
"callsign": "W1ABC",
"email": "w1abc@example.com",
"password": "secure_password"
}POST /api/login
Content-Type: application/json
{
"callsign": "W1ABC",
"password": "secure_password"
}Response:
{
"session_token": "...",
"callsign": "W1ABC",
"mfa_required": false
}POST /api/logs/upload
X-API-Key: your_api_key_here
Content-Type: multipart/form-data
file: <ADIF file>
`` Getting Started
### First Time Setup
1. **Register an account** - First user automatically becomes system administrator
2. **Enable Two-Factor Authentication** (recommended)
3. **Create an API Key** for log uploads
4. **Upload your logs** via web interface or API
**π For complete instructions, see [User Guide](docs/USERGUIDE.md)**
## User Roles
- **user** - Manage own logs, API keys, and settings
- **contestadmin** - Generate reports from all user logs
- **logadmin** - View and manage all user logs
- **sysop** - Full system administration
**π For details on roles and permissions, see [User Guide](docs/USERGUIDE.md)**
## API Overview
LogShackBaby provides a complete REST API for programmatic access.
**Authentication:** Session tokens or API keys
**Endpoints:** 30+ endpoints for logs, users, and administration
**Common Operations:**
```bash
# Upload log
curl -X POST http://localhost/api/logs/upload \
-H "X-API-Key: your_key" \
-F "file=@log.adi"
# Get statistics
curl http://localhost:5000/api/logs/stats \
-H "X-Session-Token: your_token"π For complete API documentation, see Development Guide
docker exec logshackbaby-db pg_dump -U logshackbaby logshackbaby > backup-$(date +%Y%m%d).sql
5. **Update regularly**
```bash
docker-compose pull
docker-compose up -d
docker-compose logs -f app
docker-compose logs -f dbdocker-compose restart app
docker-compose restart dbgit pull # or extract new version
docker-compose down
docker-compose build --no-cache
docker-compose up -dCore Fields are stored in dedicated database columns for fast searching:
- QSO_DATE, TIME_ON, CALL (required)
- BAND, MODE, FREQ, RST_SENT, RST_RCVD
- STATION_CALLSIGN, MY_GRIDSQUARE, GRIDSQUARE
- NAME, QTH, COMMENT
Additional Fields (100+ fields) are automatically captured in JSON storage:
- Contest information, QSL tracking, power/propagation
- Station details, awards, digital modes
- Location data, and more
π For ADIF implementation details, see Development Guide
- Ensure time is synchronized on server and client
- TOTP codes are time-sensitive (30-second window)
- Try codes before and after current code
# Backend
cd backend
python -m venv venv
source venv/bin/activate # or venv\Scripts\activate on Windows
pip install -r requirements.txt
# Set environment variables
export DATABASE_URL="postgresql://logshackbaby:password@localhost:5432/logshackbaby"
export SECRET_KEY="your-secret-key"
# Initialize database
flask --app app init-db
# Run development server
python app.pylogshackbaby/
βββ backend/ # Python Flask application
β βββ app.py # Main application
β βββ models.py # Database models
β βββ auth.py # Authentication utilities
β βββ adif_parser.py # ADIF file parser
β βββ requirements.txt # Python dependencies
β βββ Dockerfile # Backend container
βββ frontend/ # Web interface
β βββ index.html # Main HTML
β βββ css/
β β βββ style.css # Styles
β βββ js/ & Maintenance
**π For complete deployment instructions, see [Administration Guide](docs/ADMINISTRATION.md)**
### Quick Commands
```bash
# Docker
./start-docker.sh # Start services
./stop-docker.sh # Stop services
docker-compose logs -f # View logs
# Local
./start-local.sh # Start application
./stop-local.sh # Stop application
# Backup
docker exec logshackbaby-db pg_dump -U logshackbaby logshackbaby > backup.sql
Common Issues:
- Container won't start β Check logs:
docker-compose logs - Database connection error β Restart:
docker-compose restart app - Upload fails β Check file format and API key
- Project Structure
LogShackBaby/
βββ backend/ # Python Flask application
βββ frontend/ # Web interface (HTML/CSS/JS)
βββ database/ # PostgreSQL configuration
βββ nginx/ # NGINX reverse proxy
βββ docs/ # Documentation
β βββ USERGUIDE.md # User guide
β βββ ADMINISTRATION.md # Admin guide
β βββ DEVELOPMENT.md # Technical docs
βββ docker-compose.yml # Container orchestration
βββ README.md # This file
- Backend: Python 3.11, Flask, SQLAlchemy, Gunicorn
- Frontend: HTML5, CSS3, Vanilla JavaScript
- Database: PostgreSQL 16
- Infrastructure: Docker, NGINX
- Security: bcrypt, TOTP 2FA, API keys
Contributions welcome! See Development Guide for:
- Development environment setup
- Code organization
- API documentation
- Testing procedures
This project is provided as-is for amateur radio use.