Software-defined emergency alerting, engineered like a broadcast appliance.

EAS Station ™ is an open-source, Raspberry Pi-class replacement for commercial EAS encoder/decoders — integrating CAP ingest, SAME audio synthesis, SDR verification, and multi-channel distribution into one disciplined stack.

Research Platform Open Source Pi & SDR Stratum 1 Time Non-Commercial

Compliance & Safety

Read this before you plug anything in. All four apply at once.

Development-Only

Experimental. Not FCC-certified. Use only in controlled lab and training environments until a certification path is established.

No Live RF Leakage

The station emits valid SAME headers and attention tones. Never couple experimental output to on-air RF, STL, or streaming chains without explicit authorization — it will trigger downstream facilities.

Ethics & Accountability

This project exists to strengthen public warning readiness, not to be weaponized. The maintainer will cooperate with authorities against misuse. Treat every generated signal with the gravity of a live alert.

Mission & Scope

CAP in, verified broadcast out — with the paper trail to prove it.

Primary Goal

Give emergency communications teams an automated CAP-to-EAS workflow — from ingestion through broadcast verification — with complete compliance documentation at every stage.

Drop-In Replacement Roadmap

Deliver the nine roadmap pillars — baseband capture, deterministic playout, hardware control, security, resilience, turnkey deployment, compliance analytics, unified documentation, and certification readiness — so the platform mirrors commercial decoders on commodity hardware.

Key Features
  • CAP Feed Aggregation
  • SAME Audio Generation
  • PostGIS Spatial Intelligence
  • SDR Verification
  • Automatic RWT Scheduling
  • LED Sign Integration
  • Custom Display Screens & VFD Graphics
  • MDC1200 Selective Calling
  • Stratum 1 GPS Time Source

Software Stack

Boring, battle-tested pieces wired together deliberately.

Application Framework
Python 3.13
Language runtime for the entire application
Flask logo
Flask
Web framework powering every route & API
Werkzeug logo
Werkzeug
WSGI plumbing under Flask (routing, requests)
Jinja2 logo
Jinja2
Server-side template engine for every HTML page
Socket.IO logo
Socket.IO
WebSocket channel for live alert/radio/GPS updates
Bootstrap 5
Mobile-first responsive UI
systemd logo
Systemd
Native service orchestration
Data & Spatial Layer
PostgreSQL logo
PostgreSQL + PostGIS
Spatial database · geographic filtering
Redis logo
Redis
Metrics cache · inter-service pub/sub
SQLAlchemy logo
SQLAlchemy
ORM behind every persisted entity
Alembic logo
Alembic
Schema migrations · runs on every install/update
GeoAlchemy2
Spatial extensions · PostGIS functions
pyshp
ESRI Shapefile reader for boundaries
Requests
HTTP client for CAP feed polling
BeautifulSoup4
XML/HTML parsing for CAP messages
Servers & Deployment
Gunicorn logo
Gunicorn
Production WSGI server fronting Flask
gevent logo
gevent
Async worker class for thousands of WebSocket clients
Nginx logo
Nginx
Reverse proxy · TLS terminator · static files
Let's Encrypt logo
Let's Encrypt
Certbot-driven automated TLS issuance
Streaming, SDR & Audio
Icecast logo
Icecast
Streams demodulated FM/AM audio over HTTP
SoapySDR logo
SoapySDR
Vendor-agnostic SDR abstraction (RTL/Airspy/SDRplay)
FFmpeg logo
FFmpeg
Codec backend for MP3/AAC stream decode
pydub logo
pydub
Decodes Icecast streams into PCM for monitoring
eSpeak NG logo
eSpeak NG
System TTS narrating CAP alert summaries
Scientific & Signal Processing
NumPy logo
NumPy
Foundation for every IQ buffer, FFT, & bit slicer
SciPy logo
SciPy
DSP filter design (notch, deemphasis, channel)
Numba logo
Numba
JIT-compiles SAME & RBDS workers (~6× faster)
lxml logo
lxml
High-performance XML parser for CAP ingestion
Pillow logo
Pillow
Rasterizes glyphs/bitmaps for VFD & OLED frames
Authentication & Notifications
PyOTP logo
PyOTP
TOTP generation/verification for MFA login
cryptography
Ed25519 + SHA-256 for the tamper-evident audit log chain
Twilio logo
Twilio
SMS delivery for alert forwarding & health alerts
Timekeeping (Stratum 1)
chrony logo
chrony
NTP daemon · serves stratum-1 from GPS + PPS
gpsd logo
gpsd
Multiplexes GPS UART for chrony & dashboards
Hardware Platform
Raspberry Pi
Reference target · also runs on any Linux server
Frontend Libraries (vendored locally)
Chart.js logo
Chart.js 3
Dashboards · datalabels, matrix & date-fns adapter plugins
Leaflet logo
Leaflet
Interactive maps for alert areas and boundaries
Font Awesome
Iconography across the entire UI
jQuery logo
jQuery
Legacy DOM helpers used by some admin pages
Mermaid logo
Mermaid
In-browser diagram rendering for docs pages
jsPDF
Client-side PDF report generation (Statistics dashboard)
html2canvas
DOM-to-canvas snapshots for non-chart PDF sections

