Skip to content

FPP 10.1

Choose a tag to compare

@github-actions github-actions released this 15 Sep 14:31
· 1264 commits to master since this release
10.1
a482cff

FPP 10.1

FPP 10.1 is a point release on top of 10.0 — 426 commits from 13 contributors in the three and a half weeks since 10.0 shipped. Most of it is bug fixes and polish on the new 10.0 media stack, plus a large amount of security and privacy work.

NOTE: The OS level moves from 2026-08 to 2026-09, but an "OS Level" upgrade is not required to run 10.1. The only changes at the OS level are kernel updates and security patches — recommended, but entirely optional. A normal FPP update from 10.0 gets you every feature and fix listed below.

Enhancements

Audio & Video

  • New real-time audio mixer page — per-node faders, mute/listen, live signal meters on every node, and a master control, all metered inside fppd
  • New RTSP video output — an rtsp:// URL you can paste straight into VLC, ffplay, OBS or a video wall, carrying audio alongside the video with no hand-written SDP file
  • Live preview for video input sources, including V4L2 cameras and test patterns
  • Camera controls and mode enumeration for V4L2 devices
  • New video scaling options — fill and stretch modes, better crop handling, and square-pixel enforcement so video is no longer distorted
  • SDP export for AES67 instances, with matching API endpoints
  • AES67: PTP media clock, stable SAP identity, closed-loop drift correction, multichannel support, per-stream jitter and drift measurement, and sender diagnostics
  • AES67 and PTP status indicators in the UI, including grandmaster address and boundary-clock details, and warnings when the tuning options are set incoherently
  • Media Health Checks for PipeWire and GStreamer, and a much more thorough pipewire_diagnostics script (ALSA compatibility, device contention, xruns, RTSP port validation, AES67 clock rate, service journal errors)
  • yt-dlp is now installed and kept up to date automatically for YouTube video input

Privacy & Security

  • Initial setup is now a four-step wizard — Location, Device, Privacy, Security — with location first so the privacy questions can be asked appropriately for where the player actually is
  • The privacy step shows one row per disclosure with exactly what each one sends, and the same table is shared by the wizard and the Privacy settings page
  • Plugins can now declare what they do with your data, shown before you install; a changed disclosure is presented for review before an update or reinstall lands it, on every install path
  • Plugin manager states that plugins run as root and can change any setting
  • The web UI no longer fetches fonts or anything else from third-party hosts, and the PayPal tracking pixel has been removed from the About page
  • Crash reports redact by declared sensitivity, so "stack traces only" now really means that; binary config files are omitted
  • Statistics are published when the configuration actually changes rather than on every restart,
  • Numerous hardening fixes: path traversal in config/file/script/cape-firmware handling, shell injection in MultiSync rsync, backup device handling, test email and OS upgrade paths, and several heap/stack buffer overflows

Backups

  • Backups now use blob storage — unchanged large areas are referenced rather than duplicated, so the 60 backups a device keeps take far less space
  • The backup page now says on the page exactly what a backup contains
  • "Protect Sensitive Data" has been removed. It claimed to strip passwords but only blanked four keys — the OS password, MQTT password, tether PSK, GitHub PAT, WiFi PSKs and every plugin credential shipped in the clear regardless. Backups are now consistently complete, and should be treated as sensitive files

Plugins

  • Reinstall can now re-clone a plugin whose installed copy can no longer fetch
  • FPP tracks which plugins still need reinstalling after an FPP OS upgrade
  • Update All now reports a plugin whose install script failed, and says which phase of an upgrade failed
  • Nested dependencies are named in the install dialog, so you know which plugin pulled one in
  • FPPDIR is passed to uninstall scripts

Capes & Hardware

  • Board-specific device tree overlay variants from the cape EEPROM, so one cape can ship the right overlay per board
  • New Pi 5 setting to disable the built-in RTC if no battery is connected to actually keep the time
  • Support for 128x128 SH1107 OLED status displays
  • On Pi's, GPIO pin selection now shows detailed labels and info, with gpiochip/line numbers displayed only where they are stable, and Pi P1 header GPIO numbers shown where relevant
  • fppcapedetect can report what a cape's defaults would do without applying any of them
  • A cape flashed onto a blank EEPROM gets its own serial

