Extracted ChatMessageManager from MainWindow — message storage, formatting, and mutation logic now in a dedicated class, reducing MainWindow complexity
Extracted ConnectionManager from AppOrchestrator — connection lifecycle, authentication, SignalR event wiring, and channel tracking now in a dedicated service
Extracted AvatarHelper — deduplicated avatar upload logic previously duplicated in /avatar command and profile edit dialog
Consolidated ProfileEditDialog.ParseHexToTrueColor into shared ColorHelper.ParseHexToColor
Extracted UserSession — session state (Username, Status, StatusMessage) now in a dedicated class instead of scattered fields
Replaced 21 inline command handler lambdas with named HandleCmd* methods for improved readability
Extracted shared CleanupConnectionAsync to deduplicate disconnect/logout cleanup logic
Reorganized flat UI/ folder (19 files) into subfolders: Chat/, Dialogs/, ListSources/, Helpers/ with matching namespaces
Moved AsyncRunner from project root to Services/ with updated namespace
Renamed ColorHelper → HexColorHelper to avoid namespace collision with Terminal.Gui's ColorHelper NuGet dependency
Moved hue_icon.ico to Client/Assets/, removed duplicate from Server (Server now references shared icon via relative path)
Infrastructure
Release workflow: use --notes-file instead of inline --notes interpolation to prevent shell expansion of special characters in commit messages