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/statusand/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
:00and 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/statusincludes"topOfHour": truein theair[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/statusreturns awarningsarray with priorities alongside the legacywarnfield
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/statusJSON 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) and German (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.pyreduced 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://<host>:<http-port>/(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
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
OnAirScreen is open source. Support the project via PayPal, Buy Me a Coffee, or Ko-fi.