Repository navigation
Releases: gehee/fpvOS
Release list
fpvOS 2026.10.beta4
fpvOS 2026.10.beta4
The radio opens up. Both images now run Open8030 (Thanks to mh1412), an open firmware for the AR8030 radio chip, on the goggle and on the air unit. Latency is down to 27.5 ms median glass to glass, 25 ms with screen tearing (Ascent Lite+ with the fpvOS air image at 864p120, 120 Hz screen). The screen's refresh can now follow the camera, the radio's clock is read off its own frames, and the spectator view, the DVR and the logs got a lot better.
| Version | |
|---|---|
| fpvOS | 2026.10.beta4 (0b26cc2) |
| kestrel-gnd | 2026.10.beta4 (521d0d66) |
| kestrel-air | 2026.10.beta4 (abbd379a) |
| ar_libre | 2026.10.beta4 (5c66a0f) |
| Open8030 | 2026.10.beta4 (89d3c63, upstream v0.2.0) |
Highlights
- Open radio firmware on both ends. Open8030, built from source in both images and the default. RADIO › VRX Radio Firmware switches the goggle back to Artosyn's firmware.
- 27.5 ms glass to glass, 25 ms with screen tearing, measured with an LED and a photodiode (details).
- Screen sync: the screen's refresh follows the camera (DISPLAY › Refresh Sync), so pictures land at the same point of every refresh.
- Frame clock: the radio's clock is read off its frames on both ends, which times every slice exactly.
- New video modes: 864p120 on the Lite and 864p144 on the Lite+.
- Spectator view on a phone over the goggle's WiFi: the goggle's screen, re-encoded.
- DVR: camera recordings that play everywhere, including QuickTime; screen recordings in H.265 at the camera's rate.
- Logs that survive a power-off: with HUD › Debug Info on, the goggle keeps its log on the card and an fpvOS air unit keeps a log of each armed flight.
Installing
Download from the assets below:
fpvOS-vrxpro-2026.10.beta4.img.xz: the goggle's SD card imagefpvOS-2026.10.beta4-Ascent_H_Sky_18_21_10.img: the air unit image (recommended)
Follow the install guide: flash the card with balenaEtcher, and the air unit from your browser with the fpvOS Flasher. The goggle's own firmware is never touched; remove the card and it boots stock again. Keep the air image's file name ending in Ascent_H_Sky_18_21_10.img: both flashing tools check it.
Goggle (Caddx Ascent VRX Pro)
Video and display
- Screen sync: the screen follows the camera's rate; Sync Margin sets how early a picture arrives before its refresh. A new screen starts with Refresh Sync off and is found reliably on hot-plug (its own EDID, not the last screen's).
- Video recovers by itself after a restart: the decoder asks for a keyframe until it has one, and no slice is decoded before its picture parameter set.
- The slice checksum is checked on every video packet; damaged slices are counted in the log.
- The first connection waits for a decent picture before the warp into live video.
Radio
- Open8030 on the goggle's radio by default; RADIO › VRX Radio Firmware (OPEN8030 · STOCK).
- Max Bitrate: 30, 35 and 40 Mbps added.
- The air unit's TX power is the one you chose: the link-up handshake used to ask every air unit for stock's 500 mW Auto.
- Settings are kept per air unit; a stock air unit is served as a stock one.
- The air radio's clock is followed past its 72nd minute (it was off by 2^32 µs after that).
Interface and HUD
- Stats screen and HUD: each slice's latency by stage, frame spacing, the link's bandwidth and channel.
- AIR UNIT › INFO shows more of an fpvOS air unit's capabilities.
- With the canopy HUD, a Betaflight OSD element whose value the canopy already shows (voltage, current, flight mode, speed, Link Quality, DISARMED, and the timer while armed) is left off the OSD, so nothing is on screen twice. A value the air unit gets from the flight controller over MSP leaves its element drawn.
- Betaflight GPS speed is read (the km/h and mph glyphs were wrong).
Gallery, DVR and spectator view
- Camera recordings play everywhere: lost pictures are repaired, QuickTime plays them at the right speed.
- Screen recordings in H.265 at the camera's rate, full range, 30 Mbit/s.
- Gallery playback hides its title, timeline and hints while the recording plays.
- Spectator view: phones get an address and a live view that keeps up; the view is the goggle's screen, re-encoded.
Logs
- HUD › Debug Info on: the goggle writes its log to the card next to the recordings (
fpvOS_<date>_<time>.log, newest 30), and tells an fpvOS air unit to keep flight logs.
Air unit (Caddx Ascent Lite and Lite+)
- Open8030 on the air unit's radio.
- 864p120 (Lite) and 864p144 (Lite+, OS02K10).
- The Lite's TX power never goes above 19 dBm (100 mW), its top level on stock too; every power change is in the log.
- Flight logs on the air unit's flash while the goggle's Debug Info is on: each armed flight from 10 s before arming to 10 s after disarming, with a status line every second (TX power, radio gains, MCS, bitrate), the newest 5, in
/usrdata/fpv/air/logs. - The frame clock: the radio's clock read off its frames (on Open8030's frame interrupts).
Fixes
- The air unit's TX power ignored the setting at link-up (stock's 500 mW Auto was asked for); a Lite could be asked for 26 dBm.
- Link Quality read 9% instead of 90–100% with Betaflight's tenths form.
- After the air unit's 72nd minute, slice times were thrown out and latency doubled.
- Spectator view: the encoder kept running for up to 30 minutes after a phone vanished.
- Recording: a failed start left an empty file; the muxer was not always closed.
- Shutdown: a use-after-free in the display-lock thread.
- The radio library: no allocation per write; one writer per socket at a time.
Known issues
- This is a beta. Fly it, but keep a stock card or goggle handy.
- With a stock air unit (Artosyn's radio firmware on the air side) and Open8030 on the goggle, parts of pictures arrive damaged or not at all, more so as the link changes rate. Flash the fpvOS air image, or set RADIO › VRX Radio Firmware to STOCK.
- The Lite+ has no 1080p mode above 100 fps; its fast modes are 864p120 and 864p144.
fpvOS 2026.10.beta3
fpvOS 2026.10.beta3
The biggest release yet. With an fpvOS air unit, latency is down to about 32 ms glass to glass, and steady. The goggle moves to a kernel built from source with an open radio stack, video is decoded as it arrives instead of a whole picture at a time, and fpvOS now has an image for the air unit too. On top of that: a new settings interface, a DVR gallery and stats screen on the goggle, and better flight controller telemetry in the HUD.
| Version | |
|---|---|
| fpvOS | 2026.10.beta3 (3978b45) |
| kestrel-gnd | 2026.10.beta3 (7b5cd266) |
| kestrel-air | 2026.10.beta3 (c119aff3) |
| ar_libre | 2026.10.beta3 (61dd6ed) |
Highlights
- Much lower, steadier latency: about 32 ms glass to glass with an fpvOS air unit (depending on the display). Intra refresh replaces keyframe bursts (worst case 48–62 ms → ~25 ms), and pictures are decoded as their slices arrive. New DISPLAY › Frame Mode: SPLIT (lowest latency, may show split frames), FULL FRAME (default) or FULL DECODE.
- Open radio stack. ar_libre replaces Artosyn's driver, daemon and library.
- Linux 6.12 with Mesa, built from source.
- An fpvOS image for the air unit: Caddx Ascent Lite and Lite+, flashable with the fpvOS Flasher. Stock air units still work (Compatibility).
- Settings in the canopy, with a channel page that follows your region's rules.
- Gallery and stats on the goggle: play and delete recordings, and see latency, frame pacing and the link live.
- Flight controller telemetry polled over MSP: battery, altitude, GPS, home and flight mode.
- Reactive HUD that moves with the aircraft, from the camera's IMU (Lite) or the flight controller's gyro (Lite+).
Installing
Download from the assets below:
fpvos-vrxpro-2026.10.beta3.img.xz: the goggle's SD card imageAscent_H_Sky_18_21_10.img: the air unit image (recommended)
Goggle: flash an SD card with balenaEtcher
The VRX Pro boots fpvOS from the SD card; the goggle's own firmware is never touched. Remove the card and it boots stock again.
- Install balenaEtcher (Windows, macOS, Linux).
- Flash from file: pick
fpvos-vrxpro-2026.10.beta3.img.xz. No need to unpack it. - Select target: your microSD card (2 GB or more). Check the size so you pick the card, not another drive.
- Flash! Etcher writes the card and verifies it.
- Power the goggle off, insert the card, power it on. You're on fpvOS when you see the fpvOS idle screen instead of the stock UI.
- Power the goggle off and on once more before you record: the first boot sets up the recordings partition on the rest of the card.
Air unit: flash with the fpvOS Flasher (recommended)
The goggle works with a stock air unit too; the fpvOS air image adds the features listed under Compatibility. Ascent Lite and Lite+ only.
- Open the fpvOS Flasher in Chrome or Edge on a desktop computer. Nothing to install.
- Close the Caddx PC tool and any serial terminal.
- Plug the air unit into the computer over USB, click Connect and pick its port.
- Drop
Ascent_H_Sky_18_21_10.imgon the page and read its checks. - Click Flash. The unit restarts twice while it flashes; don't unplug it until the page says it's done.
The Caddx PC tool flashes the same file. Keep the file name as it is: both tools check it. To go back to stock, flash Caddx's own Ascent air unit update the same way.
Goggle (Caddx Ascent VRX Pro)
Video
- Stream decode (kernel rkvdec2 + MPP patches), switchable at run time.
- Early presentation: a picture's top half shown on a second video plane before the bottom half is decoded; only on displays fast enough to benefit, and not while recording.
- The OSD has its own display plane and is only flipped once fully drawn.
- A hung decoder is detected and recovered by a watchdog (
rk_vcodec.rkvdec2_stream_stall_ms, default 50 ms); a picture whose remainder is lost is ended at once instead of stalling the stream. - Latency is measured per slice, from capture of its first row to the scan-out that lights it, split into stages (Enc, RF, Dec, Disp) when the air unit runs kestrel-air.
Radio
- ar_libre (
arlink.ko+libarlink) in place of the vendor stack, with one supervisor and one bring-up at a time in the radio scripts. - Max Bitrate in the VIDEO tab: a cap on kestrel-air's bitrate, sent at every link-up.
- The air unit is offered the same power levels as on stock.
Interface
- New canopy settings UI (see Highlights), with UI Scaling applying to all of it.
- AIR UNIT › INFO: what the linked air unit is and runs, stock's Device Info rows plus the fpvOS version and capabilities of a kestrel-air unit.
- AIR UNIT › SERIAL: counts the flight controller's MSP frames and bytes.
- Camera settings follow what the air unit reports it is running: Rotate and 3D DNR now show the real value.
- Betaflight OSD: every glyph from Betaflight's real symbol table, each cell drawn at its on-screen pixel size, normal letter spacing.
- Menu cleanup: Drone Model, Demo Mode and the HUD Graph are gone (the stats screen replaces the graph); one Clock row; no section headers; Canopy Voltage only shown with the canopy HUD.
Gallery and DVR
- On-goggle gallery: browse, play, seek, pause and delete recordings; thumbnails and lengths shared with the web gallery.
- Stats screen as its own tile, with a 10 s / 1 min / 3 min window.
Air unit (Caddx Ascent Lite and Lite+)
New in this release: ./build.sh air builds an image for the air unit.
- Flashable with the Caddx PC tool or the fpvOS Flasher in the browser (see Installing).
- Runs kestrel-air: the camera pipeline, the encoder and the link in open code, on ar_libre.
- Lite+ support: the OS02K10 camera, detected automatically.
- Camera IMU in the video (
--imu): the Lite's IMU samples carried in the H.265 stream for the reactive HUD; the Lite+ uses the flight controller's gyro (MSP_RAW_IMU) instead. - Flight controller polling over MSP for the HUD (attitude, battery, altitude, GPS, flight modes).
- Tells the goggle what it is and runs (version and info messages), and timestamps each slice on the radio's clock so the goggle can measure glass-to-glass stages.
- SSH over USB: the air unit comes up as a USB network device with a DHCP server at 192.168.2.1. Login
root/rootby default; set your own password or keys at build time (FPVOS_AIR_ROOT_PASSWORD). - Radio robustness: a single failed bus transfer no longer restarts the unit (only a bus that stays wedged does, at most 3 times in a row); start-up gives up after 30 s if the radio never appears, so the flight controller and pair button still work; a radio chip reset restarts the app cleanly instead of leaving no video until a power cycle.
Build and release
- Licences and sources ship with every goggle image.
- ar_libre and kestrel-air are fetched from GitHub at their pinned commits.
Known issues
- This is a beta. Fly it, but keep a stock card or goggle handy.
- Small occasional video artifacts have been seen in test flights.
fpvOS 2026.10.beta2
Second beta. Recording the screen no longer makes the live picture stutter, the video gets to the screen sooner, a broken-up link no longer kills the goggle app, and every Betaflight OSD symbol is drawn correctly.
Before you update
Download fpvos-vrxpro-2026.10.beta2.img.xz, flash it to the SD card with balenaEtcher (no need to unpack it), put the card in the Ascent VRX Pro and power it on.
- Flashing erases your recordings. Put the card in a computer first and copy them off the drive named
dvr. - Settings go back to their defaults, the clock's time zone included.
- An air unit you bound from the fpvOS menu has to be bound again. Units paired under the stock firmware are picked up automatically.
- The first boot takes a little longer while it sets the recordings space up again.
DVR: recording without the stutter
- Screen recording no longer costs the live picture. In beta1, SCREEN recording (video and HUD as you see them, and the default) captured the screen through the display controller, and on this goggle every capture held the display up. While recording, the live picture lost 8-18% of its frames at 1080p60 (and gained about 7 ms of latency), and 37% at 1080p100. Recordings are now put together from the video and the HUD by the goggle's 2D graphics engine, without touching the display. Measured on the live feed while recording: no frames lost, about 1 ms of added latency at 1080p60 and 0.7 ms at 1080p100.
- Recordings look the same as before: 1080p H.264 with the HUD exactly as on screen, in the 720p modes and with Picture Size below 100% too. They run at 60 fps on a 60, 120 or 240 Hz screen (the goggle's own included). On other refresh rates they run at an even fraction of it - 50 fps at 100 Hz, 48 at 144 Hz - where beta1 wrote 60.
- Starting or stopping a recording no longer freezes the video or the HUD, in FPV and SCREEN mode alike. Stopping a 60 s recording could hold the live picture for about 0.3 s while the file was finished. The gallery thumbnail made after each recording no longer competes with the video either.
- Simpler menu: DVR Source is FPV (the air unit's stream as sent, full quality, no HUD) or SCREEN (video and HUD). The 30 fps screen option is gone: recording at 60 now costs the live picture nothing, so there is no reason to pick 30.
- The phone gallery no longer offers a recording that is still starting or being finished, which it could serve, thumbnail or even delete half-written.
The video reaches the screen sooner
- Each picture goes to the decoder as soon as its last part arrives, instead of waiting for the next picture to start: about 5 ms less on the goggle's own part of the delay (from a picture arriving to it being on screen, 33.0 -> 28.0 ms average with 100 fps video).
- Pictures are sent to the screen just before its refresh instead of as soon as they are decoded. With 100 fps video on a 100 Hz screen, every picture used to wait a whole extra refresh, so the gain there should be bigger.
Good to know: the HUD's latency number now reads higher than in beta1, though the video is faster. beta1's "LATENCY (gnd)" only counted the goggle's part, from a picture arriving to it being on screen. beta2's "LATENCY (to vsync)" runs from the camera capturing the picture to the screen refresh it goes out on, so it now includes the air unit and the radio link (about 36 ms with the stock air unit on a 120 Hz screen, more with a higher video bitrate). It still leaves out your screen's own delay.
Stability
- Fixed the goggle app crashing when the video link broke up or the air unit restarted, which lost the video until the goggle was power-cycled.
- With intra refresh switched on, the air unit sometimes mixes pictures from seconds earlier into the live video, which made the picture break up and stall: the goggle now drops them. Damaged video headers are filtered out too, and no longer crash the goggle app.
- A long stretch of broken video no longer makes the goggle app use more and more memory.
OSD
- Every Betaflight OSD symbol is now drawn correctly. In beta1 about 100 of them showed as a box, a wrong letter or a made-up shape: the battery icon read full on an empty pack (and empty on a full one), the home arrow showed as a letter, and the RSSI, throttle, home, GPS satellite, compass and other icons, the units (km/h, mph, m/s, ft...) and the Betaflight logo were missing or wrong.
Other
- Removed from the kestrel-gnd source an OSD font by SNEAKY_FPV that had been committed without its licence (gehee/kestrel-gnd#1), and a second bitmap font of unknown origin. Neither was ever used or put on the card: the OSD draws its own symbols.
- For developers: a per-frame latency trace (
echo 10 > /tmp/ltrace.req), video stream replay (kestrel-gnd --debug-replay FILE), a stream fuzzer (tools/ar8030_fuzz.py), and crash reports that name the thread and the code that faulted.
SHA-256 0b4c2c542f8c8c14a95dbb23dfcf35cf66cba43682f7f015a77d81caf00ce894 fpvos-vrxpro-2026.10.beta2.img.xz
All changes: fpvOS · kestrel-gnd
fpvOS 2026.09.beta1
Initial release, try it out!
Download the img.xz file, flash it with balena etcher, insert the SDCard in the ascent vrx pro and enjoy !