WLED Native iOS App

📋 WLED_IOS_ROADMAP_RUN5

Phase 2 FOUNDATION & SETUP

Get familiar with the tools, language and project setup

Milestone Frame the problem & understand user needs (Design Thinking)

BEFORE CODING — frame the problem and understand what the user needs (Design Thinking, condensed reading): Core problem: People with WLED-based LED…

ULO-PROJECT_BASED_LEARNING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Project Based Learning in the context of the project.
CIO-PROJECT_BASED_LEARNING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Project Based Learning at the model level in the project.
SIO-SWIFT-PROJECT_BASED_LEARNING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Project Based Learning using 'Design Thinking' on the app platform.

Milestone Install and verify Xcode and Swift toolchain

Install Xcode from the Mac App Store, open it to install components, and verify the Swift toolchain in Terminal with `swift --version`.

ULO-DEVELOPMENT_TOOLS-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Development Tools in the context of the project.
CIO-DEVELOPMENT_TOOLS-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Development Tools at the model level in the project.
SIO-SWIFT-DEVELOPMENT_TOOLS-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Development Tools using 'SwiftUI' on the app platform.
ULO-PROGRAMMING_LANGUAGE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Programming Language in the context of the project.
CIO-PROGRAMMING_LANGUAGE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Programming Language at the model level in the project.
SIO-SWIFT-PROGRAMMING_LANGUAGE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Programming Language using 'SwiftUI' on the app platform.

Milestone Set up Git and open the base project

Configure git with user.name and user.email, clone or download the provided base-project, and open the Xcode project in the wled folder.

ULO-VERSION_CONTROL-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Version Control in the context of the project.
CIO-VERSION_CONTROL-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Version Control at the model level in the project.
SIO-SWIFT-VERSION_CONTROL-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Version Control using 'createDestinationInstances' on the app platform.
ULO-DEVELOPMENT_TOOLS-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Development Tools in the context of the project.
CIO-DEVELOPMENT_TOOLS-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Development Tools at the model level in the project.
SIO-SWIFT-DEVELOPMENT_TOOLS-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Development Tools using 'SwiftUI' on the app platform.

Milestone Review Swift and SwiftUI essentials

In a throwaway SwiftUI app, practice variables, types, functions, if/for, and building a Text/Button UI with @State, then run it in Simulator.

ULO-PROGRAMMING_LANGUAGE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Programming Language in the context of the project.
CIO-PROGRAMMING_LANGUAGE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Programming Language at the model level in the project.
SIO-SWIFT-PROGRAMMING_LANGUAGE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Programming Language using 'SwiftUI' on the app platform.
ULO-FRONTEND_FRAMEWORKS-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Frontend Frameworks/Libraries: Understand the role of libraries/frameworks such as component-based frontend frameworks, progressive frontend frameworks, and full-featured frontend frameworks in building interactive and structured user interfaces.
CIO-FRONTEND_FRAMEWORKS-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Frontend Frameworks/Libraries: Understand the role of libraries/frameworks such as component-based frontend frameworks, progressive frontend frameworks, and full-featured frontend frameworks in building interactive and structured user interfaces.
SIO-SWIFT-FRONTEND_FRAMEWORKS-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Frontend Frameworks/Libraries: Understand the role of libraries/frameworks such as component-based frontend frameworks, progressive frontend frameworks, and full-featured frontend frameworks in building interactive and structured user interfaces.
ULO-DEVELOPMENT_TOOLS-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Development Tools in the context of the project.
CIO-DEVELOPMENT_TOOLS-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Development Tools at the model level in the project.
SIO-SWIFT-DEVELOPMENT_TOOLS-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Development Tools using 'SwiftUI' on the app platform.
ULO-LOCAL_VIEW_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Local View State: Using @State to manage simple state local to a single view, destroyed when the view disappears.
CIO-LOCAL_VIEW_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng khai báo một biến trạng thái chỉ thuộc về một thành phần giao diện duy nhất và quản lý vòng đời của nó.
CIO-LOCAL_VIEW_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng thay đổi giá trị của một biến trạng thái để kích hoạt việc vẽ lại giao diện một cách tự động.
SIO-SWIFT-LOCAL_VIEW_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Local View State: Using @State to manage simple state local to a single view, destroyed when the view disappears.

Milestone Map the project structure and architecture

Inspect the project groups: Model (CoreData entities), Service (networking/clients), View (SwiftUI screens). Identify @main entry and MVVM pattern.

