Skip to content

KR8MER/eas-station

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8,032 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EAS Station EAS Station

License: AGPL v3 Commercial License Raspberry Pi Python Flask Socket.IO SQLAlchemy Alembic PostgreSQL + PostGIS Redis Gunicorn Nginx Let's Encrypt Icecast SoapySDR NumPy Bootstrap Leaflet Chart.js Font Awesome

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.


✨ Everything You Get

πŸ“₯ Multi-Source Alert Ingestion

  • 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

πŸ“» FCC-Compliant SAME Audio Engine

  • 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.

πŸ—ΊοΈ PostGIS Geographic Intelligence

  • 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

πŸ“‘ SDR Broadcast Verification

  • 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

⚑ Hardware Integration

  • 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

πŸ›°οΈ Built-In Stratum 1 NTP Time Source

  • 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 β€” chrony consumes 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 header JJJHHMM fields 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-extra package state, /boot/firmware/config.txt overlays, 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 tracking are 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/expires math 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.

🌐 Modern Web Dashboard

  • 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

πŸ”’ Security & Access Control

  • 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

πŸ“¬ Notifications

  • 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

πŸ—“οΈ Automated Scheduling

  • 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

πŸ› οΈ Administration & Operations

  • Settings Hub β€” single /settings dashboard 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 .env setting 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

πŸ“‘ REST API

  • Full REST API namespaced under /api/
  • X-API-Key header 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 β†’

πŸ—οΈ Architecture

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
Loading
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).


πŸš€ Quick Start

One-Command Install

git clone https://github.com/KR8MER/eas-station.git
cd eas-station
sudo bash install.sh

The 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.

Update an Existing Installation

cd /opt/eas-station
sudo bash update.sh

Backs up optionally β†’ stops services β†’ pulls latest code β†’ preserves .env β†’ migrates database β†’ restarts everything.

Reconfigure After Install

sudo eas-config        # interactive whiptail TUI for any .env setting

Or visit /settings in the web UI to configure hardware, Icecast, notifications, TTS, FIPS codes, and more.

Uninstall

sudo bash uninstall.sh   # stops services, removes files, optionally removes PostgreSQL/Redis/nginx

βš™οΈ System Requirements

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).


πŸ› οΈ Configuration

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.com

All 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.com at any time after pointing DNS.


🎯 Who Is This For?

Amateur Radio / ARES / RACES

  • Research and training on CAP-to-EAS workflows
  • Emergency communications lab and net testing
  • Alert relay experimentation
  • Skywarn and public-safety integration study

Broadcasters & Researchers

  • Evaluate a $5K–$7K commercial encoder replacement on commodity hardware
  • Automated compliance logging and audit trail research
  • CAP protocol and SAME encoding experimentation

Emergency Managers

  • Custom alert distribution and geographic targeting testing
  • Understand CAP ingestion pipelines firsthand
  • Integration prototyping with existing systems

Developers

  • Explore a full-stack Python/Flask/PostGIS application
  • Build custom CAP integrations against the REST API
  • Contribute to open-source EAS tooling

πŸ“ˆ Roadmap

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.


πŸ“š Documentation

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

🀝 Contributing

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.py

See Contributing Guide and Code Standards.


βš–οΈ Legal & Compliance

🚨 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.


πŸ“œ License

EAS Station is dual-licensed:

Open Source β€” AGPL v3

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.

Commercial License

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.


πŸ™ Acknowledgments

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/

Made with β˜• and πŸ“» for Amateur Radio Emergency Communications
73 de KR8MER πŸ“‘

About

A professional Emergency Alert System (EAS) platform for monitoring, broadcasting, and verifying NOAA and IPAWS alerts

Topics

Resources

License

AGPL-3.0, Unknown licenses found

Licenses found

AGPL-3.0
LICENSE
Unknown
LICENSE-COMMERCIAL

Stars

Watchers

Forks

Releases

No releases published

Contributors