Common questions and answers about Heimdall.
Heimdall is an AI-powered platform for real-time localization of radio transmissions using distributed WebSDR receivers. It uses machine learning to analyze radio signals from multiple receivers and triangulate the source location with uncertainty estimates.
In Norse mythology, Heimdall is the all-seeing guardian of Bifrost who can see and hear across all realms. Similarly, our system "sees" radio transmissions across a distributed network of receivers.
Yes! Heimdall is open source under a Creative Commons Non-Commercial license. You can use it freely for personal, educational, and amateur radio purposes.
No, the CC Non-Commercial license prohibits commercial use. For commercial licensing, please contact the project maintainer.
See the Quick Start Guide for a 5-minute installation process. You'll need Docker and 8GB of RAM.
Minimum:
- 8GB RAM
- 20GB disk space
- Docker 20.10+
- Internet connection
Recommended:
- 16GB RAM (for ML training)
- 50GB disk space
- GPU (for faster training)
Not required! The system is designed to be accessible. However, familiarity with radio concepts helps understand the results.
No! The ML models are pre-trained and ready to use. ML expertise is only needed if you want to retrain models or modify the architecture.
Target accuracy is ±30m (68% confidence interval). Actual accuracy depends on:
- Number of active receivers
- Signal quality (SNR)
- Receiver geometry
- Radio propagation conditions
Real-time inference latency is <500ms from signal reception to location prediction.
Currently configured for:
- 2m band (144-148 MHz)
- 70cm band (430-440 MHz)
The system can be adapted to other bands by retraining models with appropriate data.
Minimum: 3 receivers (for triangulation) Recommended: 5-7 receivers (for better accuracy) Current setup: 7 receivers in Northwestern Italy
Yes! Edit WEBSDRS.md to add your receiver configuration. You'll need:
- WebSDR URL and API access
- Receiver coordinates (latitude, longitude, elevation)
- Antenna characteristics
See the Contributing Guidelines for detailed instructions. Quick steps:
- Fork the repository
- Create a feature branch
- Make your changes with tests
- Submit a pull request
Backend:
- Python 3.11 (FastAPI, Celery)
- PostgreSQL + TimescaleDB
- RabbitMQ, Redis, MinIO
ML Pipeline:
- PyTorch Lightning
- MLflow tracking
- ONNX Runtime
Frontend:
- React + TypeScript
- Mapbox GL JS
- Bootstrap 5
Deployment:
- Docker + Docker Compose
- Kubernetes + Helm
# Backend tests
make test
# Frontend tests
cd frontend && pnpm test
# E2E tests
cd frontend && pnpm test:e2eSee Development Guide for details.
Open an issue on GitHub Issues with:
- Clear description of the bug
- Steps to reproduce
- Expected vs actual behavior
- Environment details (OS, Docker version, etc.)
- Navigate to http://localhost:3000/sessions
- Click "New Session"
- Enter known source location (for training data)
- Set frequency and duration
- Click "Start Recording"
The system will fetch IQ data from all active WebSDR receivers simultaneously.
Uncertainty represents the confidence in the predicted location. It's displayed as an ellipse on the map:
- Small ellipse: High confidence
- Large ellipse: Low confidence
Factors affecting uncertainty:
- Signal strength (SNR)
- Receiver geometry
- Radio propagation conditions
For development/testing, yes - use mock data. For production localization, you need access to real WebSDR receivers.
Supervised learning approach:
- Operator starts recording session
- Operator enters known source location
- System records IQ data from all receivers
- IQ data + ground truth location = training sample
Accumulate many samples to train accurate models.
# Check Docker is running
docker ps
# Restart all services
docker-compose down -v
docker-compose up -d
# Check logs
docker-compose logs -f# Wait 30 seconds for services to initialize
sleep 30 && make health-check
# Check individual services
docker-compose ps
docker-compose logs <service-name># Find conflicting process
lsof -i :5432 # Replace with your port
# Stop conflicting service or change port in .env# Verify PostgreSQL is running
docker-compose ps postgres
# Test connection
psql -h localhost -U heimdall_user -d heimdallcd frontend
# Clear cache and reinstall
rm -rf node_modules pnpm-lock.yaml
pnpm install
# Rebuild
pnpm build- Input: Mel-spectrograms from multiple WebSDR receivers
- Feature extraction: CNN extracts spatial-temporal patterns
- Localization: Fully connected layers predict coordinates
- Uncertainty: Gaussian NLL loss quantifies prediction confidence
See Architecture Guide for details.
TimescaleDB is optimized for time-series data:
- Efficient storage of measurement timestamps
- Fast time-range queries
- Automatic data compression
- Continuous aggregates
Perfect for radio signal measurements over time.
Benefits:
- 1.5-2.5x faster than PyTorch
- Smaller model size
- Platform-independent
- Production-optimized
Models are trained in PyTorch, then exported to ONNX for inference.
Yes! For development and small-scale deployments, use docker-compose:
docker-compose -f docker-compose.prod.yml up -dFor production at scale, Kubernetes is recommended for auto-scaling, self-healing, and orchestration.
The first inference loads the ONNX model into memory. Subsequent inferences are much faster (<500ms) due to:
- Model caching
- Redis result caching
- Optimized inference session
- Add more receivers: Better triangulation geometry
- Improve signal quality: Better antennas, lower noise
- Collect more training data: More diverse samples
- Retrain models: Use local radio propagation conditions
Depends on usage:
- Base system: ~5GB (Docker images)
- IQ data: ~10MB per recording session
- ML models: ~100-200MB per model version
- Logs and metrics: ~1GB per month
Recommendation: 50GB for active development/production.
Local deployment:
- Radio signal measurements (IQ data)
- Localization results
- System metrics and logs
No data is sent externally. Everything stays on your infrastructure.
Yes, all data is stored locally:
- IQ files: MinIO buckets
- Measurements: PostgreSQL database
- Models: MinIO + MLflow
Use standard backup/deletion tools.
Yes! The CC Non-Commercial license allows modifications for non-commercial purposes.
Yes, under the same CC Non-Commercial license. Credit the original project.
The license prohibits commercial use. For commercial licensing, contact the maintainer.
- Documentation: Full Documentation
- Troubleshooting: Troubleshooting Guide
- GitHub Issues: Report bugs
- GitHub Discussions: Ask questions
- Email: alessio.corsi@gmail.com