ULO-ARCHITECTURE_PATTERN-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Architecture Pattern in the context of the project.
CIO-ARCHITECTURE_PATTERN-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Architecture Pattern at the model level in the project.
SIO-SWIFT-ARCHITECTURE_PATTERN-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Architecture Pattern using '@main' on the app platform.
ULO-ENTRY_POINT-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Entry Point in the context of the project.
CIO-ENTRY_POINT-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Entry Point at the model level in the project.
SIO-SWIFT-ENTRY_POINT-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Entry Point using '@main' on the app platform.
ULO-FRONTEND_FRAMEWORKS-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Frontend Frameworks/Libraries: Understand the role of libraries/frameworks such as component-based frontend frameworks, progressive frontend frameworks, and full-featured frontend frameworks in building interactive and structured user interfaces.
CIO-FRONTEND_FRAMEWORKS-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Frontend Frameworks/Libraries: Understand the role of libraries/frameworks such as component-based frontend frameworks, progressive frontend frameworks, and full-featured frontend frameworks in building interactive and structured user interfaces.
SIO-SWIFT-FRONTEND_FRAMEWORKS-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Frontend Frameworks/Libraries: Understand the role of libraries/frameworks such as component-based frontend frameworks, progressive frontend frameworks, and full-featured frontend frameworks in building interactive and structured user interfaces.

Milestone Build and run the app in Simulator

Select the wled scheme, choose an iPhone Simulator, press Cmd+R to build and run. Learn to read and fix basic compile errors in the Issue Navigator.

ULO-DEVELOPMENT_TOOLS-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Development Tools in the context of the project.
CIO-DEVELOPMENT_TOOLS-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Development Tools at the model level in the project.
SIO-SWIFT-DEVELOPMENT_TOOLS-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Development Tools using 'SwiftUI' on the app platform.
ULO-BUILD_PROCESS-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Build Process in the context of the project.
CIO-BUILD_PROCESS-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Build Process at the model level in the project.
SIO-SWIFT-BUILD_PROCESS-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Build Process using 'Xcode' on the app platform.
ULO-DEBUGGING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Debugging in the context of the project.
CIO-DEBUGGING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Debugging at the model level in the project.
SIO-SWIFT-DEBUGGING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Debugging using 'Xcode' on the app platform.

Milestone Practice the development loop and Git workflow

Change a line of code, build and observe, set a breakpoint to debug. Use git checkout -b feature/xxx, commit, and push to the remote.

ULO-VERSION_CONTROL-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Version Control in the context of the project.
CIO-VERSION_CONTROL-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Version Control at the model level in the project.
SIO-SWIFT-VERSION_CONTROL-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Version Control using 'createDestinationInstances' on the app platform.
ULO-DEBUGGING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Debugging in the context of the project.
CIO-DEBUGGING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Debugging at the model level in the project.
SIO-SWIFT-DEBUGGING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Debugging using 'Xcode' on the app platform.

Milestone Implement DiscoveryService with NWBrowser

Create a Network framework browser for _wled._tcp services and expose scan() using @MainActor.

ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.
ULO-CONCURRENCY-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
CIO-CONCURRENCY-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
SIO-SWIFT-CONCURRENCY-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
ULO-REACTIVE_PROGRAMMING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
CIO-REACTIVE_PROGRAMMING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
SIO-SWIFT-REACTIVE_PROGRAMMING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.

Milestone Create DeviceAddView with a sheet containing a navigation form

Add a new SwiftUI view that presents a form for entering an IP address or URL in a modal sheet.

ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-DEPENDENCY_INJECTION-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Dependency Injection in the context of the project.
CIO-DEPENDENCY_INJECTION-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Dependency Injection at the model level in the project.
SIO-SWIFT-DEPENDENCY_INJECTION-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Dependency Injection using 'NavigationView' on the app platform.

Milestone Set up DeviceWebsocketListViewModel skeleton

Create the list view model class with a dictionary of websocket clients and stub power/brightness methods.

ULO-CONCURRENCY-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
CIO-CONCURRENCY-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
SIO-SWIFT-CONCURRENCY-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
ULO-SHARED_OBSERVABLE_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng kết nối một View với một đối tượng trạng thái chung đã tồn tại để nhận các cập nhật.
SIO-SWIFT-SHARED_OBSERVABLE_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.

Milestone Extend Core Data migration for device management attributes

Update StatelessDeviceMigrationPolicy to copy customName, isHidden, lastSeen, and branch when migrating old devices to avoid data loss.