MultiSync & Discovery

  • Controller detection is now asynchronous, so the MultiSync page fills in without blocking
  • Experience controllers detected over HTTP, including firmware version
  • AlphaPix boards identified by the Device ID they display, plus three fixes for AlphaPix devices going missing or being mistyped
  • Stable identities learned for SanDevices, WLED, Baldrick and Falcon V4/V5, with a MAC fallback for devices reporting no UUID
  • HinksPix firmware version reported on the MultiSync page
  • The local system's own cape now appears in the systems list, and hostname sorting is correct

Web UI

  • New search box on the Settings page that filters settings across all tabs
  • Per-tab spinners on the Settings page, and clearer save feedback
  • Exhaustive F1 help for all Settings pages and the remaining pages, advertised in the Help menu
  • Scheduler: day offsets for holiday-anchored dates — "Thanksgiving -7" or "Christmas +2" resolve automatically each year, mirroring the existing sunrise/sunset offsets
  • Troubleshooting page relaid out with grouped commands and status indicators, plus new PCI commands
  • File Manager can upload and delete locally-kept crash reports
  • A "Reinstall Package" button on the packages page, and much faster package autocomplete
  • Initial setup usability and readability improvements throughout
  • Status now reports media playing outside a playlist instead of "idle"

Developer

  • Change Branch can now switch to an open Pull Request, and to a fork branch when GitHub credentials are configured
  • Change Branch and Copy OS Files show progress logs on the MultiSync page
  • Comprehensive documentation of fppd warnings and their management, plus guidelines for maintaining the in-app help pages
  • Plugin development notes for publishing PipeWire audio sources

Performance

  • API responses are gzip compressed, and the file-backed API routes now carry ETags so an unchanged request answers 304 without rebuilding the body
  • The model and effect lists are versioned, so repeat requests skip the build entirely
  • Host name resolutions are cached, including failures — this removes multi-second stalls during fppd startup and output reload
  • Plugin header indicators are cached

Bug Fixes (since 10.0)

