A professional Emergency Alert System (EAS) research platform β CAP ingestion, SAME encoding, SDR verification, and multi-channel distribution, all on commodity hardware.
EAS Station is a software-defined drop-in replacement for commercial EAS encoder/decoder hardware costing $5,000β$7,000, built on a Raspberry Pi or any Linux server. It delivers a complete, automated CAP-to-broadcast workflow with PostGIS spatial intelligence, real-time SDR verification, and a polished web dashboard β wired together from boring, battle-tested open-source components.
β οΈ Laboratory Use Only β EAS Station is experimental software for research, training, and development. It is not FCC-certified and must only be used in controlled test environments. Never connect to production broadcast chains or on-air RF. See Legal & Compliance.
- NOAA/NWS CAP feeds β poll and parse all active weather alerts for your region
- FEMA IPAWS β federal Integrated Public Alert and Warning System integration
- Custom CAP endpoints β add any CAP 1.2-compatible feed source
- Automatic deduplication β stores once, no duplicate processing
- FIPS & NWS zone lookup β built-in setup wizard to find the right codes for your coverage area
- Full SAME encoding β generates bit-perfect Specific Area Message Encoding headers per FCC Part 11
- Attention tone synthesis β 853/960 Hz two-tone sequence generated in software
- Text-to-Speech voice-over β eSpeak TTS narrates alert details automatically
- Manual EAS print β compose and broadcast custom SAME messages for drills and tests
- Raw SAME parser β paste any
ZCZC-β¦string for instant field-by-field decode and validation - MDC1200 selective calling β optional 1200-baud FFSK pre/post signaling for forwarding EAS audio over Motorola-style two-way radio systems. Supports PTT-ID, Emergency, Request-to-Talk, Remote Monitor, Call Alert, and Voice Selective Call (unmute a specific target subscriber), plus DTMF tone bursts. See Alert Signals guide.
- County/state spatial filtering β alerts matched to your exact geographic footprint
- Polygon-based targeting β NWS zones, FIPS codes, and custom shapefile boundaries
- Interactive Leaflet maps β visualize alert areas and your coverage zone in the web UI
- Shapefile import β load ESRI boundary data directly into PostGIS for custom regions
- US Census TIGER/Line integration for authoritative boundary data
- RTL-SDR and Airspy support via SoapySDR abstraction layer
- FM demodulation β tunes to 162 MHz NOAA Weather Radio and custom frequencies
- Live SAME decode β decodes received EAS headers in real time to confirm broadcast
- Audio spectrum monitoring β waveform display and signal metrics in the dashboard
- Icecast streaming β demodulated audio streamed over HTTP for remote monitoring
- Multi-bitrate stream profiles β configure multiple Icecast streams with different formats
- GPIO relay control β switch transmitters, PTT lines, and external equipment
- LED sign support β RS-232 protocol driver for scrolling marquee displays
- OLED display β I2C status display showing current alert and system state
- VFD (Vacuum Fluorescent Display) β custom screen editor and graphic support
- Zigbee integration β optional wireless sensor/device control
- Multi-relay HAT support β coordinate multiple relay outputs for complex workflows
- GPIO pin map β visual interface showing every pin assignment and current state
- GPS-disciplined precision time β a Uputronics Raspberry Pi GPS/RTC HAT (u-blox MAX-M8Q multi-GNSS: GPS, GLONASS, Galileo, BeiDou) with hardware PPS delivers sub-microsecond reference time directly to the kernel
- True stratum 1 β
chronyconsumes the NMEA fix and the PPS edge as a kernel refclock, so the station serves NTP at stratum 1 with no upstream internet time required. Logged alert timestamps, audit trails, and SAME headerJJJHHMMfields are accurate to the satellites themselves. - Real broadcast-grade hardware β battery-backed RTC (RV-3028-C7 on current revisions, DS3231 on older boards) keeps the clock disciplined across power cycles even before GPS lock, and survives complete network isolation. Adafruit Ultimate GPS HAT (#2324, MTK3339) is supported as a drop-in alternative; any standard 9600-baud NMEA UART module with PPS will also work.
- One-click setup β Admin β Hardware Settings β GPS runs a checklist that probes every prerequisite (RTC overlay, PPS device,
gpsd/chrony/util-linux-extrapackage state,/boot/firmware/config.txtoverlays, chrony's currently-selected source) and offers a single Run button per remediation step. RTC seeding after a coin-cell change is one click. - Live status in the dashboard β fix quality, satellite count, HDOP, sky plot, PPS pill, and
chronyc trackingare surfaced in real time so an operator can prove stratum 1 lock at a glance. - Why it matters β every EAS event is timestamped, geofenced, and audited; a station that drifts seconds against NIST is a station whose RWT logs and CAP
sent/effective/expiresmath eventually cease to match the real world. Timing is treated as first-class infrastructure, not an afterthought.
See the GPS HAT Setup guide for hardware options, wiring, and the manual configuration steps the admin UI automates.
- Responsive Bootstrap 5 UI β works on desktop, tablet, and mobile
- Real-time updates β Socket.IO pushes live alert and system data without page refresh
- Alert timeline β full history with search, filter, and detail view
- Analytics dashboard β alert frequency, type breakdown, and geographic distribution charts (Chart.js), with one-click PDF export of the full statistics report (jsPDF + html2canvas)
- Audio monitoring β live receive history, source routing view, and playback
- System health panel β CPU, memory, disk, and service status at a glance
- Operator-selectable display units β coords (
D.dddd/DMS), altitude (m/ft), speed (kn/mph/km/h/m/s) and distance (m/ft/mi/nmi) chosen per-browser via Settings β Personalization β Display Units (also reachable from the Help dropdown and the inline Units button on the GPS Dashboard and System Health pages) - Dark-mode-friendly design with accessible color system
- Role-based access control (RBAC) β admin, operator, and viewer roles
- Multi-factor authentication (MFA) β TOTP-based second factor for all accounts
- API key management β generate and revoke keys for automation integrations
- Built-in HTTPS β nginx reverse proxy with Let's Encrypt auto-provisioning
- Self-signed fallback β works out of the box before DNS/cert setup
- Email alerts β configurable SMTP for alert and system health notifications
- SMS β outbound SMS notifications for critical alerts
- SNMP v2c traps β send traps to any NMS target for system health events
- Required Weekly Test (RWT) scheduler β automatically generates and schedules FCC-required weekly EAS tests
- Required Monthly Test (RMT) support β configurable monthly test scheduling
- Cron-style scheduling β flexible time rules for any recurring broadcast task
- Settings Hub β single
/settingsdashboard with links to every configuration page - Stream Profile Manager β multi-stream Icecast configuration with bitrate and format control
sudo eas-configβ interactive whiptail TUI to reconfigure any.envsetting without manual file editing- Alembic database migrations β schema upgrades run automatically on update
- Comprehensive diagnostics β built-in web diagnostics page and CLI scripts for SDR, network, and database
- Alert Self-Test β replay bundled RWT captures to verify your FIPS codes trigger correctly
- System logs viewer β tail journalctl logs from any service directly in the browser
- Docs viewer β browse the full 90+ document library from within the web UI
- Full REST API namespaced under
/api/ X-API-Keyheader authentication β keys generated in the web UI- Endpoints for alerts, GPIO, audio, streaming, and system control
- JavaScript API client for browser-side integrations
- Complete API reference β
Five focused systemd services with clear ownership β a web crash won't affect audio, and a hardware fault won't bring down the dashboard.
graph TB
subgraph External["External Sources"]
SRC[Alert Sources<br/>NOAA Β· IPAWS Β· CAP]
RF[RF Signals<br/>162 MHz Β· SDR]
end
subgraph Services["Systemd Services"]
POLL[eas-station-poller<br/>CAP Feed Polling]
WEB[eas-station-web<br/>Flask Β· Gunicorn]
SDR_SVC[eas-station-sdr<br/>SDR Hardware]
AUDIO_SVC[eas-station-audio<br/>EAS Monitoring]
HW_SVC[eas-station-hardware<br/>GPIO Β· Displays]
end
subgraph Infrastructure["Infrastructure"]
DB[(PostgreSQL 17<br/>+ PostGIS 3.4)]
REDIS[(Redis 7<br/>Cache Β· Pub/Sub)]
NGINX[nginx<br/>HTTPS Β· Proxy]
end
subgraph Output["Outputs"]
TX[FM Transmitter<br/>GPIO Relay]
UI[Web Browser<br/>HTTPS]
LED[LED Β· OLED Β· VFD<br/>Displays]
STREAM[Icecast<br/>Audio Stream]
end
SRC -->|CAP XML| POLL
RF --> SDR_SVC
POLL -->|Store Alerts| DB
WEB -->|Query Data| DB
WEB -->|Commands| REDIS
SDR_SVC -->|IQ Samples| REDIS
AUDIO_SVC -->|Decode| REDIS
NGINX -->|Reverse Proxy| WEB
WEB --> UI
HW_SVC -->|Relay Control| TX
HW_SVC -->|Messages| LED
SDR_SVC -->|Demod Audio| STREAM
style External fill:#3b82f6,color:#fff
style DB fill:#8b5cf6,color:#fff
style WEB fill:#10b981,color:#fff
style AUDIO_SVC fill:#f59e0b,color:#000
style UI fill:#6366f1,color:#fff
| Service | Responsibility |
|---|---|
| eas-station-web | Flask UI, REST API, dashboards β no direct hardware access |
| eas-station-poller | CAP feed polling, XML parsing, deduplication, database writes |
| eas-station-sdr | SDR capture, FM demodulation, SAME decoding, Icecast streaming |
| eas-station-hardware | GPIO relays, OLED/VFD displays, LED sign protocols |
| eas-station-audio | Audio processing, EAS monitoring, Redis pub/sub |
Infrastructure: PostgreSQL 17 + PostGIS 3.4 for persistent storage Β· Redis 7 for real-time metrics and inter-service messaging Β· nginx for HTTPS termination.
Frontend libraries (all vendored locally under static/vendor/): Bootstrap 5, jQuery, Font Awesome, Leaflet (maps), Mermaid (diagrams), Chart.js 3 with the datalabels, matrix and date-fns adapter plugins (dashboards), and jsPDF + html2canvas (client-side PDF report export from the Statistics dashboard).
git clone https://github.com/KR8MER/eas-station.git
cd eas-station
sudo bash install.shThe interactive whiptail TUI installer guides you through every option and then handles everything automatically:
| What you configure | What it does automatically |
|---|---|
| Admin account (user/pass/email) | Installs PostgreSQL, Redis, Python, nginx |
| Hostname, domain, callsign, EAS originator | Generates a secure 64-char SECRET_KEY |
| State, county, FIPS/NWS zone codes | Runs Alembic database migrations |
| Alert sources (NOAA, IPAWS) | Creates your administrator account |
| Icecast streaming passwords | Starts all systemd services |
| Hardware (GPIO, LED, VFD, Zigbee) | Configures nginx with SSL (Let's Encrypt optional) |
Then open https://your-server-ip and log in β your station is live.
π‘ Debian 13 (Trixie) and Python 3.13 are fully supported. The installer auto-detects your OS and selects the right packages.
cd /opt/eas-station
sudo bash update.shBacks up optionally β stops services β pulls latest code β preserves .env β migrates database β restarts everything.
sudo eas-config # interactive whiptail TUI for any .env settingOr visit /settings in the web UI to configure hardware, Icecast, notifications, TTS, FIPS codes, and more.
sudo bash uninstall.sh # stops services, removes files, optionally removes PostgreSQL/Redis/nginx| Category | Minimum | Recommended |
|---|---|---|
| Compute | 2-core CPU, 2 GB RAM | Raspberry Pi 5 (8 GB) or x86 server |
| Storage | 20 GB | 50 GB+ SSD (alerts database grows over time) |
| OS | Debian 12 / Ubuntu 22.04 | Debian 13 (Trixie) Β· Raspberry Pi OS |
| Python | 3.11 | 3.12 or 3.13 |
| SDR | (optional) RTL-SDR v3 | Airspy R2/Mini |
| GPIO | (optional) any relay HAT | Multi-relay HAT + USB sound card |
The install script handles all system packages and Python dependencies automatically. See requirements.txt for the full Python dependency list (50+ packages).
Core infrastructure settings live in /opt/eas-station/.env (auto-generated by the installer):
SECRET_KEY=<64-char hex>
DATABASE_URL=postgresql+psycopg2://eas_station:<password>@127.0.0.1:5432/alerts
REDIS_HOST=localhost
REDIS_PORT=6379
DOMAIN_NAME=your-domain.com
SSL_EMAIL=admin@example.comAll feature settings (hardware, Icecast, TTS, notifications, FIPS codes, stream profiles) are stored in the database and managed through the web UI at /settings.
π‘ Production SSL: The installer can provision Let's Encrypt automatically, or run
sudo certbot --nginx -d your-domain.comat any time after pointing DNS.
|
Amateur Radio / ARES / RACES
Broadcasters & Researchers
|
Emergency Managers
Developers
|
| Status | Item |
|---|---|
| β Done | Multi-source CAP ingestion, SAME encoding, geographic filtering |
| β Done | SDR verification, Icecast streaming, stream profile manager |
| β Done | Settings Hub, system diagnostics, analytics dashboard |
| β Done | SNMP trap notifications, MFA, RBAC, API keys |
| β Done | LED/OLED/VFD display drivers, GPIO relay control |
| β Done | RWT/RMT automatic scheduling |
| π In Progress | Advanced relay control, multi-receiver coordination |
| β³ Planned | FCC Part 11 certification documentation |
| β³ Planned | Cloud sync, mobile app, multi-site coordination |
See Changelog and Feature Roadmap for full details.
| Topic | Link |
|---|---|
| Setup & Installation | docs/guides/SETUP_INSTRUCTIONS |
| SDR Configuration | docs/hardware/SDR_SETUP |
| Daily Operations | docs/guides/HELP |
| REST API Reference | docs/frontend/JAVASCRIPT_API.md |
| Architecture | docs/architecture/SYSTEM_ARCHITECTURE.md |
| Developer Guide | docs/development/AGENTS |
| Remote Dev (VSCode) | .vscode/VSCODE_SETUP.md |
| Full Index | docs/INDEX β 90+ documents |
Quick diagnostics:
- SDR not working?
bash scripts/collect_sdr_diagnostics.shβ SDR Quick Fix Guide - Connection issues?
bash scripts/diagnostics/troubleshoot_connection.sh
git clone https://github.com/KR8MER/eas-station.git
cd eas-station
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # edit with local DB settings
python app.pySee Contributing Guide and Code Standards.
π¨ EAS Station generates valid SAME headers and attention tones. These signals will trigger downstream EAS equipment if coupled to any RF, STL, or streaming chain.
- Not FCC-certified β for laboratory, research, and training use only.
- Never connect to on-air infrastructure without explicit authorization.
- Unauthorized broadcast has real consequences: iHeartMedia paid a $1M settlement (2015); the Olympus Has Fallen trailer misuse cost $1.9M.
- The maintainer will cooperate fully with authorities against any misuse.
See Terms of Use, FCC Compliance, and Trademark Policy.
EAS Station is dual-licensed:
Free to use, modify, and distribute under the GNU Affero General Public License v3. Modifications to network-deployed versions must be made available as source.
For proprietary or closed-source use without AGPL obligations β no source disclosure required, priority support, custom development assistance. See LICENSE-COMMERCIAL.
Copyright (c) 2025-2026 Timothy Kramer (KR8MER)
EAS Station β https://github.com/KR8MER/eas-station
Branding governed by the Trademark Policy. See NOTICE for required attribution details.
NOAA/NWS Β· FEMA/IPAWS Β· PostGIS Team Β· U.S. Census Bureau (TIGER/Line) Β· Putnam County GIS Office Β· Allen County GIS Office Β· Flask Community Β· RTL-SDR Project Β· Amateur Radio Community
| Resource | Link |
|---|---|
| NOAA CAP API | https://www.weather.gov/documentation/services-web-api |
| FEMA IPAWS | https://www.fema.gov/emergency-managers/practitioners/integrated-public-alert-warning-system |
| FCC Part 11 | https://www.ecfr.gov/current/title-47/chapter-I/subchapter-A/part-11 |
| PostGIS Docs | https://postgis.net/documentation/ |
73 de KR8MER π‘