ULO-DATA_PERSISTENCE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
CIO-DATA_PERSISTENCE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
SIO-SWIFT-DATA_PERSISTENCE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
ULO-CORE_UTILITIES-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
CIO-CORE_UTILITIES-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
SIO-SWIFT-CORE_UTILITIES-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-VERSION_CONTROL-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Version Control in the context of the project.
CIO-VERSION_CONTROL-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Version Control at the model level in the project.
SIO-SWIFT-VERSION_CONTROL-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Version Control using 'createDestinationInstances' on the app platform.

Milestone Create GitHub release and semantic version models

Define Swift structs for GitHub release/asset payloads and a comparable SemanticVersion type for firmware comparison.

ULO-JSON_SERIALIZATION-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand JSON Serialization/Deserialization: Using standard mechanisms to serialize native language objects to JSON and deserialize JSON back to objects.
CIO-JSON_SERIALIZATION-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design JSON Serialization/Deserialization: Using standard mechanisms to serialize native language objects to JSON and deserialize JSON back to objects.
CIO-JSON_SERIALIZATION-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng sử dụng một bộ giải mã (decoder) để phân tích một chuỗi dữ liệu (ví dụ: JSON) và tái tạo lại đối tượng có cấu trúc ban đầu trong bộ nhớ.
CIO-JSON_SERIALIZATION-03 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng sử dụng một bộ mã hóa (encoder) để chuyển đổi một đối tượng có cấu trúc thành một chuỗi dữ liệu, ví dụ như JSON.
SIO-SWIFT-JSON_SERIALIZATION-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement JSON Serialization/Deserialization: Using standard mechanisms to serialize native language objects to JSON and deserialize JSON back to objects.
ULO-CORE_UTILITIES-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
CIO-CORE_UTILITIES-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
SIO-SWIFT-CORE_UTILITIES-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
ULO-VERSIONING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Versioning in the context of the project.
CIO-VERSIONING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Versioning at the model level in the project.
SIO-SWIFT-VERSIONING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Versioning using 'CodingKeys' on the app platform.

Milestone Update Core Data migration policy to preserve skipUpdateTag

Update the Core Data migration policy to preserve the new `skipUpdateTag` attribute when migrating existing devices.

ULO-DATA_PERSISTENCE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
CIO-DATA_PERSISTENCE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
SIO-SWIFT-DATA_PERSISTENCE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
ULO-VERSIONING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Versioning in the context of the project.
CIO-VERSIONING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Versioning at the model level in the project.
SIO-SWIFT-VERSIONING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Versioning using 'CodingKeys' on the app platform.

Phase 3 BUILD MVP

A runnable product from the start (minimal UI + logic + data)

Milestone Add DiscoveryService to DeviceWebsocketListViewModel

Inject DiscoveryService into the list view model and implement startDiscovery() to begin Bonjour scanning.

ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.
ULO-SHARED_OBSERVABLE_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng kết nối một View với một đối tượng trạng thái chung đã tồn tại để nhận các cập nhật.
SIO-SWIFT-SHARED_OBSERVABLE_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
ULO-CONCURRENCY-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
CIO-CONCURRENCY-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
SIO-SWIFT-CONCURRENCY-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.

Milestone Upsert discovered devices into Core Data

On discovery, call DeviceFirstContactService to upsert the device in Core Data, then refresh the device list.

ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.
ULO-DATA_PERSISTENCE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
CIO-DATA_PERSISTENCE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
SIO-SWIFT-DATA_PERSISTENCE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.

Milestone Add DeviceAddViewModel with address validation and step states

Implement an ObservableObject VM that exposes an address field, validates non-empty input, and transitions through form/adding/success states.

ULO-CONCURRENCY-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
CIO-CONCURRENCY-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
SIO-SWIFT-CONCURRENCY-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
ULO-SHARED_OBSERVABLE_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng kết nối một View với một đối tượng trạng thái chung đã tồn tại để nhận các cập nhật.
SIO-SWIFT-SHARED_OBSERVABLE_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
ULO-LOCAL_VIEW_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Local View State: Using @State to manage simple state local to a single view, destroyed when the view disappears.
CIO-LOCAL_VIEW_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng khai báo một biến trạng thái chỉ thuộc về một thành phần giao diện duy nhất và quản lý vòng đời của nó.
CIO-LOCAL_VIEW_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng thay đổi giá trị của một biến trạng thái để kích hoạt việc vẽ lại giao diện một cách tự động.
SIO-SWIFT-LOCAL_VIEW_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Local View State: Using @State to manage simple state local to a single view, destroyed when the view disappears.

Milestone Submit device creation via DeviceFirstContactService

Call the actor service to fetch device info and create the Core Data device, updating the view model state asynchronously.

