Release date: September 2026
Previous baseline: 0.9.8
OnAirScreen 1.0.0 is the first major version after years of 0.9 in real studios. What 0.9.8 made a connected broadcast companion — Web-UI, MQTT, top-of-hour countdown — 1.0.0 puts on the same screen: loudness, AoIP, analog clock faces, mixer GPI, and Stream Deck.
Since 0.9.8, the work has gone into audio, studio workflow, remote control, and day-to-day reliability. Whether you run OnAirScreen on a studio PC, a Raspberry Pi behind the monitor, or headless in the rack — this is the release that meters the programme, talks to the mixer, and stays controllable from the desk.
If you have been waiting for meters on the on-air display: this is it.
| Area | What's new |
|---|---|
| Audio meters | Stereo L/R, programme LUFS (EBU R128), or both |
| AoIP | Local sound card, Axia Livewire, or AES67 (SAP / pasted SDP) |
| Clocks | Digital, Analog, Numbers, Studio, Railway, and 24h faces |
| Raspberry Pi | Mixer GPI via GPIO — up to eight inputs to LEDs and AIR timers |
| Remote | Bitfocus Companion / Stream Deck, OSC, Web-UI with settings |
| Alarms | TOO LOUD and Silence Detection on the current audio source |
| Quality | PySide6, crash logs, CPU-friendly meters on Raspberry Pi |
| Docs & license | Updated manuals; OnAirScreen Source-Available License (OASL 1.0) |
Studios asked for meters on the on-air display. 1.0.0 has them, full height on the left, configured under Settings → Audio Meters:
Audio/layout: lr / lufs / both)
Default for new installs is L/R + LUFS (both), unit dBTP, Too Loud on.
Integrated I + LRA stays off until started, so a show can sit on M/S all day and only open a gated session when you need it:
| Method | Command / Action |
|---|---|
| UDP / HTTP | LUFSI:START, LUFSI:STOP, LUFSI:TOGGLE, LUFSI:RESET |
| Web-UI | Loudness I+LRA tile (live I and LRA) |
| MQTT | {base_topic}/lufs/integrated/set — Home Assistant switch + reset button |
| OSC | /oas/lufs/integrated, /oas/lufs/integrated/reset |
| Main screen | Right-click / long-press → Start I+LRA, Stop I+LRA, Reset I+LRA |
LUFSI:RESET restarts a running session, or hides frozen I/LRA when the session is stopped. /api/status includes lufsIntegrated, lufsI, and lra.
The same meters can follow a local sound card or the studio AoIP network:
239.192.255.3 UDP 4001), or channel 1–32767 (channel N → 239.192.0.0+N UDP 5004, L24/48 kHz stereo)239.255.255.255 and RFC 2974 224.2.127.254 UDP 9875) or a pasted SDP; L16/L24 at 44.1/48/96 kHz; meters use the first two channelsA shared AoIP Interface selects the NIC for Livewire/AES67 IGMP join (empty = system route). After Apply, capture continues from the stored channel or multicast address even if advertisements stop.
The Web-UI settings overlay has the same Livewire Source and AES67 Stream dropdowns with live discovery and Paste SDP.
TOO LOUD (optional): when true peak exceeds the threshold, show an on-screen warning (priority 1) or trigger LED 1–4. The dBTP ceiling peg uses that threshold.
Silence Detection watches the current audio source (Local / Livewire / AES67):
silence in /api/status and WebSocket{base_topic}/silence/active — Home Assistant binary sensorThe clock can match the room. Choose a face in Settings (dropdown, not Digital/Analog radio buttons). LEDs, timers, meters, and branding stay put.
| Face | Look |
|---|---|
| Digital | LED digits and seconds ring |
| Analog | Classic ticks and hands, no numerals |
| Analog Numbers | 1–12 on the classic analog face |
| Analog Studio | White face with black 1–12 |
| Analog Railway | Station clock with a red ring second hand |
| Analog 24h smooth | Cream face, black 1–12 and red 13–24, sweeping second |
| Analog 24h ticking | Same 24h face with a ticking second hand |
Setting: Clock/face. Remote: CONF:Clock:face= with digital, analog, analog_numbers, analog_studio, analog_railway, analog_24h_smooth, or analog_24h_ticking. Legacy CONF:Clock:digital=False still selects the classic analog face.
Time source remains local clock, NTP, software PTPv2, or SMPTE LTC — as in 0.9.8. The OS clock is never set.
On Raspberry Pi, mixer GPI contacts can light the LEDs and start the AIR timers — up to eight inputs. Configure under Settings → GPIO. Included with the Raspberry Pi shop build and the SD image.
GPIO is local hardware, not a network API. Packaged builds load system python3-gpiozero / python3-lgpio.
The dedicated astrastudio-OnAirScreen Companion module is the recommended Stream Deck path:
GET /api/command?cmd=LED1:ON/api/status$(oas:air1_time), $(oas:lufs_i), $(oas:lra)Studio-1 · 1.0.0)Module: companion-module-astrastudio-onairscreen. Generic OSC remains as an alternative.
OSC on UDP port 8000 (enable under Settings → Network). Prefix /oas. Integers 1/0 mean ON/OFF; no argument means TOGGLE.
| Address | Function |
|---|---|
/oas/led{1-4} | LED |
/oas/air{1-4} | AIR timer |
/oas/air{3-4}/reset | Reset AIR3/AIR4 |
/oas/air3/toh | Top-of-Hour |
/oas/text/now, /next, /warn | Text fields |
/oas/lufs/integrated | Start/stop I+LRA |
/oas/command | Raw API command |
Queries reply to the UDP sender. Optional status push to Companion Generic OSC (Send Host / Send Port).
The browser remote from 0.9.8 is now a full control surface:
Network/websettingspin) — Remote Control stays unprotected; settings can sit behind a PINm:ss, m,ss, or seconds) and count-up vs. countdown in the status tile1–4 toggle LEDs (ignored while typing)The main screen is meant to be used with a mouse or a touch panel:
General/always_start_fullscreen, default off)QUITTING ONAIRSCREEN while the app is shutting down (Q, context menu, or Ctrl+C / SIGINT)Studio-1, max 32 characters) so each OnAirScreen can be identified by location. Shown in the Web-UI, /api/status (instance), MQTT {base_topic}/instance/state, and as a Home Assistant sensor. HA device name becomes OnAirScreen (Studio-1). Remote: CONF:General:instancename=TEXTTimers/TimerTOTHText); default is TOTHonairscreen.log, crash reports for uncaught Python exceptions, and fault.log for native faults. About tab shows the path and can open the folder. After a crash, the next start shows a dialog (open log folder; auto-closes after 30 seconds)LUFSI:START / STOP / TOGGLE / RESET via UDP, HTTP, OSC, MQTT, Web-UI, and Companion/api/status adds instance, silence, lufsIntegrated, lufsI, lra, and countDown on AIR timers (true while AIR3/AIR4 is counting down)CONF:Clock:face= and CONF:General:instancename=| Issue | Fix |
|---|---|
| Clock froze after an NTP timeout | NTP results are delivered on the GUI thread; a watchdog restarts a dead clock timer |
| Digital clock aborted when a time sample had no SMPTE frame count | Clock accepts samples without a frame count |
| NTP lock LED stayed green when the server was unreachable | LED follows the actual lock state |
Date ignored Formatting/dateFormat | Date uses the configured format |
| Digital AM/PM clock showed 0 at midnight | 12-hour mapping displays 12 |
| Opening Settings painted a running AIR/TOTH timer as inactive or 0:00 | Timer display stays live while Settings are open |
| Opening Settings / Apply segfaulted on Raspberry Pi | Mouse handling no longer crashes the packaged app |
| Main-screen hotkeys stopped working | Shortcuts reach Qt again |
| Windows: Settings → Fonts access-violated on first open | Font database warmed at startup; filter installed after widgets exist |
| Weather widget text shadows missing under PySide6 | Drop-shadow effects are parented so they are not garbage-collected |
| AoIP source change without RTP froze the last level | Meters drop to the floor instead of holding the previous value |
| I+LRA burned a CPU core on long sessions | History stays in a NumPy buffer; gated I refreshes about once per second |
| Audio meters were heavy on Raspberry Pi / software rendering | Bars paint from cached pixmaps; DSP runs only when the layout needs it |
| LED and AIR on/off colours applied late | Colour changes take effect immediately after Apply |
| Raspberry Pi GPIO failed in the packaged app | System gpiozero / lgpio loaded; freeze stdlib gaps fixed |
| Web-UI WebSocket did not recover after HTTP polling | Socket is restored automatically |
| Web-UI AIR / loudness buttons overflowed on phones | Layout fits the viewport |
| LUFS heading clipped in the L/R + LUFS layout | Heading no longer clipped left or right |
| Autoflash / timedflash LED blink in Web-UI | Blink restored |
| Startup crashed listing host addresses under PySide6 | Address listing works |
| Audio-device Refresh missed newly plugged inputs | PortAudio re-scan on Refresh |
Fresh install without Audio/layout fell back to L/R only | Default layout is L/R + LUFS |
| MQTT reconnect / AES67 capture continued during quit | Capture and reconnect stop cleanly on quit |
This release does not change how OnAirScreen looks on air by default — it makes the stack maintainable, safer to ship, and lighter on a Pi:
python-osc >= 1.10.2Audio/unit=lufs and no layout key migrate to programme LUFS (layout=lufs) and L/R unit dBTPhttp://your-host:8010/ (default). Settings overlay can use an optional PINdeb and SD image)Manuals: User Manual (English) · Bedienungsanleitung (Deutsch)
OnAirScreen 1.0.0 is for everyone who ran the 0.9 builds on air, filed bugs, tested betas, and said what the screen still needed. Years of that work is in this version.
Happy broadcasting!
— Sascha Ludwig / astrastudio.de
OnAirScreen is source-available under OASL 1.0. Official builds are in the shop. Support the project via a shop license, PayPal, Buy Me a Coffee, or Ko-fi.