Rayfall is a dynamic ham radio mapping interface that pulls your logbook data from QRZ and plots your QSOs on an interactive Leaflet map. You can explore contacts by date range, filter by band and mode, and visually analyze your contacts across different locations and timeframes.
Built by N2CLW
Available at rayfall.me
- Interactive Leaflet Map
- Multiple import methods:
- QRZ API integration (supports multiple logbooks)
- NEW: ADI/ADIF file import (no API key required!)
- Date range selection
- Color-coded pins by band
- Customizable display options:
- Multiple pin icon styles (teardrop, circle, square, star)
- Selectable QTH station icons (⚡📍🏠📡🗼⭐)
- Custom grid square colors and opacity
- Multiple basemap styles
- Grid square overlay with 4/6-character precision
- Map lines to QSOs (toggle on/off)
- Filter QSOs by band and mode
- High-resolution map export (300 DPI for printing)
- Auto-reads your QTH from log data
- Clean dropdown menu for display options
- Works offline with ADI files
- Python 3.11+
- pip
- Git
git clone https://github.com/moose25/rayfall.git
cd rayfallpython3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activatepip install -r requirements.txtNote: Required packages include FastAPI, uvicorn, and Jinja2. You can also install them manually:
pip install fastapi uvicorn jinja2uvicorn main:app --reloadThis starts the server locally at: http://127.0.0.1:8000
New users? Click the "📖 How to Use Rayfall" button (top-right) for interactive tutorials!
- Visit
http://127.0.0.1:8000in your browser. - Click the "Change API Key" button in the top-right.
- Paste in your QRZ Logbook API key and click Save.
- Choose a start and end date and click Load from QRZ.
- Filter contacts by band/mode and customize display options.
- Visit
http://127.0.0.1:8000in your browser. - Click "Import ADI File" and select your
.adior.adiffile. - Your QSOs load instantly - no API key needed!
- Filter contacts by band/mode and customize display options.
See QUICK_START_ADI.md for detailed ADI import guide.
Click the "⚙️ Display Options" button to access:
- Map Style: Light, Dark, Topographic, Satellite, Streets
- QTH Icon: Choose from 6 different station icons
- Pin Style: Teardrop, Circle, Square, or Star markers
- Grid Squares: Custom colors, opacity, and precision (4 or 6 chars)
All contacts with grid squares or lat/lon information will be plotted.
The "📖 How to Use Rayfall" button provides:
- Step-by-step setup instructions
- ADI import guide for all major logging software
- Display customization tutorials
- Filtering and export tips
- Pro tips for advanced usage
✅ You can switch logbooks anytime by clicking the API Key button again.
Rayfall does not store your API key on a server. Instead:
- It saves it to
localStoragein your browser. - The backend reads the key from request headers.
- No secret is ever exposed in the source code.
🔐 This makes it safe to share or host this code publicly.
To generate a QRZ Logbook API Key:
- Go to https://logbook.qrz.com/
- Click on Settings > API
- Copy your unique API key
Rayfall centers on VA by default. Once a valid log is loaded, it updates to your actual QTH using your first valid my_lat and my_lon from the QRZ logs.
If you'd like to hardcode a default starting location, edit:
map = L.map('map').setView([XXX, XXX], 4);Edit the styles directly in the <style> block inside index.html. All controls and map elements can be styled using standard CSS.
rayfall/
├── main.py # FastAPI backend
├── templates/
│ └── index.html # Frontend map UI
├── static/
│ ├── rayfall.png # Logo
│ └── screenshot.png # Screenshot
├── requirements.txt # Python dependencies
└── README.md # You're reading this
Pull requests and forks are welcome! If you find a bug or want to suggest a feature, feel free to open an issue or PR.
This project is open source and available under the MIT License.
Chris Williams (N2CLW)
73 and happy DXing!