ULO-CONCURRENCY-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
CIO-CONCURRENCY-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
SIO-SWIFT-CONCURRENCY-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.
ULO-DATA_PERSISTENCE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
CIO-DATA_PERSISTENCE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
SIO-SWIFT-DATA_PERSISTENCE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.

Milestone Create WebSocket connection manager

Implement WebsocketClient with connect, disconnect, listen, and URLSessionWebSocketDelegate conformance.

ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.

Milestone Decode state messages into DeviceStateInfo

Parse incoming WebSocket JSON texts into DeviceStateInfo and publish them on the main actor.

ULO-JSON_SERIALIZATION-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand JSON Serialization/Deserialization: Using standard mechanisms to serialize native language objects to JSON and deserialize JSON back to objects.
CIO-JSON_SERIALIZATION-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design JSON Serialization/Deserialization: Using standard mechanisms to serialize native language objects to JSON and deserialize JSON back to objects.
CIO-JSON_SERIALIZATION-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng sử dụng một bộ giải mã (decoder) để phân tích một chuỗi dữ liệu (ví dụ: JSON) và tái tạo lại đối tượng có cấu trúc ban đầu trong bộ nhớ.
CIO-JSON_SERIALIZATION-03 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng sử dụng một bộ mã hóa (encoder) để chuyển đổi một đối tượng có cấu trúc thành một chuỗi dữ liệu, ví dụ như JSON.
SIO-SWIFT-JSON_SERIALIZATION-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement JSON Serialization/Deserialization: Using standard mechanisms to serialize native language objects to JSON and deserialize JSON back to objects.
ULO-CONCURRENCY-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
CIO-CONCURRENCY-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
SIO-SWIFT-CONCURRENCY-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
ULO-REACTIVE_PROGRAMMING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
CIO-REACTIVE_PROGRAMMING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
SIO-SWIFT-REACTIVE_PROGRAMMING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.

Milestone Send power state through WebSocket

Implement setDevicePower to build a WledState with isOn and send it via the device's websocket client.

ULO-SHARED_OBSERVABLE_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng kết nối một View với một đối tượng trạng thái chung đã tồn tại để nhận các cập nhật.
SIO-SWIFT-SHARED_OBSERVABLE_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.
ULO-IF_ELSE_STATEMENT-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand If-Else Statement: Master the syntax and logic of the if-else statement to execute one of two code blocks based on a logical condition.
CIO-IF_ELSE_STATEMENT-01 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng viết một cấu trúc điều kiện để thực thi một trong hai khối mã khác nhau (if/else) dựa trên một điều kiện.
CIO-IF_ELSE_STATEMENT-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng viết một chuỗi các cấu trúc điều kiện (if/else if/else) để lựa chọn thực thi một trong nhiều khối mã.
CIO-IF_ELSE_STATEMENT-03 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng viết một cấu trúc điều kiện để chỉ thực thi một khối mã nếu một điều kiện là đúng.
SIO-SWIFT-IF_ELSE_STATEMENT-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement If-Else Statement: Master the syntax and logic of the if-else statement to execute one of two code blocks based on a logical condition.

Milestone Send brightness through WebSocket

Implement setBrightness to create a WledState with brightness and send it using sendState.

ULO-SHARED_OBSERVABLE_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng kết nối một View với một đối tượng trạng thái chung đã tồn tại để nhận các cập nhật.
SIO-SWIFT-SHARED_OBSERVABLE_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
ULO-VARIANT_PROPERTIES-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Variant Properties: A set of properties and states defined for a UI component to manage variants such as size, type, or interaction state. Classifying properties helps organize components neatly and allows quick switching between different configurations.
CIO-VARIANT_PROPERTIES-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Variant Properties: A set of properties and states defined for a UI component to manage variants such as size, type, or interaction state. Classifying properties helps organize components neatly and allows quick switching between different configurations.
SIO-SWIFT-VARIANT_PROPERTIES-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Variant Properties: A set of properties and states defined for a UI component to manage variants such as size, type, or interaction state. Classifying properties helps organize components neatly and allows quick switching between different configurations.
ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.
ULO-CORE_UTILITIES-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
CIO-CORE_UTILITIES-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
SIO-SWIFT-CORE_UTILITIES-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.

Milestone Implement rename and hide controls in device edit screen

Add TextField for custom name and Toggle for hide device in DeviceEditView, bound to DeviceEditViewModel and persisted to Core Data.

ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-SHARED_OBSERVABLE_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng kết nối một View với một đối tượng trạng thái chung đã tồn tại để nhận các cập nhật.
SIO-SWIFT-SHARED_OBSERVABLE_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
ULO-REACTIVE_PROGRAMMING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
CIO-REACTIVE_PROGRAMMING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
SIO-SWIFT-REACTIVE_PROGRAMMING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
ULO-DATA_PERSISTENCE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
CIO-DATA_PERSISTENCE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
SIO-SWIFT-DATA_PERSISTENCE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.

