EspControl v2.8.0
Changes since v2.7.1.
What changed?
- User-facing features: 361 changes. Notable: Refresh subpages after layout changes; Refresh subpages after configuration changes.
- User-facing bug fixes: 43 changes. Notable: Preserve secondary data during layout updates; Fix live secondary page layout refresh.
Update guidance
- Recommended for users who want the latest firmware, setup page, device fixes, or documented behavior.
- Affected devices: All supported displays may be affected because shared firmware, setup, or build files changed.
Known issues
- No release-specific known issues are listed automatically for this release.
- Check open GitHub issues before updating devices you rely on every day.
Summary
- 404 user-facing changes are included in this release.
- Release range:
v2.7.1tov2.8.0.
User-facing changes
User-facing features
- Refresh subpages after layout changes
- Refresh subpages after configuration changes
- Refresh secondary pages in place
- Load secondary page states after refresh
- Move secondary cards without rebuilding data
- Allow secondary card layout updates
- Refresh secondary sensor font sizes
- Guard structural secondary page updates
- Rebuild secondary pages safely
- Revert "Rebuild secondary pages safely"
- Support custom artwork base URLs
- Address artwork URL review feedback
- Rebuild secondary pages safely
- Restore secondary page after rebuild
- Validate artwork URL ports
- Publish artwork protocol before resolving
- Remove support banner close button
- Release retired secondary page resources
- Clean up retired secondary page references
- Update P4-86 audio stack
- Include product model in firmware matrices
- Add PanelConfig v1 codec foundation
- Harden PanelConfig codec validation
- Validate PanelConfig documents in configuration service
- Guard configuration saves by generation
- Serialize conditional configuration saves
- Advertise native configuration capabilities
- Persist native panel configuration on 7-inch P4
- Allocate panel config buffers in PSRAM
- Add legacy shadow refresh implementation
- Expose native panel configuration reads
- Protect native configuration reads
- Add guarded native configuration saves
- Route native configuration PUT requests
- Track native configuration upload size
- Dispatch native configuration request bodies
- Sort media type options
- Make cover art open media controls
- Bound native configuration request bodies
- Authenticate native configuration uploads early
- Make fan modal toggles tap anywhere
- Share modal binary toggle handling
- Add native configuration backup payloads
- Use native panel config from the web editor
- Mirror active button colour in native config
- Match S3 web preview label size
- Align native backup migration fixture
- Add typed editor bootstrap registry
- Add optional light tab to fan controls
- Protect editor bootstrap phases from duplicates
- Extract editor reconnect controller
- Update product snapshot for fan light option
- Extract backup restore planning controller
- Increase S3 preview label size
- Extract preview placement controller
- Restore S3 preview label size
- Extract card editor draft controller
- Refresh generated web and card references
- Remove web preview label ellipses
- Extract card editor validation controller
- Match S3 media preview title size
- Close empty fan light modal
- Extract card editor save controller
- Guard pending reads against subpage reuse
- Reuse local sensor callbacks during rebuilds
- Declare shared sensor label formatter
- Extract alarm audio settings controller
- Extract screensaver settings controller
- Extract cover art screensaver controller
- Avoid redundant media artwork refreshes
- Extract media playback settings controller
- Extract voice services controller
- Extract clock bar settings controller
- Extract screen schedule controller
- Bundle browser editor assets locally
- Extract browser backup export controller
- Extract browser backup restore controller
- Add display lifecycle service boundary
- Add Home Assistant binding service boundary
- Add card runtime registry service
- Add grid navigation service boundary
- Add control modal state service
- Publish immutable web asset manifest
- Load hosted editor through asset bridge
- Select hosted assets by firmware version
- Publish supported firmware asset versions
- Advertise manifest web asset delivery
- Add web editor remote fallback
- Recover from web editor startup failures
- Reload cleanly after hosted editor failures
- Wait for deferred editor startup
- Harden editor fallback startup
- Prepare web assets before release tags
- Harden release web asset preparation
- Move card registry under app core
- Move configuration service under app core
- Move Home Assistant callback ownership into core
- Move grid navigation into app core
- Move modal state into app core
- Move speaker discovery entity to settings end
- Default new media cards to cover art
- Simplify media type labels
- Clarify media content type
- Bound core UI service memory
- Reorder media content type
- Remove empty weather card settings
- Move Home Assistant binding into app core
- Start app core before boot subscriptions
- Put top-left card settings first
- Add day and night dimmed screen brightness
- Retry config endpoints after web server starts
- Refresh dimmed brightness on mode changes
- Clarify speaker discovery helper setting (#1424)
- Refresh media labels after mode change
- Apply native config to live panel runtime
- Add configuration compatibility lifecycle
- Test configuration release policy
- Speed up cover art dismissal
- Skip pressed repaint before modal open
- Defer native config application until panel startup
- Isolate delayed config application buffer
- Serialize deferred native configuration apply
- Route media artwork callbacks through refresh coordinator
- Defer native configuration initialization
- Retry native config capability discovery
- Regenerate native config web assets
- Retry deferred native configuration saves
- Restore app startup after WiFi
- Defer native configuration until panel ready
- Defer native configuration runtime construction
- Guard climate modal against low LVGL memory
- Defer climate modal actions during startup
- Guard first climate modal request after boot
- Avoid climate modal style allocation abort
- Disable unstable climate modal during P4 recovery
- Allow modal cleanup during firmware startup
- Address P4 configuration review findings
- Restore local web editor fonts and support button
- Avoid redundant panel configuration refreshes
- Prevent 7-inch card-save restart
- Handle delayed artwork refresh responses
- Retry native configuration saves after startup
- Migrate sensor product model pilot
- Bind cover art callbacks to refresh batches
- Extract native configuration editor controller
- Move shared product sources into Product Model
- Use explicit editor startup phases
- Extract typed backup file controller
- Migrate sensor Product Model pilot (#1465)
- Restore web preview fonts
- Restore original support button
- Bundle preview font
- Bundle support button image
- Move card and device sources into Product Model
- Store 10-inch native config in card partition
- Extract sensor card mode controller
- Refresh sensor editor migration fixture
- Import settings feature helpers directly
- Refresh settings migration fixture
- Import backup features directly
- Import preview features directly
- Refresh backup and preview migration fixture
- Import feature controllers directly
- Refresh feature controller migration fixture
- Move media card into Product Model
- Move image card into Product Model
- Move light switch card into Product Model
- Move light brightness card into Product Model
- Move light control card into Product Model
- Move light temperature card into Product Model
- Move fan switch card into Product Model
- Move fan speed card into Product Model
- Move fan control card into Product Model
- Move clock card into Product Model
- Move date time cards into Product Model
- Move weather cards into Product Model
- Move system cards into Product Model
- Move access cards into Product Model
- Move interaction cards into Product Model
- Move climate cards into Product Model
- Move alert cards into Product Model
- Move appliance cards into Product Model
- Move remaining device profiles into Product Model
- Inject native configuration controller directly
- Inject shared card editor controller
- Inject browser device API dependency
- Type browser device API integration
- Inject card editor save controllers
- Inject reconnect lifecycle controller
- Inject preview placement controller
- Inject settings state controllers
- Inject settings page controllers
- Inject backup controllers
- Inject backup feature
- Inject SSE handler factory
- Remove obsolete editor bootstrap
- Register local web routes before startup
- Register configuration handlers before web startup
- Handle native configuration startup requests safely
- Stop rebinding unavailable config endpoints
- Reconcile shared card editor controller
- Reconcile browser device API dependency
- Reconcile card editor save controllers
- Restrict API recovery to Home Assistant
- Align API clients with socket budget
- Centralize Home Assistant reconnect recovery
- Restore Home Assistant API connection capacity
- Increase 10-inch API recovery capacity
- Handle deferred config writes safely
- Wire backup settings through typed actions
- Inject configuration persistence into editor flows
- Center card picker icons
- Regenerate web interface assets
- Tighten media card settings spacing
- Introduce typed browser application context
- Compose browser feature controllers explicitly
- Own browser backup services in application context
- Inject browser preview dependencies explicitly
- Consolidate rebased browser migration bundle
- Refresh web interface bundle
- Rebuild web interface for artwork URL fix
- Remove artwork base URL setting
- Remove artwork base URL override
- Handle interrupted artwork and backup fallback
- Introduce typed browser card registry
- Migrate static cards to typed registry
- Migrate complex cards to typed registry
- Remove card registration compatibility bridge
- Inject card registry into browser consumers
- Own sensor options in application context
- Import shared card option contracts
- Import subpage option behavior
- Own media options in application context
- Own image options in application context
- Import action option contract
- Import cover option contract
- Own modal tabs in application context
- Own access climate and alarm options
- Own confirmation options in application context
- Own configuration codec in application context
- Inject config codec into editor and preview
- Remove configuration codec globals
- Import shared UI primitives directly
- Own UI runtime state in application context
- Inject preview drag runtime state
- Inject configuration migration runtime state
- Remove browser runtime helper globals
- Inject settings DOM references
- Remove ambient DOM registry
- Own page title behavior explicitly
- Import web styles directly
- Import UI colour tokens directly
- Import firmware metadata directly
- Import request and event contracts directly
- Import application state contracts directly
- Import generated card contracts directly
- Import configuration primitives directly
- Import shared model namespace directly
- Import static browser contracts directly
- Remove static Product Model bootstrap
- Increase 7-inch API connection capacity
- Register static card families directly
- Register switch cards directly
- Register image card directly
- Register weather cards directly
- Register webhook card directly
- Register internal relay card directly
- Import entity mode helpers directly
- Register robot cards directly
- Register lock card directly
- Register date and time cards directly
- Register slider cards directly
- Register fan cards directly
- Register alarm cards directly
- Register sensor cards directly
- Register media cards directly
- Register cover cards directly
- Register subpage cards directly
- Register action cards directly
- Register light cards directly
- Remove card registry compatibility path
- Extract typed browser core service
- Import browser core service directly
- Inject media device profile
- Inject browser device configuration
- Inject browser device ID
- Inject browser slot and grid layout
- Import browser state helpers directly
- Compose browser environment state explicitly
- Compose screen schedule state explicitly
- Compose screensaver timeout service
- Compose screen rotation service
- Compose appearance state service
- Compose firmware version service
- Compose firmware update service
- Compose C6 firmware service
- Compose Clock Bar service
- Compose entity state service
- Inject entity service into API modules
- Remove entity compatibility adapter
- Remove empty controls bootstrap
- Compose UI shell service
- Bind browser shell timers safely
- Inject UI shell into API modules
- Inject UI shell into settings editors
- Inject UI shell into preview workflow
- Remove UI shell compatibility globals
- Compose application API service
- Refresh web bundle for application API service
- Inject application API into post services
- Refresh web bundle for request injection
- Inject application API into persistence
- Refresh web bundle for persistence injection
- Inject application API into settings
- Refresh web bundle for settings injection
- Inject application API into loading
- Refresh web bundle for loading injection
- Remove application API compatibility globals
- Refresh web bundle after API cutover
- Compose initial state loader service
- Remove state loader compatibility globals
- Compose grid migration service
- Compose event stream service
- Compose status preview service
- Inject status preview core service
- Inject status preview settings service
- Remove status preview compatibility globals
- Compose grid service
- Inject grid core service
- Inject grid preview service
- Remove grid compatibility globals
- Compose firmware post service
- Compose artwork post service
- Compose screen schedule post service
- Compose Clock Bar post service
- Compose public firmware service
- Remove configuration persistence adapter
- Remove backup contract adapter
- Remove backup UI adapter
- Compose icon picker service
- Compose card editor render queue
- Compose card selection service
- Compose preview render service
- Compose preview placement service
- Compose preview clipboard service
- Compose preview interaction services
- Compose shared field service
- Compose settings services
- Remove browser compatibility bootstrap
- Remove unreleased migration bundles
- Prepare web assets for v2.8.0
- Reserve sockets for 7-inch API clients
- Recover stalled cover art refreshes (#1655)
- Retry timed out cover art reads
- Bound stalled cover art retries
- Settle unavailable artwork after retries
- Supersede stale artwork retries on metadata
- Restore cover art callbacks after card reloads
- Complete browser acceptance across device profiles (#1659)
- Separate native configuration runtime application (#1676)
- Bound Home Assistant artwork reads (#1662)
User-facing bug fixes
- Preserve secondary data during layout updates
- Fix live secondary page layout refresh
- Keep deferred secondary layouts intact
- Fix speaker group layout on compact panels
- Fix speaker groups on subpages
- Stabilize web bundle size checks
- Keep compact configuration shadow synchronized
- Preserve media config compatibility
- Keep native backup exports user initiated
- Preserve native backup compatibility
- Preserve native configuration during editor loading
- Keep a fan tab when clearing light
- Fix fan light editor smoke check
- Fix clock bar editor dismissal
- Stabilize web bundle gzip baseline
- Keep hosted editor in release builds
- Fix app core header visibility
- Fix 10-inch touch release detection
- Fix media artwork refresh feedback
- Fix local web editor icons
- Fix cover art refresh crash loop
- Keep P4 climate modal from crashing startup
- Fix runtime modal service identity across firmware units
- Keep modal service slot stable across ESP-IDF units
- Stabilize UI service slots during firmware startup
- Keep startup helpers from aborting firmware
- Preserve saves during native config startup
- Keep native config startup within rollback window
- Fix native configuration retry fallback
- Keep cover art refreshes subscription driven
- Preserve deployed OTA partition layouts (#1453)
- Fix public ESPHome package web server asset path
- Fix remote package partition configuration
- Keep P4-86 audio paths as substitutions
- Preserve support button label
- Preserve API connections during endpoint setup
- Keep configuration capabilities retryable during startup
- Fix artwork base URL saving
- Fix cover art refresh race
- Keep device configuration module-owned
- Keep card metadata registry-owned
- Keep native config response headers valid
- Keep cover art fallback scheduled