Separated Service Architecture

Dedicated services with clear ownership — fault isolation by design.

app

Flask web UI, REST API, dashboards. No hardware access. Reads metrics from Redis.

sdr-service

SDR capture, FM demodulation, SAME decoding, Icecast streaming. USB access.

hardware-service

GPIO relays, OLED/VFD displays, LED sign protocols. I2C/GPIO access.

noaa-poller / ipaws-poller

CAP feed polling, XML parsing, deduplication. Writes to PostgreSQL.

Redis

Real-time metrics, waveforms, command pub/sub. 5 s TTL on live data.

PostgreSQL + PostGIS

Persistent storage for alerts, boundaries, configs, and compliance logs.

The Alert Pipeline

Four stages, one flow — CAP to verified broadcast.

1 · Ingestion

CAP feed polling, message parsing, and validation.

2 · Processing

SAME encoding, audio generation, content composition.

3 · Distribution

Multi-channel output, hardware control, scheduling.

4 · Verification

SDR monitoring, compliance analytics, audit trails.

MDC1200 Selective Calling

EAS breaks squelch only where it should — and identifies itself on every radio it reaches.

EAS Station ™ is the first open-source EAS encoder to natively support MDC1200 selective calling — Motorola's 1200-baud FFSK signalling protocol for Land Mobile Radio (LMR) systems. When EAS alerts are forwarded into a two-way radio dispatch system, MDC1200 ensures they are correctly identified on subscriber displays, selectively routed to authorised radios, and cleanly terminated — exactly as a Motorola infrastructure device would behave.

Pre-Alert PTT-ID

An MDC1200 PTT-ID packet transmits before the SAME header burst. Every subscriber radio on the channel displays EAS Station ™'s unit ID the moment the transmission opens — no ambiguity about the source.

Selective Unmuting

Motorola-compatible subscribers programmed with EAS Station ™'s unit ID break squelch automatically. Radios on the same channel that aren't configured for that ID stay silent — no alert fatigue on channels not intended for EAS.

Clean Post-Alert Close

After the EOM burst, a second MDC1200 packet (op 0x00) cleanly releases the call on every subscriber. The radio's display doesn't latch indefinitely, and the call list logs a complete, properly terminated entry.

Invisible to SAME Decoders

MDC1200 packets sit entirely outside the SAME burst window — before the first header and after the final EOM. Downstream ENDECs and EAS monitors receive a fully conformant SAME signal with no interference.

Dispatch Console Logging

Every EAS transmission appears in the radio system's call list with EAS Station ™'s unit ID, timestamp, and call duration — providing a hardware-level audit trail alongside the software compliance logs.

Fully Configurable

Unit ID, op-code, and argument accept decimal or 0x-hex values. Pre and post positions auto-select complementary op-codes (PTT-ID pre / PTT-ID post), and the entire profile can be switched to None, Bell, Beep, or DTMF with a single setting.

Stratum 1 GPS-Disciplined Time

Real broadcast-grade timing hardware — the station is the reference clock, not a client of one.

EAS Station ™ ships with first-class support for a GPS/PPS HAT that turns the station itself into a true stratum 1 NTP server. chrony consumes a multi-GNSS NMEA fix and the hardware Pulse-Per-Second edge as a kernel refclock, so every alert timestamp, every audit log entry, and every SAME header JJJHHMM field is locked to the satellites — accurate to sub-microsecond, with no upstream internet time required and no drift when the WAN is down.

