What's New
Welcome to the first beta of WLED 8.0.0! This release marks a major architectural milestone: the Android and iOS apps now live in a unified monorepo powered by a Kotlin Multiplatform (KMP) shared backend—bringing a complete backend migration to the iOS app (shared Room database with automatic Core Data migration, Ktor HTTP & WebSocket connection management, mDNS discovery, DataStore preferences, and OTA firmware updates) alongside full feature parity across both platforms.
Highlights in v8.0.0-beta.1:
- Unified Kotlin Multiplatform Backend: Shared real-time WebSocket management, faster mDNS discovery, a 60-second offline grace period, and shared OTA firmware update engine across Android and iOS.
- iOS Feature Parity & New Capabilities: Home Screen widgets (with Liquid Glass support), Siri & Shortcuts actions, Custom Firmware Updates (QuinLED & MoonModules), Theme Selection, Offline Device Grouping, Automatic Discovery toggle, native unreachable-device view, and German & Simplified Chinese translations.
- Refreshed Home Screen Widgets: Updated Material 3 adaptive widget layout on Android and live Wi-Fi signal strength indicators on both platforms.
- In-App "What's New" Changelog: Automatically view localized release notes after an update or revisit them anytime from Settings.
🚀 New Features
- Show indeterminate loading bar at top of device WebView (#291) @Moustachauve
- Replace iOS HTML error pages with native SwiftUI error view (#290) @Moustachauve
- Add German and Simplified Chinese localizations to iOS (#289) @Moustachauve
- Support localized What's New changelogs and store release notes (#287) @Moustachauve
- Display WiFi signal strength icon in Android and iOS widgets (#283) @Moustachauve
- Polish Android Home Screen widget layout and Material 3 theme (#282) @Moustachauve
- Polish iOS Home Screen widget layout and Liquid Glass support (#281) @Moustachauve
- Add iOS Home Screen WidgetKit extension and live widget state sync (#272) @Moustachauve
- Add iOS App Intents, widget views, and snapshot tests (#271) @Moustachauve
- Bring iOS device list, edit, and OTA update UI to parity with Android (#269) @Moustachauve
- Respect the automatic discovery setting and add it to iOS (#263) @Moustachauve
- Add What's New changelog sheet on iOS and share version filtering logic. (#262) @Moustachauve
- Style changelog sheet with pixel font, version cards, and floating action. (#261) @Moustachauve
- Adopt shared UserPreferencesRepository and @observable view models on iOS (#257) @Moustachauve
- Adopt shared DeviceConnectionManager on Android (#246) @Moustachauve
- Add database persistence and firmware update polling to DeviceConnectionManager (#248) @Moustachauve
- Implement core real-time DeviceConnectionManager in shared module (#247) @Moustachauve
- Adopt shared DeviceConnectionManager in iOS app (#239) @Moustachauve
- Add multiplatform device connection and partitioning foundations (#237) @Moustachauve
- Fetch device info on iOS through the shared DeviceApi (#234) @Moustachauve
- Migrate iOS app persistence from Core Data to shared Room database (#231) @Moustachauve
- Integrate native iOS application into monorepo and link Shared framework (#229) @Moustachauve, @sqrt0b1000, @gemini-code-assist[bot], @google-labs-jules[bot]
- Export Shared KMP module as an XCFramework for iOS consumption (#227) @Moustachauve
- feat(kmp): migrate DeviceDiscovery (mDNS) to shared module for Android and iOS (#224) @Moustachauve
- feat(kmp): implement IosNetworkConnectivityManager and iOS unit tests (Phase 4.3) (#222) @Moustachauve
- feat(kmp): implement AndroidNetworkConnectivityManager and migrate :app (Phase 4.2) (#221) @Moustachauve
- feat(kmp): define shared NetworkConnectivityManager interface and NetworkStatus model (Phase 4.1) (#220) @Moustachauve
- feat(kmp): configure SKIE gradle plugin for swift interop in :shared (#216) @Moustachauve
- feat(kmp): scaffold :shared multiplatform module targeting android and ios (#214) @Moustachauve
- feat(room): switch SQLite driver to BundledSQLiteDriver and update migrations for Room KMP (#206) @Moustachauve
- feat(websocket): migrate to Ktor Client WebSockets and modernize state architecture (#205) @Moustachauve
- feat: migrate navigation from Navigation Compose to Navigation 3 (#192) @Moustachauve
- feat: Whats new view (#155) @Moustachauve
🐛 Bug Fixes
- Seed baseline changelog version when migrating from pre-8.0 installs (#285) @Moustachauve
- Resolve Swift compiler warnings in Xcode across app and test targets (#270) @Moustachauve
- Fix WebView file uploads and retain upload callbacks across configuration changes (#266) @Moustachauve
- Fix iOS build warnings in Xcode (#241) @Moustachauve
- Support unsigned 32-bit values for nightlight remaining time (#235) @Moustachauve
- Merge main into dev (v7.0.1 hotfix sync) (#188) @Moustachauve
- fix(widget): prevent crash when publishing widget previews (#156) @Moustachauve
🧰 Maintenance
- Add /prepare-release skill for beta and production release preparation (#292) @Moustachauve
- Move back changes to dev since we're not quite ready for a release yet. (#288) @Moustachauve
- Automate Android and iOS beta and production releases via GitHub Actions and Fastlane (#286) @Moustachauve
- Prepare unified 8.0.0 release for Android and iOS (#284) @Moustachauve
- Remove unused Gradle dependencies and update Android and iOS packages (#280) @Moustachauve
- Use targeted device updates and markUpdateInstalled on Android (#268) @Moustachauve
- Upload failed screenshot diffs as a dedicated CI artifact (#265) @Moustachauve
- Add SwiftUI snapshot testing for the iOS device list screen (#260) @Moustachauve
- Add Compose Preview screenshot testing for the device list screen (#259) @Moustachauve
- Remove unused Android resources and exclude dev-only files from app binaries (#258) @Moustachauve
- Unify device discovery handling and offline grace-period partitioning (#256) @Moustachauve
- Remove stale firmware update strings from iOS String Catalog (#255) @Moustachauve
- Wire iOS shared dependencies through isolated Koin containers (#254) @Moustachauve
- Unify DeviceFirstContactService and address validation in :shared (#253) @Moustachauve
- Migrate iOS firmware updates and releases to shared KMP module (#252) @Moustachauve
- Update Gradle, Android, and iOS dependencies to latest compatible versions (#251) @Moustachauve
- Update agent instructions, skills, and pre-commit guardrails (#250) @Moustachauve
- Optimize iOS check workflow and resolve test runner flakiness (#249) @Moustachauve
- Tune Gradle JVM options and modernize build performance settings (#240) @Moustachauve
- Bump iOS minimum deployment target to 18.0 (#238) @Moustachauve
- Migrate Android dependency injection from Hilt to Koin (#236) @Moustachauve
- Declare thrown exceptions on DeviceApi for Swift callers (#233) @Moustachauve
- Alphabetize String Catalog entries in Localizable.xcstrings (#232) @Moustachauve
- Rename project and documentation references to WLED-App (#230) @Moustachauve
- Optimize iOS CI workflow execution and cache Kotlin/Native toolchain (#228) @Moustachauve
- Update app dependencies and CI GitHub actions to latest stable versions (#226) @Moustachauve
- ci: test and lint KMP :shared module across Android and iOS (#223) @Moustachauve
- refactor(kmp): migrate DataStore and UserPreferences to :shared (Step 3.6) (#219) @Moustachauve
- refactor(kmp): migrate Ktor API clients, WebSockets, and ReleaseService to :shared (Step 3.5) (#218) @Moustachauve
- refactor(kmp): migrate Room database, entities, and repositories to :shared (Step 3.4) (#217) @Moustachauve
- refactor(kmp): migrate pure network DTOs, models, and utilities to :shared (#215) @Moustachauve
- refactor(kmp): decouple Dagger Hilt from core repository, service, and domain classes (#213) @Moustachauve
- Chore(deps): Update dependencies to latest stable versions (#212) @Moustachauve
- refactor(kmp): decouple android.util.Log and semver4j using Kermit and KMP semver (#207) @Moustachauve
- chore: enable detekt UnusedImports, coroutine, bug, and style rules (#204) @Moustachauve
- refactor(test): modernize test suite to pure JUnit 5 and remove Robolectric (#203) @Moustachauve
- chore: optimize GitHub Actions workflows and remove duplicate PR triggers (#202) @Moustachauve
- Implement Selfie snapshot testing across model, serialization, and migration test suites (#201) @Moustachauve
- refactor: migrate HTTP networking from Retrofit to Ktor Client (#200) @Moustachauve
- chore: remove coderabbit configuration (#199) @Moustachauve
- chore: enable parallel sync for Gradle 9.4+ (#198) @Moustachauve
- refactor: replace DataStore Protobuf with kotlinx.serialization (#196) @Moustachauve
- chore: bump targetSdk to 37 (#195) @Moustachauve
- refactor: replace Moshi with kotlinx.serialization (#194) @Moustachauve
- chore: remove deprecated compose-navigation skill (#193) @Moustachauve
- chore: update and reorganize android agent skills into categories (#191) @Moustachauve
- chore(coderabbit): enable automatic reviews on dev branch (#190) @Moustachauve
- ci: optimize GitHub Actions cache and lint analysis (#189) @Moustachauve
- Chore(deps): Update all dependencies, Kotlin, and Gradle to latest stable versions (#187) @Moustachauve
- Chore(deps): Bump gradle-wrapper from 9.4.1 to 9.5.0 (#166) @dependabot[bot]
- Chore(deps): Bump com.google.devtools.ksp from 2.3.6 to 2.3.7 (#165) @dependabot[bot], @Moustachauve
- Chore(deps): Bump kotlin from 2.3.20 to 2.3.21 (#164) @dependabot[bot], @Moustachauve
- Chore(deps): Bump navigationCompose from 2.9.7 to 2.9.8 (#163) @dependabot[bot], @Moustachauve
- Chore(deps): Bump androidx.compose:compose-bom from 2026.03.01 to 2026.04.01 (#162) @dependabot[bot], @Moustachauve
- Chore(deps): Bump com.google.protobuf from 0.9.6 to 0.10.0 (#160) @dependabot[bot], @Moustachauve
- Chore(deps): Bump org.jetbrains.kotlinx:kotlinx-serialization-json from 1.10.0 to 1.11.0 (#159) @dependabot[bot], @Moustachauve
- Chore(deps): Bump agp from 9.1.0 to 9.1.1 (#158) @dependabot[bot], @Moustachauve
Contributors
@Moustachauve, @dependabot[bot], @sqrt0b1000, @gemini-code-assist[bot] and @google-labs-jules[bot]