Milestone Track and display offline timestamp for devices

Update WebsocketClient to store lastSeen on state messages and render OfflineSinceText from lastSeen in DeviceInfoTwoRows.

ULO-CORE_UTILITIES-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
CIO-CORE_UTILITIES-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
SIO-SWIFT-CORE_UTILITIES-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.

Milestone Implement GitHub API networking

Add async methods to fetch all WLED releases and download a release binary asset to a local file.

ULO-HTTP_PROTOCOL-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Hypertext Transfer Protocol: The learner will be able to explain the HTTP protocol's request/response cycle, methods, status codes, headers, and its role in web communication.
CIO-HTTP_PROTOCOL-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Hypertext Transfer Protocol: The learner will be able to explain the HTTP protocol's request/response cycle, methods, status codes, headers, and its role in web communication.
CIO-HTTP_PROTOCOL-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng so sánh sự khác biệt về hiệu năng giữa HTTP/1.1, HTTP/2 và HTTP/3 QUIC.
SIO-SWIFT-HTTP_PROTOCOL-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Hypertext Transfer Protocol: The learner will be able to explain the HTTP protocol's request/response cycle, methods, status codes, headers, and its role in web communication.
ULO-JSON_SERIALIZATION-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand JSON Serialization/Deserialization: Using standard mechanisms to serialize native language objects to JSON and deserialize JSON back to objects.
CIO-JSON_SERIALIZATION-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design JSON Serialization/Deserialization: Using standard mechanisms to serialize native language objects to JSON and deserialize JSON back to objects.
CIO-JSON_SERIALIZATION-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng sử dụng một bộ giải mã (decoder) để phân tích một chuỗi dữ liệu (ví dụ: JSON) và tái tạo lại đối tượng có cấu trúc ban đầu trong bộ nhớ.
CIO-JSON_SERIALIZATION-03 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng sử dụng một bộ mã hóa (encoder) để chuyển đổi một đối tượng có cấu trúc thành một chuỗi dữ liệu, ví dụ như JSON.
SIO-SWIFT-JSON_SERIALIZATION-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement JSON Serialization/Deserialization: Using standard mechanisms to serialize native language objects to JSON and deserialize JSON back to objects.

Milestone Persist releases and query latest version

Add ReleaseService methods to refresh GitHub releases into Core Data and fetch the newest version for a branch.

ULO-DATA_PERSISTENCE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
CIO-DATA_PERSISTENCE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
SIO-SWIFT-DATA_PERSISTENCE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
ULO-CONCURRENCY-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
CIO-CONCURRENCY-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
SIO-SWIFT-CONCURRENCY-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Concurrency: DispatchQueue is a mechanism for managing concurrent tasks; it maps to Concurrency.
ULO-CORE_UTILITIES-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
CIO-CORE_UTILITIES-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
SIO-SWIFT-CORE_UTILITIES-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.

Milestone Determine asset, download, and install firmware

Implement DeviceUpdateService to pick the right .bin asset, cache it, and POST it to the device's /update endpoint.

ULO-VERSIONING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Versioning in the context of the project.
CIO-VERSIONING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Versioning at the model level in the project.
SIO-SWIFT-VERSIONING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Versioning using 'CodingKeys' on the app platform.
ULO-HTTP_PROTOCOL-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Hypertext Transfer Protocol: The learner will be able to explain the HTTP protocol's request/response cycle, methods, status codes, headers, and its role in web communication.
CIO-HTTP_PROTOCOL-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Hypertext Transfer Protocol: The learner will be able to explain the HTTP protocol's request/response cycle, methods, status codes, headers, and its role in web communication.
CIO-HTTP_PROTOCOL-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng so sánh sự khác biệt về hiệu năng giữa HTTP/1.1, HTTP/2 và HTTP/3 QUIC.
SIO-SWIFT-HTTP_PROTOCOL-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Hypertext Transfer Protocol: The learner will be able to explain the HTTP protocol's request/response cycle, methods, status codes, headers, and its role in web communication.
ULO-RESOURCE_MANAGEMENT-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Resource Management: Bundle is used for organizing and accessing resources in an app; it maps to Resource Management.
CIO-RESOURCE_MANAGEMENT-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Resource Management: Bundle is used for organizing and accessing resources in an app; it maps to Resource Management.
SIO-SWIFT-RESOURCE_MANAGEMENT-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Resource Management: Bundle is used for organizing and accessing resources in an app; it maps to Resource Management.

