Version 2.12.18
Professional Emergency Alert System
Emergency alert system for Putnam County, OH
What's New in 2.12.18
Latest Release - 2025-11-26
Fixed
- Redirected the policy docs URLs to the canonical `/terms` and `/privacy` routes and updated the documentation index to point to those pages so users no longer see divergent copies of the legal notices.
Release History
v2.12.18
Current
2025-11-26
Fixed (1)
- Redirected the policy docs URLs to the canonical `/terms` and `/privacy` routes and updated the documentation index to point to those pages so users no longer see divergent copies of the legal notices.
v2.12.17
2025-11-25
Fixed (1)
- Redirect permission-denied responses to the dashboard blueprint's admin route so settings pages (including `/settings/alert-feeds`) return a proper 403 flow instead of a 500 BuildError when the non-namespaced endpoint is unavailable.
v2.12.15
2025-11-22
Changed (2)
- Downsampled the continuous EAS monitor to 8 kHz (with automatic resampling from higher-rate sources) so SAME FSK decoding runs at an efficient rate without wasting CPU on unnecessary bandwidth.
- Surfaced both the source and decoder sample rates in the monitor status API so operators can verify the tap is resampling correctly instead of assuming 22.05 kHz.
v2.12.14
2025-11-22
Fixed (2)
- Matched the streaming decoder sample rate to the active ingest source so SAME correlation and preamble detection run at the correct frequency instead of drifting off-sync when sources run at 44.1 kHz.
- Exposed the ingest-driven sample rate in the broadcast adapter stats returned with the EAS monitor status so operators can confirm the tap is aligned with the source.
v2.12.13
2025-12-05
Fixed (3)
- Added broadcast subscription health (queue depth, underruns, last audio time) to the continuous monitor API so the dashboard shows when audio is actually flowing and operators can see the tap is healthy instead of guessing through empty fields.
- Throttled repetitive buffer underrun warnings from the monitor's broadcast adapter while still counting them for visibility, preventing log spam when sources are temporarily quiet.
- Exposed broadcast queue stats and the currently active source in `/api/audio/metrics` so VU meters can distinguish "no signal" from transport failures and display accurate runtime state.
v2.12.12
2025-12-05
Fixed (2)
- Filled the continuous monitor status API with the streaming decoder's health, rate, and sync metrics so every dashboard field renders and operators can confirm the monitor is actively processing audio.
- Tagged live audio metrics with each source's runtime status so the VU meters reflect whether inputs are running instead of dimming as if they were offline.
v2.12.10
2025-12-04
Changed (1)
- Added a selectable streaming mode on the audio monitor that prefers the built-in HTTPS stream by default and only opts into Icecast when operators explicitly choose it, reducing stalls when external ports are blocked.
v2.12.9
2025-12-04
Fixed (1)
- Filter placeholder artwork metadata values (e.g., `null`, `undefined`, root-only paths) in the audio monitor so browsers stop
v2.12.8
2025-12-03
Fixed (1)
- Corrected the default Icecast external port variable so Icecast URLs use the configured `ICECAST_EXTERNAL_PORT` rather than
v2.12.7
2025-12-02
Fixed (1)
- Hardened the SDR audio monitoring stack by adding an auto-healing ingest controller that restarts stalled/error sources,
v2.12.6
2025-12-01
Fixed (2)
- Added a differential RBDS symbol slicer so FM demodulation correctly reconstructs PI/PS/RadioText metadata and keeps the latest
- Hardened the SoapySDR receiver implementation by mapping stream error codes (including SOAPY_SDR_NOT_LOCKED) to descriptive
v2.12.5
2025-11-30
Changed (1)
- Disabled the CAP poller's optional SDR capture orchestration by default so its RadioManager hooks stay idle unless the poller
v2.12.4
2025-11-29
Fixed (1)
- Forced OLED templates with manually positioned lines to default to no-wrapping in the renderer so preview cards and physical
v2.12.3
2025-11-29
Fixed (1)
- Updated the OLED layout migration to use uniquely named bind parameters so Alembic can compile the update statement without colliding with column names, preventing the `bindparam() name 'name' is reserved` failure during upgrades.
v2.12.2
2025-11-29
Fixed (2)
- Added an automatic SoapySDR fallback that retries opening receivers without the serial filter when the initial connection fails, letting Airspy radios initialize even if the driver rejects the serialized arguments.
- Updated the OLED layout migration to JSON-serialize `template_data` before persisting it to PostgreSQL so upgrades no longer crash with `can't adapt type 'dict'` errors.
v2.12.1
2025-11-27
Changed (2)
- Rebuilt the EAS Station wordmark as an inline SVG partial that inherits theme colors for its accent bars and lettering, so the logo automatically matches whichever palette operators choose without filters or manual assets.
- Updated the navigation bar and hero sections on the Help, About, Privacy, Terms, and Version pages to consume the new partial, eliminating duplicate markup and keeping the refreshed layout consistent in every mode.
v2.12.0
2025-11-27
Added (2)
- Introduced two new UI themes, **Midnight** and **Tide**, complete with theme-switcher entries and CSS variable palettes so operators can choose between a deep slate dark mode and a crisp coastal light mode.
- Published NOAA, FEMA IPAWS, and ARRL resource badges plus a curated "Trusted Field Resources" section on the Help page so the most requested links are visual, organized, and no longer broken.
Changed (2)
- Modernized the Help & Operations Guide layout with hero quick links, an operations flow mini-timeline, refreshed typography, and a reorganized assistance section for a more professional flow.
- Added dedicated Help-page utility styles that sharpen quick-link tiles, timeline steps, and resource cards, ensuring the guide matches the rest of the dashboard polish.
v2.11.7
2025-11-18
Changed (3)
- Added a refresh-status meta block on the dashboard map card that now shows the last update time, refresh source, and a live
- Replaced the fixed interval timer with a scheduler that pauses during manual refreshes, resumes after success or failure, and
- Updated the dashboard refresh action so manual, automatic, keyboard, and debug triggers all share the same code path,
v2.11.6
2025-11-23
Changed (1)
- Default location snapshots now seed `area_terms` with an empty list rather than mirroring the removed environment variable,
v2.11.5
2025-11-23
Fixed (1)
- Removed the CAP poller's area-term fallback so alerts only appear on `/alerts` when their SAME or UGC codes match the
v2.11.4
2025-11-22
Fixed (1)
- Fixed duplicate DOM element declarations on the Weekly Test Automation page that threw JavaScript errors and prevented saved
v2.11.3
2025-11-21
Fixed (1)
- Ensured the RWT scheduler always opens a Flask application context before touching the
v2.11.2
2025-11-20
Added (2)
- Added an offline alert self-test harness plus `scripts/run_alert_self_test.py` so operators can replay bundled RWT captures,
- Folded the alert self-test harness into the **Tools → Alert Verification** dashboard so operators can replay bundled or custom
Changed (1)
- Consolidated the alert self-test workflow into the Alert Verification dashboard so operators validate decoding, analytics,
v2.10.0
2025-11-18
Added (50)
- Added comprehensive `utilities.css` with gradient, card, badge, spacing, layout, typography, shadow, border, visibility, and animation utilities
- Created reusable template component partials in `templates/components/` for metric cards, stat cards, page headers, status badges, and data lists
- Built new professional version page (`/help/version`) with tabbed interface featuring Overview, Changelog, Features, System Info, and JSON API tabs
- Added `changelog_parser.py` utility to parse CHANGELOG.md files and extract structured version history
- Integrated git commit information display (hash, branch, date, message) on version page
- Added visual timeline visualization for changelog with animated current version marker
- Added comprehensive feature matrix showing all installed system components and their availability status
- Added copy-to-clipboard functionality for JSON API output
- Clarified the commercial license offer notes pricing covers software only and excludes any hardware costs.
- Extended `/api/system_status` and `/api/system_health` with hostname, primary IPv4, uptime, and primary-interface metadata
- ...40 more
Fixed (101)
- Fixed inconsistent gradient implementations across templates by centralizing in utilities.css
- Fixed missing CSS files (design-system.css, components.css) not being loaded in base template
- Improved dark theme compatibility for version page components
- Removed caching from `/api/audio/metrics` and set explicit no-store headers so VU meters and live audio telemetry refresh in
- Hardened backup API endpoints by validating backup names to block path traversal before
- Removed the CAP poller's area-term fallback so `/alerts` only surfaces entries that explicitly name the configured SAME or
- Ensured the continuous EAS monitor auto-initializes on demand so the audio monitoring page no longer stalls when the monitor
- Added comprehensive audio ingest pipeline for unified capture from SDR, ALSA, and file sources
- Implemented `app_core/audio/ingest.py` with pluggable source adapters and PCM normalization
- Added peak/RMS metering and silence detection with PostgreSQL storage
- ...91 more
Changed (18)
- Updated `base.html` template to include all CSS files in proper order: design-system, base, components, utilities, layout, and enhancements
- Replaced basic version page with comprehensive tabbed interface showing full release history from parsed CHANGELOG.md
- Enhanced version route in `routes_monitoring.py` to include git metadata and parsed changelog data
- Standardized gradient usage across all templates with new utility classes (.gradient-primary, .gradient-success, etc.)
- Improved version page accessibility with URL hash-based tab navigation
- Refined the theming system with higher-contrast logo treatments and added Aurora, Nebula, and Sunset presets to expand the built-in palette while keeping the wordmark legible across gradients.
- Renamed the "EAS Workflow" console to **Broadcast Builder** and linked the Weekly Test Automation page throughout the Broadcast menu and workflow hero banner so automation tooling is obvious to operators.
- **Consolidated stream support in Audio Sources system** - Removed stream support from RadioReceiver model and UI, centralizing all HTTP/M3U stream configuration through the Audio Sources page where StreamSourceAdapter already provided full functionality
- Removed `source_type` and `stream_url` fields from RadioReceiver database model
- RadioReceiver now exclusively handles SDR hardware (RTL-SDR, Airspy)
- ...8 more
v2.9.0
2025-11-15
Added (2)
- OLED alert rotations now preempt normal playlists when `skip_on_alert` is enabled, prioritizing the most severe alert and
- `/api/alerts` now returns each alert's source and (when available) the cached EAS narration text, allowing custom OLED/LED
v2.8.0
2025-02-15
Fixed (43)
- Prevented the `20251113_add_serial_mode_to_led_sign_status` Alembic migration from
- Added an offline pyttsx3 text-to-speech provider so narration can be generated without
- Authored dedicated `docs/reference/ABOUT.md` and `docs/guides/HELP.md` documentation describing the system mission, software stack, and operational playbooks, with cross-links from the README for quick discovery.
- Exposed in-app About and Help pages so operators can read the mission overview and operations guide directly from the dashboard navigation.
- Distributed a `docker-compose.embedded-db.yml` overlay so application services
- Documented open-source dependency attributions in the docs and surfaced
- Inserted the mandatory display-position byte in LED sign mode fields so M-Protocol
- Surface offline pyttsx3 narration failures in the Manual Broadcast Builder with
- Detect missing libespeak dependencies when pyttsx3 fails and surface
- Detect missing ffmpeg dependencies and empty audio output from pyttsx3 so the
- ...33 more
Changed (13)
- Documented why the platform remains on Python 3.12 instead of the new Python 3.13 release across the README and About surfaces,
- Documented Debian 14 (Trixie) 64-bit as the validated Raspberry Pi host OS while clarifying that the container image continues to ship on Debian Bookworm via the `python:3.12-slim-bookworm` base.
- Documented the release governance workflow across the README, ABOUT page, Terms of Use, master roadmap, and site footer so version numbering, changelog discipline, and regression verification remain mandatory for every contribution.
- Suppressed automatic EAS generation for Special Weather Statements and Dense Fog Advisories to align with standard activation practices.
- Clarified in the README and dependency notes that PostgreSQL with PostGIS must run in a dedicated container separate from the application services.
- Documented a single-line command for cloning the Experimental branch and launching the Docker Compose stack so operators can bootstrap quickly.
- Clarified the update instructions to explicitly pull the Experimental branch when refreshing deployments.
- Documented the expectation that deployments supply their own PostgreSQL/PostGIS host and simplified Compose instructions to run only the application services.
- Reworked the EAS Output tab with an interactive Manual Broadcast Builder and refreshed the README/HELP documentation to cover the browser-based workflow.
- Enhanced the Manual Broadcast Builder with a hierarchical state→county SAME picker, a deduplicated PSSCCC list manager, a live `ZCZC-ORG-EEE-PSSCCC+TTTT-JJJHHMM-LLLLLLLL-` preview with field-by-field guidance, and refreshed docs that align with commercial encoder terminology.
- ...3 more
v2.7.5
2025-11-15
Fixed (1)
- Allow first-time deployments to create the initial administrator from a dedicated
v2.7.2
2025-11-15
Fixed (1)
- Restore SDR audio monitor adapters on-demand for all audio ingest APIs, eliminating the recurring 503 responses and broken
v2.7.1
2025-11-15
Fixed (1)
- Backfill SDR squelch columns automatically when legacy deployments haven't run the
v2.7.0
2025-11-14
Added (1)
- Added an audio-monitor provisioning API and UI workflow that auto-starts SDR Icecast streams, surfaces RBDS programme data, and exposes squelch/carrier telemetry directly from the radio settings page for immediate listening checks.
Changed (1)
- Enabled configurable squelch thresholds, timing, and carrier-loss alarms for SDR receivers with service-specific defaults tuned for Raspberry Pi deployments, reducing false positives while keeping CPU usage low.
v2.4.16
2025-11-10
Fixed (1)
- Removed the `APP_BUILD_VERSION` environment override so persistent `.env` files can no longer pin stale release numbers; the UI now always reflects the repository `VERSION` manifest.
v2.4.15
2025-11-10
Fixed (2)
- Ensured the version resolver invalidates its cache when `APP_BUILD_VERSION` or the `VERSION` file changes so dashboards display
- Disabled caching on the built-in documentation viewer routes to prevent browsers and reverse proxies from serving outdated
v2.4.14
2025-11-10
Fixed (1)
- Added automatic cache-busting query parameters to all Flask-served static asset URLs so envoy/nginx layers fetch freshly deployed bundles instead of stale copies (Screenshot_7-11-2025_75931_easstation.com.jpeg).
v2.4.11
2025-11-09
Fixed (2)
- Corrected the documentation viewer's Mermaid block detection to support Windows-style line endings so diagrams render instead of showing raw code.
- Refreshed system version metadata on each request so the footer and monitoring endpoints display the latest release after version bumps.
v2.4.1
2025-11-09
Fixed (4)
- **Resolved production nginx image regressions** - Ensured HTTPS container bundles required tooling and static assets
- Added `certbot` to nginx Docker image so Let's Encrypt provisioning no longer fails with `certbot: not found`
- Copied repository `static/` directory into the image to stop 404 errors for CSS, JS, and image assets
- Updated nginx configuration to use the modern `http2 on;` directive and silence deprecation warnings during startup
v2.3.12
2025-11-15
Fixed (1)
- Hardened admin location validation so statewide SAME/FIPS codes are always accepted and labelled consistently when saving.
v2.3.11
2025-11-14
Fixed (1)
- Fixed admin location settings so statewide SAME/FIPS codes remain saved when operators select entire states.
v2.3.10
2025-11-03
Changed (1)
- Reformatted SAME plain-language summaries to omit appended FIPS and state code
v2.3.9
2025-11-03
Changed (1)
- Display the per-location FIPS identifiers and state codes on the Audio Archive
v2.3.8
2025-11-02
Fixed (1)
- Backfilled missing plain-language SAME header summaries when loading existing
v2.3.7
2025-11-02
Changed (1)
- Linked the admin location reference summary and API responses to the bundled
v2.3.6
2025-11-02
Added (1)
- Added an admin location reference API and dashboard card that surfaces the saved
v2.3.5
2025-11-01
Fixed (1)
- Prevented the public forecast zone catalog synchronizer from inserting duplicate
v2.3.3
2025-11-13
Changed (2)
- Rebased the container on the `python:3.12-slim-bookworm` image, added security upgrades during build, and refreshed pinned Python dependencies (including SciPy 1.14.1) to address Docker Hub vulnerability scans.
- Documented Raspberry Pi 5 (4 GB RAM) as the reference platform across the README, policy documents, and in-app help/about pages while noting continued Raspberry Pi 4 compatibility.
v2.3.2
2025-11-02
Changed (1)
- The web server now falls back to a guarded setup mode when critical
v2.3.1
2025-11-01
Added (1)
- Added one-click backup and upgrade controls to the Admin System Operations panel, wrapping the existing CLI helpers in background tasks with status reporting.
v2.1.9
2025-10-31
Added (1)
- Delivered a WYSIWYG LED message designer with content-editable line cards, live colour/effect previews,
Changed (2)
- Refactored the LED controller to accept structured line payloads, allowing nested colours, display modes,
- Enhanced the LED send API to normalise structured payloads, summarise mixed-format messages for history
v2.1.8
2025-10-30
Fixed (1)
- Inserted the mandatory display-position byte in LED sign mode fields so M-Protocol
v2.1.7
2025-10-29
Changed (1)
- Updated ignore rules and documentation so generated EAS artifacts and runtime logs remain outside
v2.1.6
2025-10-28
Changed (2)
- Aligned build metadata across environment defaults, the diagnostics endpoints, and the
- Refreshed the README to highlight core features, deployment steps, and configuration
v2.1.5
2025-10-27
Added (5)
- Added database-backed administrator authentication with PBKDF2 hashed passwords,
- Expanded the admin console with a user management tab, dedicated login page, and APIs
- Introduced `.env.example` alongside README instructions covering environment setup and
- Implemented the EAS broadcaster pipeline that generates SAME headers, synthesizes WAV
- Published `/admin/eas_messages` for browsing generated transmissions and downloading
Changed (2)
- Switched administrator password handling to Werkzeug's PBKDF2 helpers while migrating
- Extended the database seed script to provision `admin_users`, `eas_messages`, and
v2.1.4
2025-10-26
Added (4)
- Persisted configurable location settings with admin APIs and UI controls for managing
- Delivered a manual NOAA alert import workflow with backend validation, a reusable CLI
- Enabled editing and deletion of stored alerts from the admin console, including audit
- Broadened boundary metadata with new hydrography groupings and preset labels for water
Changed (2)
- Hardened manual import queries to enforce supported NOAA parameters and improved error
- Updated Docker Compose defaults and boundary ingestion utilities to better support
v2.1.0
2025-10-25
Added (4)
- Established the NOAA CAP alert monitoring stack with Flask, PostGIS persistence,
- Delivered the interactive Bootstrap-powered dashboard with alert history, statistics,
- Integrated optional LED sign controls with configurable presets, message scheduling,
- Added containerized deployment assets (Dockerfile, docker-compose) and operational
v2.2.0
2025-10-29
Added (2)
- Recorded the originating feed for each CAP alert and poll cycle, exposing the source in the
- Normalised IPAWS XML payloads with explicit source tagging and circle-to-polygon conversion
Changed (2)
- Automatically migrate existing databases to include `cap_alerts.source` and
- Surfaced poll provenance in the statistics dashboard, including the observed feed sources
v2.3.4
Added (1)
- Documented the public forecast zone catalog synchronisation workflow and
v2.3.0
2025-10-30
Changed (3)
- Normalized every database URL builder to require `POSTGRES_PASSWORD`, apply safe
- Trimmed duplicate database connection variables from the default `.env` file and
- Bumped the default `APP_BUILD_VERSION` to 2.3.0 across the application and sample
v2.4.9
2025-11-09
Fixed (2)
- Switch certbot issuance to standalone HTTP-01 mode so the container itself binds to port 80 during startup,
- Log the standalone challenge server activation so operators can confirm ACME connectivity when debugging
v2.4.8
2025-11-09
Fixed (2)
- Verify existing certificates against the system trust store and expiration before skipping issuance, so stale self-signed chains are purged and a new ACME request runs on startup.
- Log detailed reasons when certificate validation fails and remove the associated material, making it obvious when fallback artifacts block public issuance.
v2.4.7
2025-11-09
Fixed (2)
- Detect existing certificates issued by anything other than Let's Encrypt (including legacy self-signed chains)
- Extend the certificate cleanup routine to treat unknown issuers as invalid, guaranteeing that deployments replace
v2.4.6
2025-11-09
Fixed (2)
- Remove any lingering self-signed certificate directories (including suffixed variants) on
- Extend the certificate purge routine to clean historical self-signed material before certbot
v2.4.5
2025-11-09
Fixed (2)
- Purge the domain's existing `/etc/letsencrypt` material whenever a self-signed
- Force certbot to request a fresh certificate for self-signed domains by
v2.4.4
2025-11-09
Fixed (2)
- Detect legacy self-signed fallback certificates by inspecting the existing fullchain.pem and
- Remove invalid certificate files prior to issuing new ones so nginx never launches with the
v2.4.3
2025-11-09
Fixed (2)
- Detect previously generated self-signed certificates and automatically retry Let's Encrypt
- Tag self-signed fallbacks with a marker file and clear it after successful issuance to avoid
v2.4.2
2025-11-09
Fixed (2)
- Provision certbot in the nginx container via Python's package manager so Let's Encrypt
- Replaced bash-specific `[[ ... ]]` usage in the nginx initialization script with
Installed Features
CAP Alert Monitoring
Core feature
EAS Broadcasting
Core feature
LED Signs
Not configured
VFD Display
v2.1.0+
OLED Support
v2.8.0+
SDR/Radio
v2.1.0+
RBAC Security
v2.3.0+
Audio Subsystem
v2.7.0+
Analytics
v2.0.0+
PostGIS Spatial
Core feature
GPIO Control
v2.1.0+
Docker Deployment
Core feature
Feature Status
This EAS Station installation includes all core features and professional-grade components for 24/7 emergency alert monitoring and broadcasting. Visit the documentation for detailed feature guides.
System Information
Version Details
- System Name
- NOAA CAP Alerts System
- Version
- 2.12.18
- Author
- KR8MER Amateur Radio Emergency Communications
- Description
- Emergency alert system for Putnam County, OH
Git Information
- Commit Hash
unknown- Branch
unknown- Commit Date
- unknown
- Message
- unknown
Time Information
- Timezone
- America/New_York
- Local Time
2025-11-25T17:37:40.382732-05:00- UTC Time
2025-11-25T22:37:40.382710+00:00
Features
- LED Signs
- Not Available
JSON API Response
This data is also available in JSON format at
/version for programmatic access.
JSON Output
{
"version": "2.12.18",
"name": "NOAA CAP Alerts System",
"author": "KR8MER Amateur Radio Emergency Communications",
"description": "Emergency alert system for Putnam County, OH",
"timezone": "America/New_York",
"led_available": false,
"timestamp": "2025-11-25T22:37:40.382710+00:00",
"local_timestamp": "2025-11-25T17:37:40.382732-05:00"
}