Multi-GNSS Receiver

Uputronics GPS/RTC HAT with the u-blox MAX-M8Q tracks GPS, GLONASS, Galileo and BeiDou concurrently — fast cold-start, robust urban-canyon performance, and a clean 1 Hz NMEA stream at 9600 baud over the Pi UART.

Hardware PPS Edge

A discrete Pulse-Per-Second line wired to BCM 18 (Uputronics) or BCM 4 (Adafruit) is exposed to the kernel as a /dev/pps0 device and consumed by chrony as a refclock. Sub-microsecond rising-edge accuracy beats any internet NTP source.

True Stratum 1 NTP

With GPS time as the reference and PPS as the on-time marker, chronyc tracking reports Stratum: 1 and offsets in the microseconds. The dashboard's GPS card surfaces fix mode, satellite count, HDOP, and a live PPS pill so the lock can be proven at a glance.

Battery-Backed RTC

An on-HAT RV-3028-C7 (current revisions) or DS3231 (older boards) keeps the system clock disciplined across power cycles even before GPS lock returns. The kernel's `rtc0` is sourced from the HAT, not the SBC's bus, so cold-boots come up with a sane wall clock.

Air-Gap Friendly

The reference is the sky, not pool.ntp.org. EAS Station ™ holds stratum 1 with no internet at all — critical for field deployments, EOC roll-outs, COW trailers, and any site that loses transit during the very emergency the station is meant to cover.

One-Click Setup

Admin → Hardware Settings → GPS probes every prerequisite — RTC overlay, PPS device, gpsd / chrony / util-linux-extra packages, /boot/firmware/config.txt overlays, chrony's selected source — and offers a Run button per remediation step. Even seeding the RTC after a coin-cell change is a single click.

Maintainer

One operator, four disciplines, one lab.

Timothy Kramer (KR8MER), project maintainer

Timothy Kramer / KR8MER

Project Lead · Putnam County, Ohio

Sole maintainer of EAS Station ™ — amateur radio operator with deep roots in public safety and mission-critical communications. The project pairs disciplined engineering with experimental emergency communications research.

Amateur Radio
Emergency Service
Amateur Radio

Licensed since 2004; General Class upgrade in 2025. Active in Skywarn and emergency communications nets.

Public Safety

17 years as a deputy sheriff — first-hand familiarity with Motorola mission-critical infrastructure and public warning workflows.

Electrician

Full-time electrical panel electrician. Brings hands-on hardware discipline and methodical troubleshooting to every layer.

Home Laboratory

Professional-grade radios, RTL-SDR capture nodes, digital paging decoders, and networking gear — used to validate every release.

Data Sources & Acknowledgments

Standing on public data and open-source shoulders.

Geographic Data
Putnam County GIS Office County and municipal boundary data · Greg Luersman, GIS Coordinator · putnamcountygis.com
Allen County GIS Office County and municipal boundary data · Alexis Foundas, GIS Coordinator
U.S. Census Bureau FIPS codes and TIGER/Line shapefiles (rivers, lakes, boundaries)
NOAA National Weather Service Weather forecast zone definitions
Alert & Protocol Sources
NOAA / NWS Weather alert data and CAP specifications
FEMA / IPAWS National alert system integration
Open Source Community
PostGIS Team Spatial database technology
Flask & Pallets Projects Web application framework
RTL-SDR Project Software-defined radio tools
Amateur Radio Community Testing, feedback, and field validation

AMPR Network Notice

Non-commercial use only · AMPR 44.0.0.0/8.

This site may be accessible via the AMPRNet (44.0.0.0/8), the globally routed IPv4 space allocated to the amateur radio community by the Amateur Radio Digital Communications (ARDC) foundation. Per FCC Part 97, ARDC policy, and AMPRNet allocation terms, this service is strictly non-commercial — no for-profit transactions, no commercial advertising.

  • Operated by a licensed amateur radio operator (KR8MER) for non-commercial research, experimentation, and emergency communications training.
  • AMPRNet use remains consistent with FCC Part 97 non-commercial requirements.
  • Commercial use of the 44.0.0.0/8 block is prohibited under ARDC and FCC policy.
  • Gateway registration and routing comply with AMPRNet gateway policies.

See ampr.org for AMPRNet policy and 47 CFR Part 97 for amateur radio regulations.

Additional Resources

Jump straight to docs and external references.