Milestone Ignore skipped version in release check

Extend `ReleaseService` so it ignores the version tag passed via `ignoreVersion`, preventing skipped versions from being returned as updates.

ULO-VERSIONING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Versioning in the context of the project.
CIO-VERSIONING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Versioning at the model level in the project.
SIO-SWIFT-VERSIONING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Versioning using 'CodingKeys' on the app platform.

Milestone Add Skip This Version button

Add a 'Skip This Version' button in the update details screen that saves the version tag to `Device.skipUpdateTag`.

ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-VERSIONING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Versioning in the context of the project.
CIO-VERSIONING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Versioning at the model level in the project.
SIO-SWIFT-VERSIONING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Versioning using 'CodingKeys' on the app platform.
ULO-DATA_PERSISTENCE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
CIO-DATA_PERSISTENCE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
SIO-SWIFT-DATA_PERSISTENCE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.

Phase 4 EXPAND

Make it real: real APIs, file persistence, filters

Milestone Fast-path known devices via mDNS MAC

Use the mDNS TXT 'mac' value to quickly update known device addresses, falling back to fetchAndUpsertDevice.

ULO-ERROR_HANDLING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
CIO-ERROR_HANDLING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
SIO-SWIFT-ERROR_HANDLING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.

Milestone Enhance address validation using URLComponents

Allow IP addresses or URLs by adding scheme when missing and validating host with URLComponents in isAddressValid.

ULO-HTTP_PROTOCOL-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Hypertext Transfer Protocol: The learner will be able to explain the HTTP protocol's request/response cycle, methods, status codes, headers, and its role in web communication.
CIO-HTTP_PROTOCOL-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Hypertext Transfer Protocol: The learner will be able to explain the HTTP protocol's request/response cycle, methods, status codes, headers, and its role in web communication.
CIO-HTTP_PROTOCOL-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng so sánh sự khác biệt về hiệu năng giữa HTTP/1.1, HTTP/2 và HTTP/3 QUIC.
SIO-SWIFT-HTTP_PROTOCOL-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Hypertext Transfer Protocol: The learner will be able to explain the HTTP protocol's request/response cycle, methods, status codes, headers, and its role in web communication.
ULO-ERROR_HANDLING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
CIO-ERROR_HANDLING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
SIO-SWIFT-ERROR_HANDLING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.

Milestone Display service errors in the form

Catch errors from the first-contact service and show a localized message in the form step instead of failing silently.

ULO-EXCEPTION_HANDLING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Exception Handling in the context of the project.
CIO-EXCEPTION_HANDLING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Exception Handling at the model level in the project.
CIO-EXCEPTION_HANDLING-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng sử dụng các cơ chế xử lý lỗi (như throws và try/catch) để quản lý các lỗi có thể xảy ra trong các tác vụ bất đồng bộ.
CIO-EXCEPTION_HANDLING-03 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng sử dụng cấu trúc try-catch để "bắt" các lỗi được ném ra từ các hàm và thực hiện các hành động xử lý phù hợp.
CIO-EXCEPTION_HANDLING-04 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng định nghĩa các hàm có thể "ném" (throw) một lỗi khi có sự cố xảy ra, và truyền lỗi đó lên cho nơi gọi hàm xử lý.
SIO-SWIFT-EXCEPTION_HANDLING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Exception Handling using 'throws' on the app platform.
ULO-ERROR_HANDLING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
CIO-ERROR_HANDLING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
SIO-SWIFT-ERROR_HANDLING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
ULO-CORE_UTILITIES-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
CIO-CORE_UTILITIES-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
SIO-SWIFT-CORE_UTILITIES-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.

Milestone Expose live device state for UI

Add @Published stateInfo/websocketStatus and computed color, brightness, signal in DeviceWithState.

ULO-SHARED_OBSERVABLE_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng kết nối một View với một đối tượng trạng thái chung đã tồn tại để nhận các cập nhật.
SIO-SWIFT-SHARED_OBSERVABLE_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.
ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.

Milestone Render status, color, and brightness in device views

Show connection status, signal strength, offline text, and bind brightness slider in list/detail UI.

ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.

Milestone Optimistic UI and debounced sliding

