Release date: July 2026
Previous baseline: 0.9.6 (beta)
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.
| 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 |
The headline feature of this release cycle is a complete Web-UI accessible from any browser on your network:
/api/status and /api/commandWebSocket 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.
OnAirScreen now speaks MQTT — perfect for studios that already run Home Assistant or any MQTT broker:
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.
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.
:00 and counts down0:00/api/status includes "topOfHour": true in the air[3] object while activeControl 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) |
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 |
WARN:Prio:Text/api/status returns a warnings array with priorities alongside the legacy warn fieldSave and restore complete OnAirScreen configurations as JSON preset files:
A new event logging system tracks everything that happens in your session:
Configurable log levels: DEBUG, INFO, WARNING, ERROR, CRITICAL, NONE — set in General settings or override temporarily via --loglevel on the command line.
/api/status JSON with version, distribution, warnings array, and Top-of-Hour stateutils/cmdtest_http.sh, utils/cmdtest_udp.sh)| 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 |
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 moredefaults.py — one source of truth for all default valueslog_exception()http://<host>:<http-port>/ (default port: 8010)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.