# OnAirScreen 0.9.8 — Release Notes **Release date:** July 2026 **Previous baseline:** 0.9.6 (beta) --- ## A Major Milestone Release OnAirScreen **0.9.8** is not just another incremental update — it is the **largest release in the project's history**. What started as a focused on-air display tool has evolved into a **fully connected, remotely controllable broadcast companion** with a modern web interface, smart home integration, and a dramatically more robust codebase under the hood. Since version **0.9.6**, hundreds of commits have landed across **remote control**, **automation**, **studio workflow**, **security**, and **code quality**. Whether you run OnAirScreen on a studio PC, a Raspberry Pi, or headless in the rack — this release brings features that studios have been asking for, fixes long-standing annoyances, and lays a solid foundation for everything that comes next. If you have been waiting for the right moment to upgrade: **this is it.** --- ## Highlights at a Glance | Area | What's new | |------|------------| | **Web-UI** | Full browser-based remote control with real-time WebSocket updates | | **Smart Home** | MQTT integration with Home Assistant Autodiscovery | | **Studio Workflow** | Top-of-Hour countdown, configuration presets, event logging | | **Warnings** | Priority-based warning system with NTP support | | **API** | TOGGLE commands, REST endpoints, expanded status JSON | | **Quality** | 580+ unit tests, unified error handling, security hardening | | **Docs** | Complete English and German user manuals | --- ## New Features ### Web-Based Remote Control The headline feature of this release cycle is a **complete Web-UI** accessible from any browser on your network: - Real-time status display for **LEDs**, **AIR timers**, and **NOW / NEXT / WARN** text fields - One-click **LED control** with toggle functionality - **AIR timer controls** — start/stop, plus reset for AIR3 and AIR4 - Text input for **NOW**, **NEXT**, and **WARN** messages with clear buttons - **REST-style API** endpoints: `/api/status` and `/api/command` - Version and distribution info shown in the UI - Connection error modal that dims the background and disables controls when the link is lost **WebSocket support** replaces HTTP polling for status updates — changes appear on screen instantly, with no refresh lag. **Dark Mode** is fully supported: toggle via button, preference is saved automatically, and the theme is applied immediately on page load (no flash of light mode). The Web-UI layout has been redesigned for clarity and compactness: status rows for LEDs and AIR timers, side-by-side NOW/NEXT fields, and timer labels (Mic, Phone, etc.) shown directly on control buttons. --- ### MQTT & Home Assistant Integration OnAirScreen now speaks **MQTT** — perfect for studios that already run Home Assistant or any MQTT broker: - **LED switches** (LED1–4) — turn indicators on/off remotely - **AIR timer switches** (AIR1–4) — start and stop timers - **AIR timer sensors** — elapsed time in seconds - **Reset buttons** for AIR3 and AIR4 - **Text entities** for NOW, NEXT, and WARN fields - **Automatic status updates** after every state change - **Automatic reconnection** with autodiscovery re-publishing on reconnect - **Home Assistant Autodiscovery** — devices appear automatically, no manual YAML required MQTT settings (server, port, credentials, device name) are configurable in the settings dialog. The base topic is auto-generated from `onairscreen` plus a unique device ID derived from the MAC address. --- ### Top-of-Hour Countdown (AIR3) A studio-focused feature for radio workflows: a **wall-clock synchronized countdown** to the next full hour, displayed on the **Radio Timer (AIR3)** in `M:SS` format. - Press once to start — calculates remaining time to the next `:00` and counts down - Press again (or send OFF/TOGGLE) — stops and resets to `0:00` - Synchronized with the system clock; stops automatically at the hour - `/api/status` includes `"topOfHour": true` in the `air[3]` object while active **Control options:** | Method | Command / Action | |--------|------------------| | Hotkey `T` | Toggle countdown | | UDP / HTTP | `AIR3TOH:ON`, `AIR3TOH:OFF`, `AIR3TOH:TOGGLE` | | Web-UI | "Top of Hour" button at AIR3 | | MQTT | Publish to `{base_topic}/air3/toh` | | Home Assistant | "AIR3 Top of Hour" button (autodiscovery) | --- ### Warning Priority System Warnings are no longer a single flat message. The new **priority system** supports four levels: | Priority | Type | Behaviour | |----------|------|-----------| | **-1** | NTP | Shown in blue; hidden when higher-priority warnings exist | | **0** | Normal | Standard warning | | **1** | Medium | Higher visibility | | **2** | High | Highest priority | - API command format: `WARN:Prio:Text` - Web-UI shows NTP warnings in the status section with colour coding - **X button** to dismiss warnings (priority 0–2) directly from the status display - `/api/status` returns a `warnings` array with priorities alongside the legacy `warn` field --- ### Configuration Presets Save and restore complete OnAirScreen configurations as **JSON preset files**: - Save, load, list, and delete presets from the settings dialog - Dedicated UI buttons for preset management - Ideal for switching between show formats, stations, or deployment profiles --- ### Event Logging A new **event logging system** tracks everything that happens in your session: - LED state changes - AIR timer start/stop/reset events - Incoming commands (UDP, HTTP, MQTT) - Warning changes - System events Configurable log levels: **DEBUG**, **INFO**, **WARNING**, **ERROR**, **CRITICAL**, **NONE** — set in General settings or override temporarily via `--loglevel` on the command line. --- ### API Enhancements - **TOGGLE** support for LED1–4, AIR1, AIR2, and AIR4 (in addition to ON/OFF) - Expanded `/api/status` JSON with version, distribution, warnings array, and Top-of-Hour state - Command test scripts for HTTP and UDP (`utils/cmdtest_http.sh`, `utils/cmdtest_udp.sh`) --- ### User Experience Improvements - **Tooltips** on all settings widgets - **About dialog** now shows version, distribution, and settings file path - **Complete user manuals** in English ([USER_MANUAL.md](USER_MANUAL.md)) and German ([BEDIENUNGSANLEITUNG.md](BEDIENUNGSANLEITUNG.md)) - Updated screenshots in README --- ## Bug Fixes | Issue | Fix | |-------|-----| | Text clock in 24h mode showed 24-hour numbers (e.g. "12 minutes to **16**") | Text clock now always uses spoken 12-hour form (e.g. "12 minutes to **4**") | | Web-UI template not found in PyInstaller builds | Correct template path resolution for packaged builds | | LED toggle status not updating in Web-UI | Status now refreshes correctly after LED toggles | | Autoflash LED blinking broken in Web-UI | Autoflash behaviour restored in browser control | | Digital clock second LEDs lagged at second rollover | Repaint aligned to wall-clock second boundaries | | Weather widget made API calls when disabled or without API key | API calls suppressed when widget is off or unconfigured | | Crash when UDP/HTTP ports were left empty | Graceful handling of empty port configuration | | IP addresses not shown correctly at startup | Fixed IP display on launch | | HTTP command URL decoding | Correct decoding of URL-encoded command parameters | | PyQt6 compatibility issues | Compatibility fixes across the application | | MQTT client restart logic | Improved reconnect and autodiscovery re-publishing | | `get_default()` font constants | Correct default font values after refactoring | --- ## Under the Hood This release includes a **major internal refactoring** that does not change how OnAirScreen looks on air, but makes it far more maintainable and testable: - `start.py` reduced from ~1,700 to ~1,400 lines by extracting dedicated modules: NTP manager, font loader, signal handlers, system operations, status exporter, UI updater, hotkey manager, logging config, command handler, timer manager, and more - **Central configuration** in `defaults.py` — one source of truth for all default values - **Unified error handling** with a custom exception hierarchy and consistent logging via `log_exception()` - **Security hardening**: input validation and sanitization for all network commands, length limits, control character stripping - **580+ unit tests** covering core modules, Web-UI, API endpoints, MQTT, exceptions, and more - Type hints and docstrings throughout the codebase - Improved multicast support on macOS with dedicated test/diagnostic tools --- ## Upgrade Notes - **Settings are preserved** — existing configuration files are fully compatible - **MQTT** is disabled by default; configure it in Settings → MQTT if needed - **Web-UI** is available at `http://:/` (default port: 8010) - **Presets** are stored as JSON files alongside your settings - For Raspberry Pi / packaged builds: use the latest image or binary from [astrastudio.de](https://www.astrastudio.de/shop/) --- ## Thank You OnAirScreen 0.9.8 represents years of feature requests, bug reports, and real-world studio feedback distilled into one release. A special thanks to everyone who tested beta builds, reported issues, and helped shape this version. **Happy broadcasting!** — Sascha Ludwig / [astrastudio.de](https://www.astrastudio.de) --- *OnAirScreen is open source. Support the project via [PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=YCQKC82DLCHMG), [Buy Me a Coffee](https://www.buymeacoffee.com/saschaludwig), or [Ko-fi](https://ko-fi.com/L3L8BKHYT).*