Update stateInfo.brightness immediately while dragging and debounce sendState calls to avoid flooding the device.

ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-REACTIVE_PROGRAMMING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
CIO-REACTIVE_PROGRAMMING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
SIO-SWIFT-REACTIVE_PROGRAMMING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
ULO-VARIANT_PROPERTIES-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Variant Properties: A set of properties and states defined for a UI component to manage variants such as size, type, or interaction state. Classifying properties helps organize components neatly and allows quick switching between different configurations.
CIO-VARIANT_PROPERTIES-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Variant Properties: A set of properties and states defined for a UI component to manage variants such as size, type, or interaction state. Classifying properties helps organize components neatly and allows quick switching between different configurations.
SIO-SWIFT-VARIANT_PROPERTIES-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Variant Properties: A set of properties and states defined for a UI component to manage variants such as size, type, or interaction state. Classifying properties helps organize components neatly and allows quick switching between different configurations.
ULO-SHARED_OBSERVABLE_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng kết nối một View với một đối tượng trạng thái chung đã tồn tại để nhận các cập nhật.
SIO-SWIFT-SHARED_OBSERVABLE_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.

Milestone Show network details in device edit screen

Add a Card in DeviceEditView displaying IP address, MAC, WiFi signal, channel, uptime, and firmware version from stateInfo.

ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-SHARED_OBSERVABLE_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng kết nối một View với một đối tượng trạng thái chung đã tồn tại để nhận các cập nhật.
SIO-SWIFT-SHARED_OBSERVABLE_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.

Milestone Organize device list with filtering and grouping

Extend DeviceListView with toggles for hidden/offline devices and group rows into Online and Offline sections.

ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-CORE_UTILITIES-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
CIO-CORE_UTILITIES-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.
SIO-SWIFT-CORE_UTILITIES-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Core Utilities: Foundation is an Apple framework providing data types, collections, and OS services; it falls under Core Utilities.

Milestone Add update UI in device edit screen

Show update availability, wire the 'Check for Update' button, and add a release-notes detail screen with skip option.

ULO-SHARED_OBSERVABLE_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng kết nối một View với một đối tượng trạng thái chung đã tồn tại để nhận các cập nhật.
SIO-SWIFT-SHARED_OBSERVABLE_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-MARKDOWN_RENDERING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Markdown Rendering: MarkdownUI is a library for rendering Markdown content; it maps to Markdown Rendering.
CIO-MARKDOWN_RENDERING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Markdown Rendering: MarkdownUI is a library for rendering Markdown content; it maps to Markdown Rendering.
SIO-SWIFT-MARKDOWN_RENDERING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Markdown Rendering: MarkdownUI is a library for rendering Markdown content; it maps to Markdown Rendering.

Milestone React to skipUpdateTag changes in update pipeline

Observe `skipUpdateTag` changes in `DeviceWithState` and pass it as ignored version when calculating `availableUpdateVersion`.

ULO-REACTIVE_PROGRAMMING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
CIO-REACTIVE_PROGRAMMING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
SIO-SWIFT-REACTIVE_PROGRAMMING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
ULO-VERSIONING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Versioning in the context of the project.
CIO-VERSIONING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Versioning at the model level in the project.
SIO-SWIFT-VERSIONING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Versioning using 'CodingKeys' on the app platform.

Milestone Reset skip tag on branch change or manual refresh

Reset `skipUpdateTag` when user checks for updates or changes the update branch, making skipped version re-evaluated.

ULO-VERSION_CONTROL-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Version Control in the context of the project.
CIO-VERSION_CONTROL-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Version Control at the model level in the project.
SIO-SWIFT-VERSION_CONTROL-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Version Control using 'createDestinationInstances' on the app platform.
ULO-VERSIONING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Versioning in the context of the project.
CIO-VERSIONING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Versioning at the model level in the project.
SIO-SWIFT-VERSIONING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Versioning using 'CodingKeys' on the app platform.

Phase 5 POLISH

Robustness: error handling, validation, tests, polish

Milestone Handle lifecycle and local network permission

Expose localNetworkDenied, stop scanning in background, and restart on foreground to avoid duplicate scans.

ULO-ERROR_HANDLING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
CIO-ERROR_HANDLING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
SIO-SWIFT-ERROR_HANDLING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
ULO-APP_LIFECYCLE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand App Lifecycle in the context of the project.
CIO-APP_LIFECYCLE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply App Lifecycle at the model level in the project.
SIO-SWIFT-APP_LIFECYCLE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement App Lifecycle using 'localNetworkDenied' on the app platform.

Milestone Add loading, success views and keyboard focus handling

Show a ProgressView while adding, a success checkmark after discovery, and focus the text field with keyboard submit action.

ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-LOCAL_VIEW_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Local View State: Using @State to manage simple state local to a single view, destroyed when the view disappears.
CIO-LOCAL_VIEW_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng khai báo một biến trạng thái chỉ thuộc về một thành phần giao diện duy nhất và quản lý vòng đời của nó.
CIO-LOCAL_VIEW_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng thay đổi giá trị của một biến trạng thái để kích hoạt việc vẽ lại giao diện một cách tự động.
SIO-SWIFT-LOCAL_VIEW_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Local View State: Using @State to manage simple state local to a single view, destroyed when the view disappears.

