Changelog
Every AtlasCube firmware release, newest first.
All notable changes to AtlasCube firmware are documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
While the major version is 0, any minor release may introduce breaking changes.
Added
- rules: list running rules in a Running tile on the rules page
- rules: allow waits up to 24 h and keep unchanged rules running across a save
- web: center the screen preview in a 520 px page column
- display: add ST7789V 320x170 driver variant and UI profile
- web: offer a restart after saving wiring or importing settings
- board_pins: release pins before a software restart
- web: embed the wiring builder in the radio's wiring page
- web: exchange wiring with the wiring builder
- web: exchange wiring with the wiring builder
- web: exchange wiring with the wiring builder
- web: open the radio's wiring in the wiring builder
- web: apply I/O slot settings from wiring-builder bundles
Fixed
- www: report refused pins and partial saves when applying wiring
- www: sanitize wiring bundles before review and apply
- display: skip the panel reset pulse when its RST pin is not wired
- ui: skip the station icon update while the radio screen is torn down
- ui: restart the screensaver timer when playback stops
- web: tell strapping pins apart in the setup pin check
- www: pass file paths as data attributes instead of inline onclick
Other
- www: keep the wiring diagram layout on the radio
Added
- voice: play spoken-time clips from the SD card
- touch: add CST328 driver
- www: highlight rules and flow tabs with unsaved changes
- io: show the weather icon beside the temperature in one line
- io: keep a one-line clock or temperature beside scrolling text
- io: add a candle WS2812 effect
- io: per-command VU settings for every layout
- io: ambient WS2812 effects: strip spectrum, glow, crossfade, cycle, wave
- io: add crossfade, colour cycle and wave WS2812 effects
- io: adjustable contrast and fall for the strip spectrum
- io: separate WS2812B strip and matrix output types on the I/O page
- io: spectrum layout on a plain WS2812 strip
Fixed
- pins: list GPIO21 as a broken-out pin
- www: unbind controls from macros whose rule was deleted
Added
- display: add a show/hide toggle for the Network Music screen
- www: flag GPIO changes awaiting a power cycle on the I/O page
- encoder: bind the second knob per screen in the layout editor
- display: add software dimming for GC9A01 modules without a backlight pin
- display: add per-axis image orientation for GC9A01 and fix its MADCTL baseline
- display: add GC9A01 round 240x240 driver and UI profile
- www: show works-always on IR keys in the rules editor
- www: show works-always on IR keys in the rules editor
- www: mark repeat and always-on keys on the remote tiles
- rules: show and edit variables in a tile on the rules page
- ir: raise the remote key limit from 20 to 26
- vars: add RAM variables and gate the IR remote on one
- io: keep the strip's brightness when an effect action leaves it empty
- encoder: add a second rotary encoder with configurable turn actions
- www: add ready-made colour palettes for the WS2812 VU and volume bar
- io: let the VU rule action set zone and peak colours
- sd_player: seek SD tracks from the device screen and the web player
- io: let the matrix-middle rule action set clock and weather colours
- www: move pin setup into the settings quick links and list the backup network
- www: let the setup wizard pick the SD bus and enter SD and Bluetooth pins
- sdcard: log once when SD support is compiled out
- sdcard: log once when SD support is compiled out
- network: add a backup WiFi network tried when the primary one fails
- sdcard: mount the SD card over SPI when sd_cs is set
- ci: add the headless variant to the release build matrix
Fixed
- io: warn about backwards input polarity and ignore buttons held at boot
- net_wallpaper: hold the wallpaper batch until the boot update prompt is dismissed
- net_wallpaper: keep wallpaper fetches off the update and OTA screens
- services: keep rule and remote screen= actions off the update and OTA screens
- www: open the control panel by the rule lane that was clicked
- www: explain the missing layout editor on headless builds instead of a JSON parse error
- www: ignore a pointer release that did not start on the rule block or IR button
- www: name the wizard SD choices by bus (SDMMC/SPI) instead of slot/module
- network: stop the WiFi supervisor overflowing its stack when no saved network is reachable
Fixed
- main: comment out the IR receiver default in defines.h
- ci: keep IR_RX_PIN and DISPLAY_NONE out of release builds
Added
- io: let a rule set the WS2812 background colour
- io: let a rule set the WS2812 background colour
- io: let a rule pick the WS2812 clock layout
- rules: give WS2812 scrolling text its own action block
- io: add matrix VU height and text position to rule actions
- io: split WS2812 matrix between spectrum and scrolling text
- io: support WS2812 matrices chained from side-by-side panels
- io: mirror the open source list on WS2812 matrices
- io: mirror the open source list on WS2812 matrices
- io: mirror the open source list on WS2812 matrices
- io: raise the WS2812 strip limit to 1024 pixels
- io: let rules set the VU bar width and spectrum gap at runtime
- display: add DISPLAY_NONE headless variant without LVGL or UI
- io: switch dimmable outputs back on at their last level
- io: let rules pick the VU layout and the matrix middle at runtime
- io: add scrolling text effect for WS2812 matrices
- audio: add per-station loudness levelling
- display: add SH1122 256x64 grayscale OLED driver
- display: add ST7735 driver and 160x128 UI profile
- ui: show a progress bar during the web UI pull
- audio_engine: add a synchronous announcement chime
- audio: end callback
- audio: make the volume curve switchable between tapered and gentle
- audio: make the volume curve switchable between tapered and linear
- audio: configurable channel-test tone (pink/white/sine, duration) with web UI Play button
- audio: built-in stereo channel-test tone (pink noise) in Settings→Audio for SD-less HW check
- ui: reverse rotation option for animated wheels on radio and SD screens
- radio: support MP3 audio in HLS TS segments via PMT codec probe
- ui: add private animated wheels renderer
- updater_force — re-check and apply without on-screen prompt
- update.log — on-device history of fw/www update outcomes
- updater_www_apply — manifest pull via www.php, version file last
- www staleness check as check_task tail + updater_start www_expected arg
- updater: private builder for the auto-update prebuilt lib
Changed
- updater: reuse one TLS connection across the web UI pull
- updater: reuse one TLS connection across the web UI pull
- engine: give the SD reader a 256 KB buffer and priority above LVGL
- audio: cheaper 48k resample (rsp complexity 1) and stop supervising IDLE1
- www pull requests latest set, server resolves the tag
Fixed
- audio: lower station levelling target to -23 dBFS
- audio: strip UTF-8 BOM from ICY stream titles
- io: keep WS2812 temperature digits off chained-panel seams
- diag: compute CPU load in 64 bits to survive long poll gaps
- net_wallpaper: release every slot's image when a batch fetch starts
- net_wallpaper: size download buffers to the reply, not the 1.5 MB cap
- libjpeg: report free and largest PSRAM when the image alloc fails
- www: export the category sibling's layout alongside the active screen
- main: restore the IR receiver section in defines.h
- ui: keep the web UI pull on screen past the screensaver
- audio_engine: start only i2s after pre-roll so a slow open cannot abort the pipeline
- icy_http_stream: de-frame chunked transfer encoding on the raw http path
- audio_engine: recover the pipeline after a decoder failure
- icy_http_stream: send Range on plain http streams
- audio: move the PCM reserve ahead of the DSP so the VU tracks the sound
- audio: prebuffer PCM before starting I2S
- updater: update.log www line logs hash + matched fw, not stamp metadata
Other
- closed-source component sources before HLS keep-alive fix
Fixed
- ci: fail when a variant define is missing from defines.h
- main: restore the SH1106 display define lost in a board swap
Added
- bt_module: follow volume changes made on the phone
- mqtt_svc: announce the radio to Home Assistant through MQTT discovery
- www: add a Home Assistant discovery switch to the MQTT settings
- www: add a restart button to the System tab
- log_ring: keep errors and warnings on the device across restarts and serve them at /api/log
- www: add an error log page
- status_led: draw chase and progress in columns on a matrix and add row and ripple effects
- www: pick the status LED area in matrix rows on the lighting page
- io: turn off or dim the WS2812 strips with the Blank and Dim screensavers
- ui: apply the screensaver brightness to every screensaver
- www: move WS2812 strip controls from io.html to the lighting page
- io: add a background colour under the WS2812 VU
- io: send the WS2812 VU bars at 25 fps by default, 50 on request
- io: add weather to the middle of the WS2812 matrix
- io: add a clock overlay to the WS2812 matrix
- io: add bar width and band gap to the WS2812 matrix VU
- fonts: add dashes, curly quotes, ellipsis and euro sign to the _eu fonts
- www: split the WS2812B lighting page into Audio, Volume and Status tabs
- io: draw the WS2812 volume bar in rows on a matrix
- io: link the pin setup page from the pin map hint
- io: add a spectrum layout to the WS2812 matrix VU
- io: add WS2812 matrix geometry and a matrix VU layout
- io: add WS2812 current limit
- www: release SD and Bluetooth pins when the wizard answers No
- www: list only existing on-demand rules as rule actions and flag dangling macros
- ui: add optional scrolling of the tuned station name on the tuning dial
- ui: add tuned-station font option to the tuning dial
- ui: add Montserrat 16/20 and bold 14-20 fonts
- ui: add dashed station scale between the tuning dial rows
- ui: add per-screen encoder bindings to the layout editor
- www: allow layout preset export on screens without an SD wallpaper
- ui: add horizontal tuning dial to the radio screen
Changed
- ui: remove the fireworks, plasma and Game of Life screensavers
- audio: move the VU spectrum FFT out of vu_widget
Fixed
- services: resume BT after a voice notification only if it was playing
- www: label the wallpaper fetch buttons as saving the URL
- net_wallpaper: name the URL in download failure log lines
- bt_module: skip AT commands when no BT module is wired
- io: slow the WS2812 spectrum column ballistics so the matrix flickers less
- io: keep live output state when the I/O configuration is re-applied
- io: stop a WS2812 level change flashing the base colour under the VU
- io: step the WS2812 matrix volume bar by whole rows
- io: calibrate WS2812 current limit and floor it at 500 mA
- ui: show radio track title independently of the station name
Added
- www: add light theme with green accents and persistent appearance settings
- www: add display flip, date format and timezone to the setup wizard
- display: add SH1106 as a mode of the SSD1306 driver
- www: add a theme step to the setup wizard
- www: offer to clear all internet and asset slots before a theme install without SD
- www: add layout preset export to download the JSON from layout.html
- voice_time: add an optional chime before spoken time announcements
- www: link the Android app from the wizard's last page
- www: add "Don't show again" box to the setup wizard and make Skip mean not now
- www: add screen colours and screensaver steps to the setup wizard
- settings: add first-run wizard_done flag
- www: add first-run setup wizard
- www: hide PLAYERS menu links for hidden device screens
- www: draw knob artwork in the layout preview
- www: show real colours in the layout preview
- www: install whole theme into internet slots without SD
- www: quick links menu reordered
- ui: move text and element colours to per-screen fields
- settings: add DD.MM.YYYY date format option
- www: add Rules to the quick links menu
- net_wallpaper: tell on screen that a wallpaper fetch is a retry
- www: add quick links menu to the radio page view switch
Changed
- www: replace the page guide with a full contents list
- www: replace colour override checkboxes with plain pickers
- ui: remove dead apply_theme callbacks
- theme: replace dark/light palettes with global colours in ui_profile
Fixed
- settings: offer the setup wizard once on devices updated from older firmware
- www: match the weather widget placeholder to the other elements
- screensavers: use configured day names in digital clock date
- audio: rebuild audio_engine with the slow-open pre-roll fix
- telegram: keep the polling connection open between checks
- services: resume Network Music after a notification instead of the last station
Added
- voice_time: offer Romanian announcements
- voice: make the spoken-time volume a shift against the current level
- ui: add a 5-bar WiFi signal widget
- www: scroll the station list to the selected entry
- voice_time: offer Ukrainian announcements
- voice_time: offer French announcements
- voice_time: offer German and Slovak announcements
- voice_time: hold a configurable pause before the announcement
- voice_time: announce the clock from half-hourly clips on a web server
- www: show the available-update banner on the settings System tab
Changed
- www: drop help.html in favour of the page map
- voice_time: drop the server setting and keep the UI to the choices
Fixed
- ui_manager: tear down live screen widgets when the dim saver is navigated away
- radio_service: silence the programme before a notification, not after
- clock: align the home clock and the spoken time to the minute boundary
Fixed
- icy_http_stream: size the ICY metadata buffer to the protocol maximum
Fixed
- build: compile esp_lcd at -O1 to dodge a GCC ICE
Fixed
- ci: remove incomplete build dir before set-target
Added
- web: add Network Music to device screen preview
- web: refine player navigation and interface switcher
- web: show active and playing source in player navigation
- display: real SSD1306 brightness range and a two-display balance
- display: drive two SSD1306 modules as one 256x64 screen
- web: add a Network Music button to the screen switcher
- display: add SSD1306 128x64 I2C OLED driver
- www: show the active source on the player pages, make BT a plain on/off
- www: show the active source on the radio page, make BT a plain on/off
- rules: give each flow its own colour
- rules: filter rules by enabled state
- network-music: show elapsed time for streams
- network-music: advance queue when a stream ends
- network-music: add three selectable server URLs
- network-music: support categorized endless streams
- espnow_link: browse Network Music by index
- espnow_link: report Network Music as its own source
- settings: auto-enable EQ when band gains change
- io: add relative level step action for PWM and WS2812 outputs
- rules: add rule duplication in editor
- web: add beginner-friendly Web UI guide and navigation
- services: add pause and seek to Network Music
- io: make WS2812 VU and volume bar zone boundaries configurable
- io: make WS2812 VU and volume bar colours configurable
- services: skip failed Network Music tracks, stop after three in a row
- ws2812: move VU, volume feedback and status effects to a unified lighting page
- io: run the volume bar's second half back from the far end
- services: log Network Music listing errors
- www: label layout preset buttons as SD card save/load
- io: set the level an output comes up at after a restart
- io: show the audio level on a WS2812 strip
- screensaver: add internet source to the photo frame
- settings: follow the playing source by default
- main: log the last reset reason at boot
- www: open the playing folder on load instead of listing the server root first
- www: list the saved music server on page load instead of waiting for Open
Changed
- web: share equalizer modal and add it to Network Music
- sdkconfig: execute from PSRAM so flash writes don't stall audio
- audio: move the VU sample ring to PSRAM
Fixed
- web: restore mouse clicks in preview playlists
- display: auto-detect the SSD1306 address
- ui: make the mono profiles legible on 1-bit panels
- net_wallpaper: skip wallpaper fetches on mono builds
- ui: make the mono profiles legible on 1-bit panels
- display: configurable SSD1306 address and a lower 1-bit threshold
- ui: paint the theme background on mono profiles
- media: switch to radio while a network track is playing
- audio: recover playback after an undecodable HTTP track
- services: skip stacked ID3 tags before Network Music playback
- www: reject Network Music folders over the 128-entry device limit
- ui: remember the boot screen however a ring screen is reached
- services: don't resume a station on boot after network music
- services: don't resume a station on boot after network music
- www: show both hold values for the internet photo frame
- ui: let the playlist start a station while another source plays
- www: make dropdown group headings stand out
- rules: offer yet-unbound IR keys as rule triggers
- io: drive four WS2812 strips instead of two
- settings: never write settings.json in place
Added
- network-music: save three server URLs with one active selection
- rules: duplicate an existing rule from the canvas or table editor
- network-music: browse categorized endless streams alongside HTTP MP3 files
Fixed
- network-music: show elapsed playback time for endless stream entries
- rules: give duplicated manual and webhook rules an independent trigger address
Added
- ui: size the MQTT widget column and its controls from the profile
- ui: add an MQTT layout section and a theme-only background tier
- ui: add an MQTT layout section and a theme-only background tier
- ui: give the MQTT screen its own wallpaper and plate opacities
- ws: report Network Music as its own source instead of radio
- status-led: add configurable WS2812 system status indicators
- network-music: add Apache JSON directory listing adapter
- display: add MQTT screen visibility toggle
- add Network Music source and navigation actions
- add contextual action for opening source list
- add action to open Network Music list
- rules: play Network Music tracks from rules
- rules: add WS2812B effect conditions
- io: expose active WS2812B effect state
- rules: add brightness control to WS2812B effect actions
- rules: add guided WS2812B effect actions
- web: add per-rule saving and flow and rule ordering controls
- io: WS2812B volume effect
- rules: add save buttons to every rule
Changed
- network-music: store server URLs in
settings.json; after upgrading from
the former single-server version the address must be entered again
- www: rename the per-screen Theme wallpaper source to Background
- io-web: put the system status LED section first on the I/O page
- status-led: redraw the strip only when a pixel would change
Fixed
- settings: stop the main task overflowing its stack on the boot hostname save
- ui: follow the playing source into Network Music as its own source
- status-led: circle the whole range for batch and OTA instead of a shrinking progress window
- status-led: treat brightness 0 as off instead of a black overlay and skip the spinlock for slots that own no status
- io-web: keep the status LED target list in step with the form
- network-music: let playback supersede directory fetch
- web: prevent WS2812 color picker from reverting
- web: pace static assets while audio is playing
- audio: prebuffer PCM before starting I2S
- io: treat any non-zero PWM level as on
- rules: split WS2812B node labels into two lines
Fixed
- network-music: let a web playback request supersede an in-flight directory listing and report the exact reason when it is rejected
Added
- rules: play a selected Network Music track while preserving its folder queue
- io: add procedural WS2812B effects for rules
- rules: add stateful A/B toggle node
- io: add per-pixel WS2812B control for rules
- io: add PSRAM-backed WS2812B control for rules
- web: reorganize player and management navigation
- rules: add bounded execution history in PSRAM
- rules: add continuous-condition mode to Check nodes
- diag: report the DMA-capable half of internal RAM
- network-music: play through the service so the queue, length and position exist
- network-music: make it a first-class media source for transport and hotspots
- network-music: lay the playlist out from the shared browser section
- network-music: report track position and length for the progress bar
- network-music: add HTTP MP3 playback with dedicated screen and server playlist
- rules: show a rule's id beside its name, on the canvas and in the table
- rules: let import update a rule that is already on the device
- rules: let import update a rule that is already on the device
- scripts: add a web-only flash scope to build-flash.py
- rules: export one rule, and let import add instead of replacing
- rules: offer a dimmable output's level next to its on / off
- io: make the PWM frequency a device-wide setting
- rules: let a check wait for its condition before giving up
- rules: let a check inside a sequence stop the branch when it fails
- rules: set a PWM level from the action list, not by typing the command
- rules: name each group of controls on the shelf
- rules: add blocks from the block they follow, and flag a condition the trigger already decides
- rules: give a rule an else branch, and add the ≥ and ≤ operators
- rules: trigger on an I/O slot crossing a value
- web: show the live pin map on the I/O page
- io: measure analog inputs on the ADC1 slots
Changed
- ui: time label scrolling in ms so a slower speed actually applies
- lwip: halve the TCP receive window, pinned whole by a fast server
- network-music: close the old pipeline before building the next one
- audio: let the MP3 duration parser work from a buffer, not just a file
- network-music: poll a revision counter instead of the 25 KB snapshot fix(network-music): keep the NVS commit off the state mutex fix(network-music): confine the directory proxy to the saved server
- rules: send IR learning to the Remotes tab instead of doing it twice
- rules: list the switch slots under the buttons, IR last
Fixed
- rules: light the block the device actually ran on else branches
- rules: restore condition insertion and drop the redundant check record
- rules: add hold timeout, optimize history, and harden testing and diagnostics
- rules: report queue rejection and improve rule testing
- audio: tear the pipeline down when the retry budget runs out
- network-music: read the length past a big ID3 tag instead of giving up
- ui: rebuild the network-music screen when internet assets land
- network-music: put the worker stack back to 8192, the settings write needs it
- network-music: read the track length before playback, not against it
- network-music: move the worker stack into task_stacks.h and trim it to measurement
- audio: tear the pipeline down when a finite stream ends, not just flag it
- web: name the layout sections and the hotspot action that SD shares with Network Music
- ui: show the VU on Network Music and name the layouts it shares with SD
- network-music: restore the queued track after a fetch, not a radio station
- web: move the Network Music server to the Network tab and style its save button
- web: restyle the Network Music page to the shared header and theme
- audio: handle HTTP EOF and mark playback finished after audio drains
- web: show the PWM frequency range and clamp the field to it
- rules: move Export and Import up beside Save rules
- web: drop the English humidity word from the weather readout
- rules: stop render() unselecting a control the moment it is clicked
- io: the pull-up label said GND, which is where the switch goes, not the pull
- io: tell the card a pin is pending instead of calling it unassigned
- rules: repair the table view and give it every edit the canvas has
- rules: stop the table view throwing on any rule with a condition
- rules: hang the otherwise tab on the condition it forks at
- rules: say what unit an I/O value is compared in
Added
- audio: cap output with audio.volume_max and drop the per-slider one
- bt: stop the radio on every switch to the BT source
- telegram: move polling into settings and name a hook by its door
- telegram: read commands on a schedule a rule owns
- telegram: send a message from a rule through a bot
- rules: name triggers by their source and add a webhook trigger
- web: accept an action string over plain HTTP, not only MQTT
- www: prioritize flows in rules page layout
- rules: open with ready-made rules instead of trigger types
- rules: add a sunrise/sunset trigger and a UDP action, and pack the payloads
- web: name macros and I/O slots in the action lists, and group them
- web: name the rule behind a macro on the I/O and remote pages
- web: back up and restore the rules file from the editor
- web: serve today's schedule at /api/rules/today
- web: show the day's schedule on the rules page
- web: group the canvas by flow when All is showing
- ui: show today's rules and calendar entries on one screen
- rules: tell the UI when today's schedule moves, instead of polling for it
- rules: answer what is scheduled for today, and let the bell count it again
- web: put every task stack in the copied diagnostics report
- web: add a storage check for what rules name on the card
- ui: add a per-screen toggle for the volume overlay
- rules: add a table view and per-flow enabling
- rules: group rules into flows
- rules: show how to start a macro rule over MQTT
- rules: show how to start a macro rule over MQTT
- mqtt: publish brightness, active source and the I/O slots
- mqtt: run actions from cmd/action and publish from a rule
- rules: let an event block play a spoken clip
- rules: add an event block that shows a notification
- rules: let a time trigger run on a date, monthly or yearly
- rules: show the full action text on the block and the full path in the editor
- setup: name the pins held by I/O slots
- rules: show the GPIO number on control blocks
- rules: play a station by name and an SD folder from a rule
- rules: pick a station by name in a play action
- rules: list the parameterised commands next to the field that takes them
- rules: draw physical controls as blocks and drop the controls table
- rules: draw physical controls as blocks and drop the controls table
- rules: list every bound control on the trigger block
- rules: bind a control to a rule from its trigger block
- rules: name remote keys from the rules page
- rules: manage buttons, remote keys and inputs from the rules page
- rules: add a block editor for rules with a live trace
- rules: add a rule engine with time, state and macro triggers
- io: add general-purpose GPIO slots with a web panel
- vu: add a per-screen sensitivity knob for the VU meters
- vu: add LED-style segments to the stereo bar VU
- ui: put the screensaver up from a button or IR key
- ui: add a shared colour override for the clock widget
- eq: add a colour override for the value label
- ui: add shared colour overrides for the weather, mode and event widgets
Changed
- web: name the rule sources the way the I/O page does
- main: allocate every cJSON node from PSRAM, not internal RAM
- web: cap concurrent SD listings on the layout page
- stacks: move seven task stacks off internal RAM into PSRAM
- diag: take the CPU dump's task snapshot from PSRAM
- weather: keep the fetch buffers out of internal RAM
- web: put the HTTP socket pool back to seven after measuring six
- web: trim the HTTP socket pool to six after measuring the peak
- web: take the diag task buffers from PSRAM, not the pool they report
- weather: start the fetch task only while weather is enabled
- stacks: size the action runner, ESP-NOW and LVGL to measurements
- rules: load the page one request at a time
- ws: build the state frame on the broadcast task, not on the caller feat(diag): report every task stack, not the tightest sixteen perf(rules): make the live trace opt-in and off by default
- ws: build the state frame on the broadcast task, not on the caller
- events: reduce the store to the phone-calendar mirror
- display: drop the dim schedule, which is three rules now
- events: drop timed playback, which is a rule now
- www: share one SD path picker, and resolve sd_play like events do
- web: move the I/O slot pins from setup onto the I/O page
- pins: name every bindable pin slotN, with a one-time migration
- io: drop boot=restore and the settings write it dragged along
- io: merge buttons into the slot table
- rules: move the trace above the canvas and the block editor into a popover
- mem: run control actions on one shared task and size stacks from measurements
- vu: flip the VU sensitivity knob so higher means taller bars
- ui: move the shared widget colours to per-screen overrides
Fixed
- web: stop every settings poll behind a hidden tab
- telegram: name the 409 conflict and read the whole reply
- rules: report the count from the reload, not from the table it replaces
- stacks: raise the action runner to 8192, MQTT left it 1184 B
- settings: never restore a saved volume of zero at boot
- web: make a flow read as one card, not a bar above loose lanes
- rules: name the state fields after what they actually test
- stacks: give the action runner and the I/O sweep room they actually need
- rules: keep a rule's name in step with its notification title
- rules: let a boot rule wait for the clock its condition needs play a notification clip from anywhere on the card
- web: quiet the 404 for a config file that has not been created yet
- events: stop the notification clip when the notification is dismissed
- rules: stop rebuilding the canvas while a field is being typed into
- rules: keep fire state across a reload, and seed state triggers without firing
- sd: reject SD paths that cannot resolve, and say when one falls back
- rules: don't hand a new macro rule a number a control already uses
- setup: count folded-away slot pins as taken
- www: style the I/O page save button
- config: raise the esp_timer task stack, which writes the settings file
- io: size the slot task for the settings-save path it can reach
- buttons: keep the list-screen re-mapping to keys, not to every action
- rules: start a new shelf row for each kind of control
- rules: box a control's press and hold together on the shelf
- rules: let an action switch to a custom command the catalogue also lists
- rules: address the trigger block by the key it is drawn with
- rules: drop the rule id from the lane header
- rules: name blocks after the buttons that add them
- rules: show I/O slot names in actions and hide slots that are not wired
- web: stop the layout editor clamping number fields mid-typing
- eq: centre-anchor the value label so it holds still as the text grows
- sdcard: skip the mount worker when the pin map has no SD lines
Added
- sd: add a knob width setting for the progress bar
- eq: add a knob height setting next to the knob width
- eq: add a colour override for the response curve
- vu: add colour zones to the spectrum bar VU
- buttons: let Next/Prev/Play drive the list on the playlist and SD browser screens
- control: add brightness commands and defer volume/brightness writes to flash
- www: export and import the whole IR remote, photo included
- www: offer ready-made symbols when editing a remote button
- web: delete stored files over DELETE /api/files and keep tile colour when see-through
- www: add drag-and-drop remote view with photo backdrop for IR keys
- ir: add IR remote receiver with learnable key map
- weather: make condition names editable per language
- ci: add ST7789V + FT6336U build variant
- layout: call out in red when online artwork ships no layout
- layout: name what each internet slot holds and warn before replacing it
- layout: show whether an online wallpaper ships a layout
- layout: apply the published layout when a wallpaper goes into a net slot
- sd_player: add optional knob artwork riding the progress bar
Changed
- www: group the SD playback time row under playback info
- settings: defer the flash write for every setting a held key can spam
- www: gather IR and ESP-NOW remotes in one settings tab
- layout: state AI-generated artwork once per gallery, not per card
Fixed
- buttons: open the selected entry with any play key on list screens
- control: refuse a source switch to hardware the board does not have
- control: leave Bluetooth when switching to radio even if the stream never stopped
- www: alignment settings tabs
- www: lay the remote toolbar out as a grid so the buttons and checkbox line up
- www: version the remote photo URL so a replaced picture actually shows
- www: show a tile preview when editing a remote button and stop the emoji placeholder posing as a value
Added
- buttons: add ui:menu action opening the home hub overlay
- settings: add configurable weekday names
- media_control: add a source-aware pause command
- board_pins: add nine configurable button pins
- buttons: add polled button driver with a configurable action map
- media_control: add mute, screen and sd shuffle/repeat commands
- web: add the Buttons action-map tab
Changed
- defines: add HAS_BT_MODULE / HAS_ENCODER switches and fix the BT pin typo
- defines: gate the CTP and SD pin blocks on their variant
- ui: drop the ENCODER_ prefix from input events
- encoder: move the push-button to the buttons component
- ui: drop the ENCODER_ prefix from input events
Fixed
- scripts: warn instead of aborting when otadata erase fails
- www: link the web UI zip from atlascube.net instead of github
- buttons: keep action labels readable in the 440px settings card
Added
- scripts: ask whether to open the monitor after flashing
- espnow: trace the link's internal-heap cost under TRACE_ESPNOW
- audio: make the volume curve switchable between tapered and gentle
- audio: make the volume curve switchable between tapered and linear
- www: reject a full-flash image in the firmware upload panel
- ota: unify the firmware panel and export only the app image
- www: link the screen preview from the home page
- www: make the on-screen volume slider draggable in the preview
- ui: expose the equalizer's frequency and hint fonts in the profile JSON
- www: preview the equalizer screen in a modal
- ws: broadcast bt_playing in the state frame
- www: add the Bluetooth screen to the preview page
- www: open the preview with the list screen and remember the source
Changed
- ui: stop the VU meters burning float work while at rest
- ui: move screensaver and layout-editor buffers out of internal DRAM
- call the hardware remote a remote, not a pilot
- www: drop the background-tier badge from the preview
- www: move the event bell toggle from Settings to the Events page
Fixed
- www: keep the preview toolbar on one row on narrow screens
- www: make the preview volume bar visible and knob-only
- audio: reset the retry budget only after a stream has played
- net: drop hardware AES so TLS stops needing DMA-capable internal RAM
- www: load the preview's boot requests two at a time
- www: cap the equalizer modal height with a percentage, not vh
- mqtt: derive the default client_id from the MAC to avoid broker collisions
- display: serialize SSD1322 brightness writes against the LVGL flush
- bt: confirm a play announcement with a moving position before switching source
- www: draw preview artwork from the canvas instead of a PNG data URL
- www: drive BT play/pause from bt_playing, not the source-aware toggle
Other
- www: add the Bluetooth screen to the preview page
Fixed
- display: bound every wait on the shared LCD/touch SPI bus
Added
- sd: add colour overrides for the SD progress bar
- www: keep the source switch reachable in fullscreen
Changed
- www: drop the explanatory section from the preview page
Fixed
- www: hide the stereo VU bar colour when colour zones are on
Added
- www: show live SD playback progress in the preview
- ws: publish SD playback position and duration
- www: rework the screen preview into a multi-source page
- www: add playlist screen, fullscreen and volume to radio preview
- www: add a live radio-screen preview with working touch hotspots
- www: add a faithful radio-screen preview page
- ui: make the wallpaper-fetch backdrop opaque
- ui: dim the whole screen behind the wallpaper-fetch pill
- wallpaper: add a Clear slot button that drops the URL and the fetched image
- fonts: replace the _pl fonts with pan-European Latin _eu fonts
- events: place the notification text per event and back it on a card
- events: show a per-event graphic on the notification screen
- sd: show the album art embedded in an MP3 tag
- sd: build the album cover from a folder's cover.jpg
- sd: show a per-folder album cover on the SD player
- themes: apply installed themes from SD without the network
- assets: save knob artwork to SD as RGB565A8 with transparency
- assets: keep PNG transparency in SD .bin artwork
- weather: add Celsius/Fahrenheit unit selection
- trace: add runtime diagnostic-log flags
Changed
- www: show the event graphic by name, not its net<N> spelling
- libjpeg: share one JPEG-to-RGB565 decoder
- www: move diagnostics into its own settings tab
Fixed
- www: make the preview fit narrow screens and survive fullscreen exit
- ui: scroll overlong SD, BT and browser labels instead of wrapping
- touch: use word-aligned 4-byte SPI buffers for XPT2046 conversions
- display: bound the async flush waits and move flush_ready into IRAM
- www: size the per-screen wallpaper slot picker at page load
- sd: convert folder artwork at playback start, retry when a JPEG appears
- ui: keep the update and OTA prompts on a plain background
Added
- www: show elapsed time and motion while the SD card formats
- sdcard: format the SD card from the web file manager
- www: install full themes from the online gallery
- assets: fetch knob artwork from the internet into PSRAM asset slots
- web: warn about manual-only auto refresh where internet slots are assigned
- ui: follow the playing source to its player screen
- espnow: report pilot link activity and make the link opt-out
- web: copy files in sd-editor and deep-link to it from sd-player
- web: copy files in sd-editor and deep-link to it from sd-player
- espnow: serve the pilot's settings and diagnostics over the link
- web: show MQTT broker connection state in the diagnostics panel
- diag: report chip temperature on the diagnostics panel and in /api/diag
- wallpaper: fetch the boot batch before the radio autostart instead of after
- www: assign a gallery wallpaper straight into an internet slot without SD
- wallpaper: hold up to ten internet wallpapers in PSRAM slots, one per screen
- wallpaper: hold up to six internet wallpapers in PSRAM slots, one per screen
Added
- www: add a Diagnostics panel with copyable report to the System tab
- diag: add Diagnostics screen and /api/diag with PSRAM and firmware info
- espnow: browse and play the SD card by index from the pilot
- wifi: show RSSI in scan results and add a network picker to the settings page
- www: confirm before a Radio Browser icon replaces an existing one
- www: name station-icon files after the station, not just its key
- www: assign station icons from .bin files already on the SD card
- network: retry the saved WiFi in the background instead of parking in AP
- ui: recognise the exit swipe by drag distance on lists and the equalizer
- ui: give the playlist and SD browser lists their own row colours
- ui: format the MDY date as MM-DD-YYYY instead of MM/DD/YYYY
- wallpapers: file list-screen wallpapers under a playlist-sd-browser category
- ui: give both list screens their own wallpaper and a virtualised list
- playlist: add per-screen wallpaper and a resizable, virtualised list
- vu: add per-screen colour overrides for all three VU meters
- vu: give the needle meters their own vu_needle_bg plate colour
- vu: replace the needle meter frame with a vu_bg plate
Changed
- layout: pair each screen tab with the list screen it opens
- layout: drop the Move button from the wallpaper picker's SD browser
- theme: drop the VU palette fields in favour of per-screen overrides
Fixed
- http: reclaim HTTP sockets via LRU purge and TCP keep-alive
- ui: keep a sideways swipe across the volume slider from moving it
- diag: spell out the memory figures on the Diagnostics screen
- main: include ui_profile.h for DISPLAY_WIDTH/HEIGHT in network_services
- ui-list: detect the exit swipe on list rows instead of relying on LVGL gestures
- ui-list: treat a sideways drag on a list row as a swipe, not a tap
- layout: actually hide switched-off form groups and nest header sub-settings
- web: drop the wallpaper cache when a wallpaper .bin is overwritten
- layout: mirror layout presets onto the wallpaper's own folder
Fixed
- ui: define the test-tone action outside the touch guard so no-touch variants build
Added
- espnow: add the ESP-NOW pilot link with a web-triggered pairing window
- display: add a red/blue channel-order toggle and fix the ST7789V baseline to RGB
- wallpapers: install online gallery wallpapers into per-screen category folders
- wallpapers: file uploads and saved internet wallpapers per panel resolution
- audio: add mono downmix mode with web and on-device toggle
- touch: runtime touch orientation independent of display flip
- layout: add online asset gallery with source-size install defaults
- layout: add online gallery to Assets tab
- www,ui: font colour overrides for home date/netinfo/strip labels
- www,ui: font colour overrides for radio/sd/bt info + bt track labels
- www,ui: per-wallpaper font colour overrides for radio/sd/bt labels (0=inherit theme)
- www,ui: per-wallpaper clock time colour override (0=inherit theme)
- www: add preview button to SD .bin picker modal (EQ + screen knob images)
- www: add mkdir + move file actions to shared SD browser, enable in Assets tab
- www: add mkdir + move file actions to shared SD browser, enable in Assets tab
- layout: add folder navigation (parent + subdirs) to Assets tab file browser
- wallpapers: add Equalizer category to online gallery + website catalog
- layout: General-tab wallpaper upload scaled to panel res without assigning
- eq: movable+resizable sliders group box, toggle freq labels & legend, positionable legend
- eq: make response-curve box movable + resizable (eq_curve_x/y/w/h) in layout editor
- eq: make active-value label movable (eq_info_x/y) with configurable font in layout editor
- eq: drop title, move value to top-left, add live response curve (spline) top-right
- eq: user-defined knob width (eq_knob_w) and knob-only mode for band sliders
- eq: Open-EQ hotspot action with return-to-caller
- eq: Equalizer layout tab (shared knob image + per-screen wallpaper), open-EQ hotspot action, touch hotspots 6→8
- audio: configurable channel-test tone (pink/white/sine, duration) with web UI Play button
- audio: built-in stereo channel-test tone (pink noise) in Settings→Audio for SD-less HW check
- ui: per-slider volume max — remap slider travel to 0..max % for fine control on room-loud panels
- ui: scale the volume-slider knob image to the slider size (bilinear lv_bin_image_load_scaled)
- ui: knob image for the volume slider — SD .bin via Assets tab + per-field SD picker
- ui: knob-only mode for the volume slider (wallpaper draws the track)
- ui: explicit horizontal/vertical orientation for the volume slider
- ui: draggable on-screen volume slider on radio/SD/BT screens with layout editor support
Changed
- eq: spread bands across an editable group span for pixel-exact edges
- eq: derive sliders-group size from slider width, height and band gap
- wallpapers: name the device-saved wallpaper folder "internet"
- web: unify settings backup format between settings and setup pages
- layout: unify asset size selection for uploads and gallery installs
- www: extract shared SD folder browser (sdbrowse.js) used by wallpaper/knob/logo/assets pickers
Fixed
- espnow: fill the first line from the folder when SD is the source
- layout: place label boxes from real LVGL font metrics instead of nominal size
- layout: restore live resize preview broken by a stale wVal reference
- radio: set station name on URL playback so podcasts don't keep the previous station
- www: show .bin preview above SD picker modal + add preview to wallpaper browser
- layout: start all settings menu groups collapsed instead of auto-opening the first
- eq: band sliders ignore gesture bubble so drag updates value (taps worked, drag froze)
- web: group layout-editor form into categories — collapsible VU-meters group + section headers so widgets are easier to find
- ui: square volume-slider corners to stop large sliders hanging the LVGL renderer
- web: tidy the Assets uploader — styled file picker and standalone Upload button
- web: style the Assets tab inputs and the knob-image path field in the layout editor
- ui: stop volume-slider drags from bubbling up as screen swipe gestures
- ui: hide the themed knob under the volume-slider knob image (knob_only artwork)
- ui: label plate padding no longer triggers scroll on fitting text
Added
- web: net wallpaper preview in layout editor; move brightness slider to General tab
- web: preview fetched internet wallpaper in layout editor and Internet tab
- ui: reverse rotation option for animated wheels on radio and SD screens
- ui: colour zones (green/orange/red) in stereo bar VU with per-profile toggle
- radio: support MP3 audio in HLS TS segments via PMT codec probe
- ui: swap Internet/General tab
- layout: link General tab to gradient/solid colours in Theme
- layout: move background + internet wallpaper config into layout editor tab
- layout: stereo bar VU widget
- layout: independent metadata elements (station/title, samplerate/channels/bitrate/volume) with free X/Y on radio, SD and BT screens
- layout: per-resolution preset path + preset housekeeping + online wallpaper gallery
- ui: store wallpaper layout presets per display resolution
- web: add Wallpapers subtab to display settings
- web-ui: add online wallpaper gallery with upload renaming
- web: wallpaper upload in layout.html per-screen picker (shared LvBin.uploadImage)
- web: wallpaper upload in layout.html per-screen picker (shared LvBin.uploadImage)
- ui: VU meters rest when another source owns the audio path (owner-gated bars + needles)
- ui: BT screen touch hotspots + ctrl overlay toggle (firmware + web layout editor)
- ui: touch hotspots on BT screen (bt_touch_hotspots + web layout editor)
- ui: per-label width + free X/Y for home strip station/title (replaces shared clock_strip_label_w)
- ui: free X/Y drag for home strip station/title labels (new clock_strip_*_x profile fields)
- www: orphaned layout-preset checker with delete in Theme settings
- ws: broadcast resolved media source in state JSON
- media: add source switch (radio/SD/BT) via WS source= cmd and MQTT cmd/source
- ui: add playlist and SD browser hotspot actions
- ui: move label background opacity to per-screen profiles
- ui: per-screen wallpaper override in ui_profile + section-scoped layout presets
- web: auto-apply wallpaper layout preset checkbox in layout editor
- web: move files/folders between SD directories in sd-editor and manager
- ui: PLAY_PAUSE hotspot action — in-place pause on SD, play/stop on radio/BT
- ui: PLAY_PAUSE hotspot action — in-place pause on SD, play/stop on radio
- ui: needle VU follows volume knob (sqrt scale) + gamma swing tuning
- ui: SD player layout rework — movable title box, independent time row and progress bar
- ui: center-anchored X position for SD player track title (sd_title_x)
- ui: SD player progress bar as independent element (sd_bar_x/y) + works without time row
- ui: independent Y position for SD player time row (sd_time_y) + web editor group
- ui: needle VU dynamics tuning + docs (README, website)
- ui: analog needle VU meter — two independent L/R meters over wallpaper
Changed
- www: move orphaned layout-preset checker from Theme settings to Layout editor Presets tab
- ui: drop dead clock_panel_* fields (leftover of removed standalone clock screen)
Fixed
- layout: close online wallpaper gallery on screen tab switch
- layout: internet wallpaper outranks all SD/gradient backgrounds
- ui: stop encoder_task stack overflow from logging on full event queue
- ui: reparent home station/title labels to screen so they aren't clipped to strip bounds
- ui: don't clip station/title labels to home strip bounds
- media: route plain next/prev/play/stop to the active source via shared media_control dispatcher
- www: release input focus when selecting layout placeholders
- ui: grow wallpaper path buffers to 128 chars (long filenames were silently truncated)
- sd: strip file extension from fallback track title on SD player screen
Added
- www: per-wallpaper layout presets saved to SD (/wallpapers/layouts)
- ui: per-screen option to disable tap controls overlay (radio/SD)
- ui: optional transparent VU background (vu_transparent profile flag)
- events: group playback start and stop as linked schedules
- web: add daily timetable view for playback schedules
- web: add location search to weather settings
- ui: toggle radio layout elements on device
- ui: add on-device radio layout editor
- ui: allow positioning radio station icon and constrain long metadata
- ui: add layout-configurable touch hotspots
Changed
- ui: native-size hub overlay glyphs instead of transform_scale
- audio: low-bandwidth HLS variant, cheaper 48k resample, per-task CPU dump
- events: patch-style playback PUT and lean enable toggle
- web: organize touch hotspots into nested groups
Fixed
- www: show voice files check only on Events tab, not Playback
- ci: freeze clean-tree version before variant switch so releases aren't stamped -dirty
- ui: long press to exit wifi screen
Added
- ui: allow hiding radio track title
- ui: allow individual animated wheels to be hidden
- web: add wallpaper picker to layout editor
- web: add keyboard nudging to layout editor
- web: show active wallpaper in layout preview
- web: add browser wallpaper conversion and SD upload
- ui: add radio station icon visibility toggle
- ui: add configurable radio playback status visibility
- ui: add configurable animated wheels widget
- web: add station icon audit and cleanup
- display: add ST7789V 320x240 driver
- ui: add wallpaper fetch and SD save actions to hub overlay
- ui: add wallpaper fetch button to hub overlay
- ui: add configurable radio station icon size
- radio: add SD-backed station icons with playlist web management
- ui: add configurable station strip background opacity
- web: improve layout editor with grouped settings and semantic placeholder colors
- web: compact layout editor settings into collapsible groups
- ui: global label-background plate for readability over wallpaper (all screens)
- ui: global label-background plate for readability over wallpaper (all screens)
- ui: optional background plate behind home weather widget
- ui: adjustable opacity for home clock-label background plate
- www: layout editor warning to Reset after firmware layout changes
- weather: condition icons via Weather Icons font (day/night variants)
- ui: AM/PM time format on radio/SD/BT clock widget
- weather: OpenWeatherMap as alternative provider
- weather: on-screen weather widget (Open-Meteo) + /api/weather + settings tab
- web: redesign station discovery calls to action
- www: surface station search — top of playlist editor + link on index
- www: radio-browser.info station search in playlist editor
- www: atlascube.net link under the logo on all web UI pages
- setup: one-file settings.json + pin map export/import, unified /setup buttons
- scrsaver: option to block screensaver while radio/SD/BT is playing
Changed
- ui: move wallpaper actions to third hub overlay row
Fixed
- ui: rebuild animated wheels library against LVGL 9.2.2
- web: remove white padding from station icons
- ui: tighten weather and clock label backgrounds
- ui: use pill background for weather widget
- www: clip placeholder sample text to its box in layout editor
- www: layout editor screen tabs order — home, sd, radio, bt
- scrsaver: normalize photo dir path (case/slash) + path example in web hint
Added
- display: add ST7789V 320x240 SPI driver and touch-less firmware variant
- events: stop-playback option for playback schedules (station -1 sentinel)
- setup: hide/dim pin sections not matching compiled drivers + show-all toggle
- setup: hide pin sections not matching compiled drivers + show-all toggle
- setup: hide touch/LCD pin sections not matching compiled drivers
- web: hint + link to MQTT tab when MQTT screensaver style selected
- ui: wallpaper dim 0-80% baked at load (SD + internet, pristine sources) + web slider
- web: move Screen layout editor panel to top of Display/Panel + add hint
- ui: theme-aware bg plates under home clock labels + clock_label_bg profile toggle
- web: live resolved-URL preview for internet wallpaper + readable field hints
- ui: save fetched internet wallpaper to SD
- ui: on-screen status pill during internet-wallpaper fetch
- ui: scheduled internet-wallpaper refresh (on-boot/daily) + persisted source URL
- web: internet wallpaper source presets (APOD/picsum/LoremFlickr/Cataas/PlaceDog)
- ui: internet wallpaper — on-device fetch + vendored libjpeg decode (progressive JPEG OK)
- ui: MM/DD/YYYY date format option + NTP tab reworked into Date & Time
- ui: optional MM/DD/YYYY date format on home screen + web toggle
- ui: optional 12-hour AM/PM clock format on home screen + web toggle
- ui: warn self-built (-dirty) firmware on update prompt that changes will be replaced
- ui: VU meter AGC — bars track programme level instead of fixed dB window
Changed
- web: merge Theme tab into Display as Panel/Theme sub-tabs
Fixed
- ui: radio VU at bottom edge, state line above (all VU profiles)
- web: events list sorted by next occurrence instead of random id
- ui: SD VU at bottom edge, folder above (all VU profiles)
- web: settings export/import bundles only .json config files
- web: sort directories first in wallpaper/logo SD file picker
- ui: explicit background choice evicts the fetched internet wallpaper
- web: wallpaper preset select mirrors the URL field (match Android behaviour)
- ui: readable error for progressive JPEGs exceeding PSRAM (coef-size pre-check)
Added
- wifi: WiFi setup reachable at runtime via Settings → System → WiFi (touch builds); STA scans without disconnecting, screen shows live SSID/IP, swipe backs out
Fixed
- ws: malformed
set_eq_10 bands array crashed the device (NULL deref)
- ws: cap incoming frame size at 4 KB (client-supplied length went straight to malloc)
- state: long station/podcast URL could overflow the app_state log buffer (stack corruption)
- web: JSON replies crash-proofed against cJSON heap exhaustion (send_json_or_500, guarded WS broadcasts)
- settings: volume/brightness clamped in setters (unvalidated WS/HTTP values reached the audio engine)
- settings: concurrent saves from different tasks could corrupt settings.json (now serialized)
- events: a voice notification interrupting another no longer loses the source to restore
Changed
- www: split System tab out of Tools, group Display panels in settings
Added
- updater: show remote www pull progress on SCREEN_UPDATE
- updater: remote-triggered update via POST /api/update for Android app
- updater: log fw/www update outcomes to /config/update.log
Fixed
- fonts: add SD card glyph to montserrat_14_pl for mode indicator
- updater: update.log www line logs hash + matched fw, not stamp metadata
Added
- updater: on-device web UI pull from SCREEN_UPDATE (no reboot)
- updater: flag stale web UI on SCREEN_UPDATE after boot version check
- updater: on-device auto-update — boot check, SCREEN_UPDATE, pull-OTA
Fixed
- web: skip HTML recompress + version stamp rewrite when UI hash unchanged
- ui: update/OTA screens leaked flex layout onto shared screen object
Added
- podcast: finite-stream playback, episode title + mid-file resume
- sd: add playback progress bar + folder/info show toggles on SD player screen
- sd: show elapsed/total time on SD player screen (MP3/WAV duration + wall-clock position)
Changed
- pins: changed default pins for XPT2046
Fixed
- uv: narrow band to 150Hz–13kHz so top bar is audible + low bars gang less
- audio: run file-end restore on internal-stack task to avoid flash-cache panic on audio_play's PSRAM stack
Other
- vu: raise meter low edge 60→120Hz so bass bars stop ganging together
Added
- web: add config settings export/import (JSON backup) to Tools
- events: raise EVENTS_MAX 100→200 (buffers already in PSRAM)
Fixed
- web: cache-bust JS/CSS with ?v=<www-version> so UI updates aren't masked by stale browser cache
- web: retry per-file www uploads to survive transient connection resets
- web: style Export/Import settings buttons like the other tool buttons
- web: stream file uploads through gzip so large UI files (settings.js) aren't capped at 64 KB
Added
- events: EV_CALENDAR mirror type + bulk PUT /api/events/calendar
- layout: calendar widget fields on Home tab (renamed from Clock)
Fixed
- playlist: move station list to /config so a www update can't clobber it
Added
- events: add voice-file audit on events.html cross-checking events ↔ /voice
- display: add SD player quick-switch button on settings display tab
- wifi: encoder navigation on the on-screen WiFi setup
Changed
- hls: rebuild icy_stream lib with TLS keep-alive segment reuse
- tls: re-enable hardware AES/SHA/MPI to fix HLS stutter + IDLE0 watchdog
Fixed
- fps: toggle HIDDEN flag on the auto-created perf monitor to kill ghost overlay
- touch: guard XPT2046 dead-MISO ghost-press + seed 320x240 calibration
- wifi: show AP password on touch WiFi setup screen
Fixed
- touch: make XPT2046 variant build under -Werror
Fixed
- ci: drop inline comment on TOUCH_XPT2046 define so variant selection works
Added
- ui: runtime FPS-overlay toggle via web UI
- vu: snappier decay + less gamma compression for more musical VU
- wifi: on-screen WiFi provisioning on the AP setup screen
- security: store WiFi/MQTT passwords in NVS, not config JSON
- touch: add XPT2046 resistive (SPI) touch driver
- display: live colour-invert toggle + make 180° flip live
Changed
- ci: touch-controller suffix in all firmware variant names
- ui: solid overlay bg — fix sluggish touch over live VU
- ui: VU meter delta rendering — redraw only the moving bar tips
- ui: non-blocking VU meter — custom-draw + async DMA flush
Fixed
- web: make www version hash line-ending independent
Changed
- restructure stream component internals
- reorganize audio and stream internals
Added
- web: surface web-UI build stamp + expected hash in settings/setup
- web: show web-UI version in settings + reorder setup OTA/web-UI
- web: label the www stamp time as UTC
Added
- web: include time in the www stamp
- web: add fw-version + date to the www stamp
Fixed
- flash: erase otadata after USB app-flash
- flash: erase otadata after USB app-flash
- web: web UI upload uses PUT, guard against .bin, style www button
Added
- web: add OTA upload to setup page, web UI upload to tools tab
- web: show www_expected hash in /api/state + setup.html warning
Fixed
- web: track www_version.txt so it ships in release zip
- ui: lighten hub overlay button fill so circles stand out from dim layer
- web: add "Back to AtlasCube" link to setup.html (top + bottom)
- web: make GitHub link readable in setup.html + point straight to www.zip
Added
- web: publish www.zip in release + link from stale-UI warning
- web: detect stale web UI after app-only OTA
- web: add first-run welcome modal + help page
- setup: collapse Wi-Fi form when already connected (STA)
- ui: encoder-driven hub overlay on Home
- ui: hub overlay widget buttons adjusted
Changed
- settings: data-driven sections for on-device settings screen
- setup: serve unified setup.html in AP mode, drop wifi_setup.html
Added
- display: add 180° screen flip option
- ui: wire BT transport in controls overlay + faithful play state
- ui: add Clock/Radio nav-ring show/hide toggles
- ui: add unified Home hub screen with source-aware overlay
- settings: group colour palette into labelled sections
- theme: per-theme VU meter colours (vu_bg/vu_bar)
Changed
- ui: tighten settings row height across graphical profiles
- ui: remove standalone clock screen, superseded by Home hub
Fixed
- ui: show BT artist/title in Home strip instead of radio station
Added
- setup: export/import pin map to/from JSON file
Added
- setup: group GPIO pins into labelled sections with descriptions
Added
- pins: make I2S pins runtime-configurable too
Fixed
- pins: handle -1 (absent peripheral) without crashing
Added
- pins: runtime GPIO pin map configurable via /setup
- ui: adjust vu meter
- eq: touch support for equalizer
- eq: touch support for equalizer band sliders
Changed
- ui: drop unused physical-button inputs
Fixed
- ui: sync controls overlay play/stop with external state changes
- eq: don't clip round slider knobs at min/max
- touch: keep polling while finger held so swipes aren't fragmented
Added
- ui: VU meter on SD player screen + per-screen toggle
- ui: real-audio FFT spectrum VU meter on the radio screen
- audio: play segmented HLS (.m3u8) radio streams
- scripts: add "Update from git" menu option to build-flash.py
- ui: toggle to show/hide SD player screen in nav ring
- ui: decorative "Fake VU" animated background
Changed
- ui: remove animated "Fake VU" background
Fixed
- eq: narrow EQ slider range to -13..+6 dB
- mem: reclaim ~84 KB internal DRAM to stabilize HTTPS radio
- ui: VU background follows theme and costs less on CPU1
- web: switch to wallpaper clears VU sentinel path
- audio: stop socket exhaustion on live HLS streams
- web: keep UI loadable while radio HTTPS stream runs
- web: drag playlist rows only from the grip handle
- ntp: apply saved timezone and servers on boot
Added
- ui: controls widget on screen clock
- ui: center-anchor clock_widget and BT/radio screen labels
- ui: anchored auto-width labels that don't wander on text change
- ui: add idle auto-dim screensaver
Fixed
- ui: clock controls resume SD instead of starting radio
Added
- ui: custom splash logo from SD
- web: preview LVGL .bin images in browser
- ui: add SD wallpaper background option
- web: add config partition to the file editor
- web: replace "back to radio" with bottom toolbar nav on events/settings
- sd-player: on-screen control changes pause to stop/play toggle
Added
- web: add cross-page toolbar nav to bt.html and sd-player.html
- events: timed playback schedules (radio or SD file/folder)
- audio: auto-detect stream codec from Content-Type, relink on mismatch
Changed
- events: replace alarm type with playback schedules
Fixed
- web: style "Use this folder" button as primary in events.html
Fixed
- build: default to esp32s3 target on a fresh checkout
- compress-web: use ASCII arrow so logging doesn't crash on cp1250
Changed
- move playlist.csv from config to www partition
Added
- build-flash: add "first flash" option for blank chips
- build-flash: group the menu
- build-flash: add full chip erase menu option
- build-flash: prompt for the serial port when -p is omitted
- scripts: build-flash.py self-sets-up ESP-ADF on first run (single user entry) + scripts/README
- fs: isolate settings on a config partition (www/config split) + built-in setup page
- ui: ui profile for sd player screen
- ui: on-device SD music player + file browser (LVGL)
- audio: ID3 track titles + resume SD music after voice notification
Changed
- scripts: split toolchain setup into env_setup.py, move build.py → ci/build.py; build-flash.py is the sole user script
- ram: recover internal RAM + drop deferred settings write
Fixed
- ui: show now-playing only for the active source
Added
- web: English SD player UI + embedded EQ modal
- sd: pause/resume + shuffle/repeat
- sd: folder browsing + EQ link on the SD player
- web: SD Player link on home + volume on the SD page
- sd: folder-queue music player with web UI
- audio: WS play_file test hook for SD music playback
- ws: accept BT transport commands over plain-text WS
Changed
- audio: split audio_player into engine + net/file source layers
- web: rename file tools for clarity, file manager first
- web: rename file tools for clarity — spiffs-editor / sd-editor / manager
Fixed
- audio: BT↔SD source exclusivity + httpd stack overflow
Other
- ws: drop plain-text BT transport handlers
Added
- web: browsable folder tree in the SPIFFS pane + SD play legend
- web: browsable folder tree in the SPIFFS panel
- web: show SPIFFS and SD usage in the file manager
- events: flat voice clip files, drop the per-clip folder
- web: play voice clips from the events list rows
- web: inline WAV/MP3 playback in the SD file manager
- voice: readable slug folder names, drop text sidecar
Fixed
- events: widen sound path buffer for readable clip folder names
- web: label SD card consistently in file manager
Added
- ui: boot splash overlay with firmware version + STA IP
- bt: per-module AT command descriptor, web sync/transport controls, codec & sample-rate info
- web: move layout editor link from Tools to Display tab
- web: add icon legend for each file-manager panel
- web: add "backup all SPIFFS files" to file manager
- web: per-file copy buttons in file manager
- web: add dual-pane SPIFFS↔SD file manager with inline editor
- screensaver: overlay clock on photo frame
Fixed
- web: stop file-manager editor modal colliding with shared .modal
Added
- display: add ILI9488 480x320 driver variant
- buzzer: allow disabling buzzer with BUZZER_PIN -1
- events: self-describing voice clips — sidecar text + WWW preview
Added
- events: voice notifications - playing WAV from SD at a given time
- screensaver: apply photo-frame config live
- web: add mkdir + rename to SD file manager
- web: add New folder (mkdir) to SD file manager
- sd: enable LVGL POSIX fs (S:→/sdcard); finalize SD/display pins
- web: SD card file manager
- sd: add SDMMC 1-bit SD card mount
Changed
- screensaver: partial invalidation + lower LVGL priority
Fixed
- mem: persist WiFi RAM tuning in defaults; revert LVGL to prio 5
- sd: move SD to GPIO 12/13/11, display to 39/40
- web: correct SD file manager build errors
Added
- audio: exclusive audio source auto-switch (Radio ⇄ Bluetooth)
- clock: optional IP + <hostname>.local on the clock screen
- ws: expose WiFi RSSI in state broadcast
- settings: rename WiFi tab to Network
- mdns: advertise device as <hostname>.local
Fixed
- playlist: change max entry to 512 on the web
- bt: make exclusive auto-switch reliable
Added
- bluetooth: exclusive audio source — starting BT play stops the radio and starting the radio pauses the phone, with automatic source switching (toggleable, default on; in web BT panel and on-device Settings)
Added
- playlist: increase max entries
- radio: resume playback on boot if it was playing
- screensaver: add digital clock screensaver
- build: prompt whether to bundle the web UI into storage
Changed
- audio_board: centralize I2S pins in defines.h
Fixed
- radio: play http SHOUTcast streams via raw socket
- build: don't clobber a symlinked/junctioned board in ESP-ADF
Added
- ota: auto-rollback on a failed update
- ota: web-push firmware update with on-device progress
- web: audio source switch, move device screen to settings
- ui: move theme & background toggles to Colors tab, rename it to Theme
- ui: configurable clock & now-playing fonts in layout editor
Fixed
- ota: render progress screen before the flash erase storm
Added
- ui: dithered gradient screen background
Fixed
- radio: re-anchor curr_index after playlist edit
- scripts: guard flash-web.py against stale sdkconfig on variant switch
Added
- night: wake/sleep radio actions on the dimming schedule
Changed
- ui: move night mode into its own Sleep & Wake tab
Added
- ui: centralize screen navigation into an editable ring table
Changed
- scripts: unify build tooling as Python under scripts/
Fixed
- web: no-cache for mutable data files (playlist/configs)
Fixed
- build: set esp32s3 target in build.py; add Windows build guide
Fixed
- ui: ignore layout JSON saved for a different LCD size
Added
- ui: fonts added
- ui: auto-fit splash logo to the panel
- display: add SSD1322 256x64 mono variant
- web: show firmware version in UI and wifi setup
Changed
- screensaver: changed default
Fixed
- scripts: default flash-web.ps1 to flash when no args
Fixed
- build: ship SPIFFS web assets in CI/release binaries
Added
- build: select flash size per variant via defines.h
- ui: event indicator on radio screen + live refresh on add/edit/delete
- events: per-alarm volume override
Fixed
- wifi: improve AP compatibility with modern phones
- ui: adjust screen radio
- ui: controls overlay reads mode from owner, not app_state
Added
- web: group editors in Tools tab, rename EQ button to Radio EQ
- display: add ST7796U 480x320 driver and UI profile
- web: move Web files editor to a new Tools settings tab
- web: add Clear button and follow/pause auto-scroll to BT console
- web: move Bluetooth panel to dedicated bt.html page
- ui: dark/light theme for clockhands and dashboard screensavers
- ui: touch support in settings + global idle-timer hook
- ui: modified ui profile for ILI9341
- touch: FT6336U driver, rebuild touch orientation
- events: alarm type with radio stream wake-up
- display: night dimming schedule
Changed
- config: pick HW variant only in defines.h
Fixed
- display: shrink ST7796 LVGL buffer to fit internal DRAM budget
- web: show Dashboard widget settings only when Dashboard style selected
Added
- ui: mqtt screensaver
- www: pretty-print and validate JSON in file editor
- web: rebuild active screen after MQTT config save
- mqtt: mqtt widgets
- mqtt: mqtt client
- ui: controls widget resets screensaver idle timer
Changed
- widget: changed control widget auto hide time
- mqtt: remove client id from base topic
Fixed
- mqtt: wrap widget command payload in JSON when json_path is set
- ui: clear scrollable flag for main screens
- screensaver: disable screensaver in wifi ap mode
Added
- ui: Touch closes the event notification screen
- ui: Touch closes the screensaver
- playlist: play station on row tap
- ui: volume widget and gestures
- ui: controls overlay widget
- touch: CST816D capacitive driver
- bluetooth: audio metadata
- screensaver: alarms for dashboard
- screensaver: dashboard and blank
- ui: add screensaver entry to settings menu
Changed
- screensaver: live update setting for dashboard screensaver
- screensaver: remove enable status (0s - OFF)
Fixed
- bluetooth: fixed refresh title
Added
Added
- www: On-device web file editor
Changed
- ui: single source of truth for display dimensions
- layout: Clock, mode, events widgets change to absolute pos
- www: Added radio layout to editor
- display: Modiefied CO5300 layout
Added
- display: Added CO5300 display driver
- playlist: Added fav stations and import/export
Other
- Add diagram image to README table
Initial public snapshot pushed to GitHub.
Added
- Audio pipeline (player, playlist, internet radio service).
- Wi-Fi manager with STA + AP fallback.
- HTTP and WebSocket servers.
- Display + UI manager with profile loading from filesystem.
- Bluetooth, NTP, encoder, buzzer, events service.
- SPIFFS-based settings and assets.
- Firmware version derived from
git describe and logged at boot.
← Back to atlascube.net