Overview | News | Windows | macOS | Android | iOS | Audio Formats | Components | Encoder Pack | Screenshots | Help & Support | Developer | Old Versions | Other Projects | Blog & Rants
Releases of Panels UI (Reborn)
1.23.0 current version, released on: 2026-11-09
Highlights
- **Your own playlist columns**: `playlist.column.<n> = Label|titleformat|width|align` in a skin's `foo_ui_panels.ini` adds columns to the playlist, for example codec, bitrate, sample rate and bit depth (`Rate|%samplerate%|56|right`). The column header sorts by them too ([#31](https://github.com/santiagorod92/foo_ui_panels/issues/31)).
- **Sorting in your language's order**: the playlist, the playlist switcher and the album browser sort the way your system does: Chinese titles by Pinyin on a Chinese system, Japanese in Japanese order, numbers by value (*Track 9* before *Track 10*).
Added
- `playlist.row_format`: the titleformat for the playlist row's text.
Fixed
- Tracks without a track number no longer show `00.` before the title in the playlist.
- **Your own playlist columns**: `playlist.column.<n> = Label|titleformat|width|align` in a skin's `foo_ui_panels.ini` adds columns to the playlist, for example codec, bitrate, sample rate and bit depth (`Rate|%samplerate%|56|right`). The column header sorts by them too ([#31](https://github.com/santiagorod92/foo_ui_panels/issues/31)).
- **Sorting in your language's order**: the playlist, the playlist switcher and the album browser sort the way your system does: Chinese titles by Pinyin on a Chinese system, Japanese in Japanese order, numbers by value (*Track 9* before *Track 10*).
Added
- `playlist.row_format`: the titleformat for the playlist row's text.
Fixed
- Tracks without a track number no longer show `00.` before the title in the playlist.
1.22.0 released on: 2026-11-07
Highlights
- **See-through JS Panels**: `panel.<name>.transparent = 1` in a skin's `foo_ui_panels.ini` draws that [JS Panel](https://github.com/santiagorod92/foo_js_panel) over what is beneath it (the skin's background, a Now playing panel, the album cover) instead of its own background, like a pseudo-transparent panel in Columns UI. Its script sees `window.IsTransparent`.
- **JS Panel scripts follow the skin**: inside Panels UI, `window.GetColourDUI`/`GetFontDUI` (and the CUI ones) return the skin's colours and fonts: the `color.<panel>.<role>` keys the native panels already use, and new `font.<panel>.<kind>` / `font.<kind>` keys (`Segoe UI, 13, bold`).
- **New layout in the wizard: Cover + JS** (with JS Panel installed): a large album cover with a see-through JS overlay (title, artist, progress); click it to hide the playlist and widen the cover.
Added
- **Hide, show and move panels**: button actions `PANEL:HIDE:<name>`, `PANEL:SHOW:<name>`, `PANEL:TOGGLE:<name>`, `PANEL:MOVE:<name>:<x>,<y>,<w>,<h>` and `PANEL:RESET:<name>` (back to where the skin's script puts it). Overrides last until the skin reloads. JS Panel scripts get them as `panelsui.ShowPanel`, `TogglePanel`, `MovePanel`, `ResetPanel` and `GetPanelRect`.
- **Values from scripts**: a JS Panel script publishes a value with `panelsui.SetValue(name, value)` and the skin reads it with the new `$getvalue(name)`. Nothing is saved, and the skin repaints only when the value changes.
- **More skin state for scripts**: `panelsui.Eval(expr)` runs titleformat the way the skin does; new fields `%pui_mini_mode%` and `%pui_zoom%` (for skins too); scripts hear `on_panelsui_mini_mode(on)` and `on_panelsui_zoom(percent)`.
- **Copy Diagnostics** lists each panel's script, which panels are transparent and any `PANEL:` hide or move in effect.
Fixed
- A JS Panel script's own top-level code now sees its panel name (`panelsui.PanelName`) right away, so the panel's skin colours, fonts and transparency apply from the first paint.
Needs JS Panel 1.5 or later for the JS side; without it skins work as before.
- **See-through JS Panels**: `panel.<name>.transparent = 1` in a skin's `foo_ui_panels.ini` draws that [JS Panel](https://github.com/santiagorod92/foo_js_panel) over what is beneath it (the skin's background, a Now playing panel, the album cover) instead of its own background, like a pseudo-transparent panel in Columns UI. Its script sees `window.IsTransparent`.
- **JS Panel scripts follow the skin**: inside Panels UI, `window.GetColourDUI`/`GetFontDUI` (and the CUI ones) return the skin's colours and fonts: the `color.<panel>.<role>` keys the native panels already use, and new `font.<panel>.<kind>` / `font.<kind>` keys (`Segoe UI, 13, bold`).
- **New layout in the wizard: Cover + JS** (with JS Panel installed): a large album cover with a see-through JS overlay (title, artist, progress); click it to hide the playlist and widen the cover.
Added
- **Hide, show and move panels**: button actions `PANEL:HIDE:<name>`, `PANEL:SHOW:<name>`, `PANEL:TOGGLE:<name>`, `PANEL:MOVE:<name>:<x>,<y>,<w>,<h>` and `PANEL:RESET:<name>` (back to where the skin's script puts it). Overrides last until the skin reloads. JS Panel scripts get them as `panelsui.ShowPanel`, `TogglePanel`, `MovePanel`, `ResetPanel` and `GetPanelRect`.
- **Values from scripts**: a JS Panel script publishes a value with `panelsui.SetValue(name, value)` and the skin reads it with the new `$getvalue(name)`. Nothing is saved, and the skin repaints only when the value changes.
- **More skin state for scripts**: `panelsui.Eval(expr)` runs titleformat the way the skin does; new fields `%pui_mini_mode%` and `%pui_zoom%` (for skins too); scripts hear `on_panelsui_mini_mode(on)` and `on_panelsui_zoom(percent)`.
- **Copy Diagnostics** lists each panel's script, which panels are transparent and any `PANEL:` hide or move in effect.
Fixed
- A JS Panel script's own top-level code now sees its panel name (`panelsui.PanelName`) right away, so the panel's skin colours, fonts and transparency apply from the first paint.
Needs JS Panel 1.5 or later for the JS side; without it skins work as before.
1.21.0 released on: 2026-11-06
Added
- **Skins talk to JS Panel scripts**: a button with the action `JSPANEL:<name>[:<info>]` reaches every [JS Panel](https://github.com/santiagorod92/foo_js_panel) script as `on_notify_data(name, info)` (`info` parsed as JSON when it is), and every change of a skin variable (a `PVAR:` button, a setting) reaches them as `on_panelsui_variable_changed`. Needs JS Panel 1.4 or later; without it the action does nothing.
- **Skins talk to JS Panel scripts**: a button with the action `JSPANEL:<name>[:<info>]` reaches every [JS Panel](https://github.com/santiagorod92/foo_js_panel) script as `on_notify_data(name, info)` (`info` parsed as JSON when it is), and every change of a skin variable (a `PVAR:` button, a setting) reaches them as `on_panelsui_variable_changed`. Needs JS Panel 1.4 or later; without it the action does nothing.
1.20.0 released on: 2026-11-05
Highlights
- **Import a Columns UI layout from the menu**: *View › Panels UI › Import Columns UI layout…* turns a theme's layout export (`.fcl`) into a Panels UI skin and switches to it. No Python or command line needed. Pick the `.fcl` inside the unzipped theme (Eole: `themes/eole/columnsUI_eole.fcl`): the theme's `themes` folder is copied into the foobar2000 profile folder and its `wsh-data` too, without overwriting settings you already have. Splitters, tab stacks and Panel Stack Splitter containers (with their layout scripts) are converted, each Spider Monkey Panel becomes a JS Panel with its script and properties, and ESLyric/OpenLyrics and Shpeck become Panels UI's *Lyric Show* and *Spectrum*. A panel with no Panels UI equivalent is placed by its name, and the import lists those.
Added
- **Button actions** `SKIN:IMPORT_FCL[:<path>]` (the import, with or without the file dialog) and `WINDOWSTYLE:hidetitlebar` / `WINDOWSTYLE:showtitlebar` (as `$windowstyle()`). JS Panel uses the latter for `UIHacks.FrameStyle`, so Eole hides the system title bar and draws its own, as on Columns UI.
- **Skin script**: `%pui_profile_folder%` (the foobar2000 profile folder) and `$findfile(pattern)` (the first file matching `*`/`?` in its name, as Panel Stack Splitter's).
- **Windows fonts on macOS** without aliases: Segoe UI (Light, Semilight, Semibold, Bold, Black, Italic), Tahoma, Verdana, Calibri and Bahnschrift draw with the system font at that weight, Consolas and Cascadia with the system's monospaced font.
- Clipping for JS Panel's JScript Panel 3 layer (`PushLayer`/`PopLayer`), on Windows and macOS.
- `make fcl-skin FCL=… SKIN=… [PRESET=…] [OUTLINE=1]` writes the same skin from a source checkout.
- The new menu command and messages are translated into every language Panels UI ships.
Fixed
- **Crash when a JS Panel switched the skin**: a script that ran a skin action (such as the import) was destroyed while it was still running, and foobar2000 crashed on Windows. Actions that replace the skin (`SKIN:…`, `WIZARD:…`, `MENU`) now run right after the script's call returns.
Changed
- **GitHub release notes are this changelog's section** for the version, in full, instead of the commit titles.
- **Import a Columns UI layout from the menu**: *View › Panels UI › Import Columns UI layout…* turns a theme's layout export (`.fcl`) into a Panels UI skin and switches to it. No Python or command line needed. Pick the `.fcl` inside the unzipped theme (Eole: `themes/eole/columnsUI_eole.fcl`): the theme's `themes` folder is copied into the foobar2000 profile folder and its `wsh-data` too, without overwriting settings you already have. Splitters, tab stacks and Panel Stack Splitter containers (with their layout scripts) are converted, each Spider Monkey Panel becomes a JS Panel with its script and properties, and ESLyric/OpenLyrics and Shpeck become Panels UI's *Lyric Show* and *Spectrum*. A panel with no Panels UI equivalent is placed by its name, and the import lists those.
Added
- **Button actions** `SKIN:IMPORT_FCL[:<path>]` (the import, with or without the file dialog) and `WINDOWSTYLE:hidetitlebar` / `WINDOWSTYLE:showtitlebar` (as `$windowstyle()`). JS Panel uses the latter for `UIHacks.FrameStyle`, so Eole hides the system title bar and draws its own, as on Columns UI.
- **Skin script**: `%pui_profile_folder%` (the foobar2000 profile folder) and `$findfile(pattern)` (the first file matching `*`/`?` in its name, as Panel Stack Splitter's).
- **Windows fonts on macOS** without aliases: Segoe UI (Light, Semilight, Semibold, Bold, Black, Italic), Tahoma, Verdana, Calibri and Bahnschrift draw with the system font at that weight, Consolas and Cascadia with the system's monospaced font.
- Clipping for JS Panel's JScript Panel 3 layer (`PushLayer`/`PopLayer`), on Windows and macOS.
- `make fcl-skin FCL=… SKIN=… [PRESET=…] [OUTLINE=1]` writes the same skin from a source checkout.
- The new menu command and messages are translated into every language Panels UI ships.
Fixed
- **Crash when a JS Panel switched the skin**: a script that ran a skin action (such as the import) was destroyed while it was still running, and foobar2000 crashed on Windows. Actions that replace the skin (`SKIN:…`, `WIZARD:…`, `MENU`) now run right after the script's call returns.
Changed
- **GitHub release notes are this changelog's section** for the version, in full, instead of the commit titles.
1.19.0 released on: 2026-10-31
Features
- let JS Panel scripts drive the skin and draw off-screen
1.18.0 released on: 2026-10-29
Features
- let a skin set the window size with window.size ([#28](https://github.com/santiagorod92/foo_ui_panels/issues/28))
1.17.0 released on: 2026-10-27
Features
- host JS Panel and offer its layouts in the layout wizard (1.17.0) ([#27](https://github.com/santiagorod92/foo_ui_panels/issues/27))
1.16.0 released on: 2026-10-26
Features
- **i18n:** Portuguese, Chinese, Japanese, French, German and Russian ([#26](https://github.com/santiagorod92/foo_ui_panels/issues/26))
1.15.0 released on: 2026-10-23
Features
- **mac:** declare the update source in Info.plist ([#25](https://github.com/santiagorod92/foo_ui_panels/issues/25))
1.14.0 released on: 2026-10-20
Features
- add spanish language
1.13.4 released on: 2026-10-19
Bug Fixes
Documentation
- **win:** dark title bar, menu bar and menus in the main window, closes [#18](https://github.com/santiagorod92/foo_ui_panels/issues/18)
Documentation
- **changelog:** 1.13.4 (and the missing 1.13.3)
1.13.3 released on: 2026-10-18
Bug Fixes
Documentation
- **album-list:** sort Navidrome albums by recently added, closes [#21](https://github.com/santiagorod92/foo_ui_panels/issues/21)
Documentation
- **readme:** Recently added for Navidrome albums needs foo_navidrome 1.31
1.13.2 released on: 2026-10-18
Bug Fixes
- **album-list:** load album grid covers as background thumbnails, closes [#18](https://github.com/santiagorod92/foo_ui_panels/issues/18)
1.13.1 released on: 2026-10-18
Highlights
- **The album browser no longer keeps reloading its covers**: with large cover art foobar2000
Fixed
- **Album browser / cover flow with high-resolution covers** (embedded art or `cover.jpg` of
- **The album browser no longer keeps reloading its covers**: with large cover art foobar2000
stayed busy after start-up and clicks and keys lagged. Fixed.
Fixed
- **Album browser / cover flow with high-resolution covers** (embedded art or `cover.jpg` of
~2000 px and up): the covers on screen kept disappearing and coming back, one CPU core stayed
busy and the rest of the window (playlist, buttons) reacted late or not at all, as if a folder
scan never ended. Covers that are on screen now stay loaded, so the grid loads once and
foobar2000 goes idle. Reported in
[#18](https://github.com/santiagorod92/foo_ui_panels/issues/18).
1.13.0 released on: 2026-10-18
Features
Bug Fixes
Documentation
- **album-list:** sort the album browser by decade, closes [foo_navidrome#37](https://github.com/santiagorod92/foo_navidrome/issues/37)
Bug Fixes
- **windows:** the ARM64EC build loads on Windows on ARM
Documentation
- **changelog:** 1.13.0
1.12.0 released on: 2026-10-15
Features
- Navidrome lyrics in the lyrics panel, fooAvA layout fixes ([#16](https://github.com/santiagorod92/foo_ui_panels/issues/16))
1.11.1 released on: 2026-10-14
Bug Fixes
- keep early INFO log lines, log the main window on macOS and each new track
1.11.0 released on: 2026-10-12
Features
Documentation
- modern seek/volume/button controls, sortable playlist, one-step fooAvA setup ([#15](https://github.com/santiagorod92/foo_ui_panels/issues/15))
Documentation
- shared conventions section with sister repo
1.10.0 released on: 2026-10-11
Features
- 32-bit (x86) Windows build
1.9.0 released on: 2026-10-10
Features
- Windows on ARM (ARM64EC), component log and Diagnostics tab, issue forms ([#14](https://github.com/santiagorod92/foo_ui_panels/issues/14)), closes [#log10](https://github.com/santiagorod92/foo_ui_panels/issues/log10)
1.8.0 released on: 2026-10-09
Features
- screenshots of each layout in the layout wizard ([#12](https://github.com/santiagorod92/foo_ui_panels/issues/12))
1.7.0 released on: 2026-10-08
Features
Code Refactoring
- layout wizard with built-in default layouts; Windows Preferences Dark Mode ([#11](https://github.com/santiagorod92/foo_ui_panels/issues/11))
Code Refactoring
- testable panel logic, shared host input and golden render tests ([#7](https://github.com/santiagorod92/foo_ui_panels/issues/7))
1.6.0 released on: 2026-10-06
Features
- welcome screen, code editor, skin previews and 6x faster rendering ([#6](https://github.com/santiagorod92/foo_ui_panels/issues/6))
1.5.0 released on: 2026-10-06
Features
- **lyrics:** karaoke highlight and tap-to-sync ([#5](https://github.com/santiagorod92/foo_ui_panels/issues/5)), closes [#32768](https://github.com/santiagorod92/foo_ui_panels/issues/32768)
1.4.0 released on: 2026-10-02
Features
- **album-art:** cross-fade to the new cover on a track change
- **album-browser:** type to search, sort, keyboard navigation
- zoom, View > Panels UI menu, mini mode and skin commands
1.3.0 released on: 2026-10-01
Features
Bug Fixes
Other
- Peak meter panel: the skin's "Peakmeter" panels are now drawn natively — LED bars per channel on a -60..0 dB scale with a held-peak marker, in the skin's accent colour.
- Album Art panel: the skin's "Album Art" panels are now drawn natively — the now-playing cover, fitted without distortion. Like the peak meter, it no longer needs a Default UI element, so it works on macOS too.
- Tray icon ($settray): on Windows a notification-area icon — click to show/hide the player, right-click for play/pause, stop, previous/next, show/hide and exit — and minimising sends the player to the tray. On macOS the same menu opens from a menu-bar icon.
- GDI+-style outlines: $gp_set_pen and $gp_draw_rectangle, next to the existing brush fills.
- Playlist keyboard navigation: arrows, Page Up/Down and Home/End (Shift extends the selection, Ctrl moves only the focus), Enter plays, and typing a few letters jumps to a title or album artist. "Show now playing" scrolls to the track.
- Playlist drag and drop: drag selected tracks to reorder them (undoable), and drop files or folders from Explorer / Finder onto the playlist — anywhere else in the window they are added to the end of the active playlist.
- Lyrics: a timing correction per track on top of the global one, "Search online again" to replace wrong lyrics (even ones from tags or a sidecar file), and instrumental tracks from lrclib.net shown as such.
- macOS Preferences page (Display > Panels UI (reborn)): skins root folder, active skin, main script and accent colour, applied immediately.
- Full-resolution rendering on Retina displays (macOS).
- Skin colours for the native panels: color.<role> and color.<panel>.<role> in foo_ui_panels.ini (playlist, album browser, quick search, lyrics, seek bar, volume). Skins without them look as before.
Bug Fixes
- Skin buttons that run menu commands now pick the command by its full menu path (e.g. "Playback/Random") instead of the first command with the same name.
- The playlist updates when the playlist changes instead of redrawing every second, and no longer re-reads every track on each mouse move — large playlists stay responsive.
- The player window shows foobar2000's icon in the taskbar and Alt+Tab.
Other
- The engine's parsing logic (scripts, foo_ui_panels.ini, lyrics, menu actions) is covered by unit tests, run on every build.
1.2.0 released on: 2026-10-01
Features
- skin-agnostic engine, hot reload, diagnostics, tooltips and performance work
1.1.0 released on: 2026-09-30
Features
- macOS support and platform-free core ([#2](https://github.com/santiagorod92/foo_ui_panels/issues/2))
1.0.0 released on: 2026-09-29
## 1.0.0 (2026-09-29)
Features
Documentation
Features
- first public release
Documentation
- extractor emits per-panel scripts
- main menu integration pattern and WM_INITMENUPOPUP TODO
- PanelHost and win_sdk.h conventions
- point to tools/extract_fooava.py
- record local-iteration / push-at-end convention
- record repo conventions in CLAUDE.md
- SkinEngine interpreter architecture
- splitter engine and raw-Win32 layout decision
- wallpaper asset setup + backgroundd=1 to enable background
- Wine deploy/test path and keyboard-forwarding note