Crashes & Stability

  • Fixed crashes on startup or reload from: a malformed date offset in schedule.json, an unexpected HinksPix discovery reply, a malformed test-pattern config, an FSEQ writer on an unopenable path, empty values and blank lines in the settings file, and an overlay effect command with too few arguments
  • Fixed use-after-free bugs in pixel overlay models (model removed mid-effect, iterating a model's child list), the GStreamer decodebin pad-added callback, and a std::terminate from a SAP announcer start/stop race
  • Fixed out-of-bounds writes: custom overlay model node numbers addressing past the model's channel data, the WLED Dancing Shadows effect writing through index -1, a failed ADS7828 sensor read smashing the caller's stack, an Art-Net reply buffer overflow with long hostnames, and framebuffer page indexes running past the allocated pages
  • fppoled no longer aborts on the FPP 10 array-form gpio.json, and waits for the display's I2C node instead of failing at boot
  • fppd crash handler is more robust when reading the executable path
  • A warning with a countdown is now shown when the fppd restart limit is reached

Pixel Strings & Panels

  • DPIPixels flicker fixes — the WS bit stream is built in RAM rather than in the uncached KMS page, every frame starts with two blank scanlines, the DPI starts at the idle rate instead of the string maximum, and the 0-bit high time is corrected to 312 ns for both latched (up to three banks) and non-latched outputs
  • DPIPixels parks its pixel data pins output-low when released, and KMSFrameBuffer waits a vblank before reusing a page after a flip timeout
  • BBShiftString: the receiver enable pin gates the whole differential bus (a missing mux left every differential port dark), the back-pressure gate is hardened, frames the PRU cannot take are dropped, and an over-budget frame rate warns as soon as it applies rather than after a minute of drops
  • A cape pinout written for the other string driver is now rejected with a clear message instead of a confusing conversion error
  • Test patterns no longer skip the trailing partial pixel, and accept comma-separated channel ranges
  • OLED panel geometry restored so flipped 128x32 displays are not blank
  • The "sequence file does not exist" warning stays up while the player keeps syncing (#2865)

Network & Wi-Fi

  • Pi Zero W / Pi 3B could not join Wi-Fi on PMF-capable routers (#2953)
  • The WPA3 checkbox never connected to most WPA3 routers, and a WPA3 backup network with its own password could not connect
  • Cached Wi-Fi scan results are handled correctly, with better notification of what is being shown
  • Art-Net ArtPollReply universes are populated from Channel Inputs (#2927)
  • Loopback is no longer reported as a discovered system, and one identity is kept per device across its addresses
  • Exim4 smarthost implicit-TLS on port 465 (#2922)
  • MQTT: fixed swapped retain/QoS arguments in MosquittoClient::Publish() (#2954)
  • WebSocket path handling corrected for proxy scenarios

Audio & Video

  • PipeWire format selection works on devices without S16 support (#2958)
  • Stale PipeWire output-group hardware targets (#2902)
  • Fixed channel mapping in output group stream rules
  • Mixer fixes: faders snapping back, slot 1 volume never applying, metering the default sink instead of the node asked for, externally changed values not being followed, and a crash in fppd while metering
  • PipeWire context objects use a nofail flag so a bad object cannot cause a crash loop
  • RTSP video input crash when the camera also offers audio (#2924); only the first video track is taken from an SDP, and FPP says when there is none
  • audioEnabled is honoured for RTSP cameras, not just YouTube
  • GStreamer is initialised before the input/output managers build pipelines
  • Deprecated GValueArray warning in AudioLevelMonitor (#2936)
  • AES67: PTP lock now requires valid management evidence (#2942); phc2sys is no longer run, as it corrupted the system clock against real grandmasters

Backups & Settings

  • Restoring another device's backup no longer takes over your logins, and restoring your own older backup no longer turns off web authentication
  • A player's privacy answers are no longer carried across a restore, and restoring an older backup no longer reports the privacy record as failed
  • Settings containing double quotes are no longer corrupted by a backup/restore cycle, and a cleared credential is properly restored
  • Restoring an automatic backup no longer wipes the email password
  • A backup with an unexpected name no longer takes out the whole backup listing
  • File Copy backups: correct FAT handling order, symlink preservation, mount validation (#2912), a listing race with multiple USB devices (#2903), rsync failures reported as false success (#2907), and utf8 mount option for UTF-8 filenames (#2918)
  • A line with no = in the settings file is no longer treated as a setting

GPIO & Capes

  • Pi header pins claimed by the kernel under strict pinmux are now reclaimed, for DPI/PWM/UART muxing as well as plain GPIO — kernel 6.18 otherwise locked the i2c/spi/uart/i2s header pins away
  • Raw GPIO callbacks never fired under libgpiod v2, and fpprtc misparsed an unquoted piRTC setting
  • The default cape overlay is restored by what is installed rather than what resolved, and config.txt is not rewritten when a cape ships no overlay variants
  • The cached cape image is dropped when the EEPROM no longer has one
  • A cape is no longer credited with an output driver it does not have, and a refused cape default is explained once per reason rather than once per setting
  • PocketBeagle 2 Industrial auto-flash fixed when modules were not loaded in time

Web UI

  • The Settings page no longer breaks on an unknown ?tab= value, a past search no longer hijacks later visits, and the page no longer forces the first tab when one is already marked active
  • The live "Current System Time" clock on the Settings page, dead since the Bootstrap 5 upgrade, works again
  • Sticky headers now initialise on pages that pre-mark their active tab; tab clicks no longer scroll the page; scheduler datepicker popups stay above the sticky table header
  • The Variables page fits on tablets, so the menu collapses again (#2956)
  • Plugin pages and assets that live in a subdirectory load again (#2908), as do plugin directories with no dot in the name
  • The Plugins "Installed" count no longer drops to 0 on the Updates tab, and an offline player no longer reports "All plugins are up to date"
  • About page no longer shows "Up to Date" before the update check has answered, and conflicting update states across views are resolved
  • File Manager upload label no longer sticks on "Saving to disk"
  • Save UI Password button visibility on the settings-ui tab (#2879)
  • FullCalendar event text colour fixed for the light theme
  • js/css no longer cached as immutable, so the browser picks up changes after an upgrade; page-local script and stylesheet includes are cache-busted
  • Playlist selection is validated in the PlayPlaylist and StartPlaylistNow commands
  • Testing dropdowns sync from the running output test reported in fppd status
  • DDP and Twinkly output rows no longer save a leftover universe count
  • Kiosk URL handling respects the configured URL instead of defaulting to localhost
  • The healthcheck warning count now counts each fppd warning separately (#2940)

Upgrade & Install

  • systemd units are re-deployed on a version upgrade
  • Apache/PHP-FPM are no longer gracefully reloaded mid-upgrade, which caused dropped connections; FastCGI connection reuse is disabled
  • Branch and version inputs are validated for git operations (#2910)
  • fppd is stopped via systemctl before branch-switch and version-switch rebuilds, so Restart=always cannot race the missing binary
  • The generated system UUID is preserved across an OS upgrade, and duplicated or truncated hardware serials are rejected
  • Media directory creation no longer aborts installation
  • rpi-swap pinned to plain zram so boot cannot hang on the /var/swap loop
  • Root filesystem copy streams rsync progress so a flash no longer looks hung, and inode tables are zeroed at mkfs rather than on first boot
  • Apache listener configuration handles IPv6 dynamically
  • Normal missing config files are no longer logged as errors

Deprecations

  • The SPI-nRF24L01 channel output is marked deprecated in the UI and log, and will be removed in FPP 11 (#2937)

Installation Instructions

No fppos / "Upgrade OS" step is required to run 10.1. The OS level does move from 2026-08 to 2026-09, but the only changes there are kernel updates and security patches. Applying the 2026-09 fppos (or re-imaging) is recommended if you have the opportunity, but it is optional — a normal FPP update from 10.0 gets you every feature and fix listed above.

Upgrading from 10.0

Go to the FPP About page (about.php) and click "Manual Update". A green "Upgrade" bar will appear on the main status page — click it to start. It typically takes 5-10 minutes. Reboot when it finishes to complete the upgrade.

Upgrading from 9.x or older

Due to incompatibilities with the underlying libraries, an OS Level upgrade is required, and moving from 32-bit to 64-bit requires re-imaging.

  • Fresh install — back up your config, flash the 10.1 image for your board, restore your config.
  • In-place upgrade (same architecture only) — make sure you are fully updated on 9.x first, then About → Upgrade OS → pick the 10.1_2026-09 image for your board. FPP downloads the fppos and installs it. This takes a LONG time. When it reboots into 10.1, delete the fppos file from File Manager → Uploads.

NOTE: In SOME cases the reboot will fail due to library replacement. A power cycle may be needed to get it back up and running.

Which image do I need?

Board Image
64-bit capable Pi (3/4/5, Zero 2 W, CM4/CM5) FPP-v10.1-Pi64.img.zip
Older/32-bit-only Pi FPP-v10.1-Pi.img.zip
BeagleBone Black/Green/PocketBeagle/Green Gateway FPP-v10.1-BBB.img.zip
PocketBeagle 2 / PocketBeagle 2 Industrial FPP-v10.1-BB64.img.zip

Thanks

Code contributions in the 10.0 → 10.1 cycle came from:

Stuart Ledingham, Daniel Kulp, Daryl C, Jessica Ryan, Scott Hanson, Christoph Herth, Pat Delaney, Igor Baranov, Greg Hormann, Kevin Rhodus, Rick Harris, Rob Terry and Vaibhav Srivastava.

Thanks also to everyone who reported, reproduced and tested issues on GitHub and the forums in the weeks after 10.0 shipped — a lot of what is in this release came straight from those reports.

Full changelog: 10.0...10.1