Milestone Add resilient reconnection and lifecycle handling

Reconnect with exponential backoff, ignore manual disconnects, and react to scenePhase changes.

ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.
ULO-ERROR_HANDLING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
CIO-ERROR_HANDLING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
SIO-SWIFT-ERROR_HANDLING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
ULO-LOCAL_VIEW_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Local View State: Using @State to manage simple state local to a single view, destroyed when the view disappears.
CIO-LOCAL_VIEW_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng khai báo một biến trạng thái chỉ thuộc về một thành phần giao diện duy nhất và quản lý vòng đời của nó.
CIO-LOCAL_VIEW_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng thay đổi giá trị của một biến trạng thái để kích hoạt việc vẽ lại giao diện một cách tự động.
SIO-SWIFT-LOCAL_VIEW_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Local View State: Using @State to manage simple state local to a single view, destroyed when the view disappears.
ULO-APP_LIFECYCLE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand App Lifecycle in the context of the project.
CIO-APP_LIFECYCLE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply App Lifecycle at the model level in the project.
SIO-SWIFT-APP_LIFECYCLE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement App Lifecycle using 'localNetworkDenied' on the app platform.

Milestone Reconnect and validate offline controls

Reconnect WebSocket before sending when disconnected, and disable Toggle/Slider when the device is offline.

ULO-NETWORKING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Networking: Network is a framework for network connections; it maps to Networking.
CIO-NETWORKING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Networking: Network is a framework for network connections; it maps to Networking.
SIO-SWIFT-NETWORKING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Networking: Network is a framework for network connections; it maps to Networking.
ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.

Milestone Add swipe actions and rename validation

Add swipe actions to hide/unhide devices and validate that customName is non-empty before saving, alerting the user on failure.

ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-ERROR_HANDLING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
CIO-ERROR_HANDLING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
SIO-SWIFT-ERROR_HANDLING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
ULO-DATA_PERSISTENCE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
CIO-DATA_PERSISTENCE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.
SIO-SWIFT-DATA_PERSISTENCE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Data Persistence: CoreData is a persistence framework for object graph management and storage; it maps to Data Persistence.

Milestone Build installer with progress and error handling

Create full-screen installer flow that tracks download/install status, shows success/failure, and maps thrown errors.

ULO-SHARED_OBSERVABLE_STATE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
CIO-SHARED_OBSERVABLE_STATE-02 · CONCEPTUAL_IMPL · Bloom: apply
Người học có khả năng kết nối một View với một đối tượng trạng thái chung đã tồn tại để nhận các cập nhật.
SIO-SWIFT-SHARED_OBSERVABLE_STATE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Shared Observable State: Using Observable Object (@StateObject, @ObservedObject) to manage and share complex class-based state across views.
ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-ERROR_HANDLING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
CIO-ERROR_HANDLING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
SIO-SWIFT-ERROR_HANDLING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Error Handling: try? is a keyword for optional error propagation in Swift; it also maps to Error Handling.
ULO-REACTIVE_PROGRAMMING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
CIO-REACTIVE_PROGRAMMING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.
SIO-SWIFT-REACTIVE_PROGRAMMING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Reactive Programming: Combine is a reactive programming framework for handling asynchronous events; it maps to Reactive Programming.

Milestone Add confirmation and error logging to skip action

Guard skip action with confirmation dialog and log save errors for robustness.

ULO-USER_INTERFACE-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
CIO-USER_INTERFACE-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
SIO-SWIFT-USER_INTERFACE-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement User Interface: UIKit is a UI framework for building user interfaces; it maps to User Interface.
ULO-VERSIONING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Versioning in the context of the project.
CIO-VERSIONING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to apply Versioning at the model level in the project.
SIO-SWIFT-VERSIONING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Versioning using 'CodingKeys' on the app platform.
ULO-LOGGING-01 · UNIVERSAL · Bloom: understand
The learner will be able to understand Logging: OSLog is a logging system; it maps to Logging.
CIO-LOGGING-01 · CONCEPTUAL_IMPL · Bloom: apply
The learner will be able to design Logging: OSLog is a logging system; it maps to Logging.
SIO-SWIFT-LOGGING-01 · SPECIFIC_IMPL · Bloom: create
The learner will be able to implement Logging: OSLog is a logging system; it maps to Logging.