diff --git a/changelog/v0.2.5.html b/changelog/v0.2.5.html
index b74990c..8a6adb0 100644
--- a/changelog/v0.2.5.html
+++ b/changelog/v0.2.5.html
@@ -195,6 +195,7 @@
Root nuget.config added for package source management
Terminal.Gui formatting excluded from CI format checks
Recursive submodule fetching enabled in CI workflows
+Release workflow: use --notes-file instead of inline --notes interpolation to prevent shell expansion of special characters in commit messages
Server:Admins config array in appsettings.example.json for designating admin usernames
Storage:CleanupIntervalHours and Storage:RetentionDays added to appsettings.example.json
FakeChannelService test helper added for IRC unit tests
diff --git a/index.json b/index.json
index efa0c5d..eff646f 100644
--- a/index.json
+++ b/index.json
@@ -792,7 +792,7 @@
"changelog/v0.2.5.html": {
"href": "changelog/v0.2.5.html",
"title": "v0.2.5 - Session Persistence, Auto-Updates, Audio & Transparent Theme | EchoHub Documentation",
- "summary": "v0.2.5 - Session Persistence, Auto-Updates, Audio & Transparent Theme Features Audio Message Support New Audio message type — uploaded audio files (.mp3, .wav, .ogg, .flac, .aac, .m4a, .wma) are automatically detected and categorized TUI client renders audio messages with ♪ [Audio: filename] (Enter to play) indicator Press Enter on an audio message to open the Audio Player dialog with animated wave visualization, play/pause/stop controls, and volume slider Per-type upload limits: 10 MB images, 10 MB audio, 100 MB generic files (with Kestrel request size configured to match) AudioPlaybackService enhanced with pause/resume, volume control, and playback-finished events Fixed: wrapped audio/file messages now remain clickable on all lines (attachment metadata propagated through word-wrap) IRC gateway formats audio messages as ♪ [Audio: filename] url Server detects audio files by extension via FileValidationHelper.IsAudioFile() File Downloads Press Enter on a file message in the TUI client to download and open it with the system default application ApiClient.DownloadFileAsync() streams file downloads from the server File and audio messages in the chat list now show colored indicators with interaction hints File Cleanup Service FileCleanupService (BackgroundService) periodically removes old uploaded files Configurable via Storage:CleanupIntervalHours (default 1h) and Storage:RetentionDays (default 30d) Data Migration Service DataMigrationService runs at startup to handle schema/data evolution Ensures #general channel and pre-existing channels are marked public Migrates legacy ANSI escape codes in image messages to printable color tags ({F:RRGGBB}, {B:RRGGBB}, {X}) Migrates legacy single-object EmbedJson to array format Promotes usernames listed in Server:Admins config to Admin role True Transparent Background Transparent theme now uses the terminal's native background instead of solid black Powered by Color.None (alpha=0) which emits ANSI CSI 49m (default background) instead of explicit RGB Terminal transparency, acrylic, wallpaper effects now show through the TUI Dialogs retain solid DarkGray background for readability Uses local Terminal.Gui fork (submodule) with transparent color support pending upstream merge (gui-cs/Terminal.Gui#4234) Enhanced Status Bar Status bar now shows EchoHub branding at the start Connection state is color-coded: green (Connected), red (Disconnected), yellow (transitional states like Connecting, Reconnecting, Authenticating) Current channel shows its type: #channel - public or #channel - private Remember Me (Session Persistence) \"Remember me\" checkbox in the connect dialog — saves a 30-day refresh token so users can reconnect without entering their password Saved servers with active sessions show [session] indicator in the connect dialog and saved servers list Token-based login: selecting a saved server with a session lets you click Login with an empty password Graceful expiry handling: if the saved session is expired or revoked, shows an error and prompts for password Refresh token rotation: rotated tokens are automatically persisted to config so the session stays valid across refreshes New \"Logout\" menu item (Server menu): revokes the refresh token server-side and clears the saved session Removed dead SavedServer.Token field (stored 15-min access token that was never read back) Automatic Update Checking UpdateChecker rewritten to use the AlwaysUpToDate library for self-updating Polls the EchoHub version manifest hourly (active only in RELEASE builds) UpdateConfirmDialog shows current vs. available version with Update/Cancel buttons UpdateProgressDialog displays real-time download progress bar Errors are logged via Serilog instead of being silently swallowed Windows Installer New Inno Setup script (installer/Installer.iss) to build a Windows installer Auto-reads product version from the built EXE User-level install by default (no admin required), with admin override option Creates desktop and quick-launch shortcuts (optional) Supports English and German languages Application Icons New hue_icon branding assets (ICO, PNG, SVG) in assets/ Application icon set on both Client and Server projects #general Channel Protection #general channel is now auto-recreated if somehow missing (both in GetChannels endpoint and JoinChannel flow) Users cannot /leave the #general channel (client-side guard) Connecting while already connected now prompts to disconnect first instead of silently leaking the previous connection Fixes IRC Gateway Fixed: IRC JOIN history replay showed encrypted gibberish — IrcCommandHandler.HandleJoinAsync now decrypts channel history before formatting for IRC clients (history was encrypted for SignalR transport but sent raw to IRC) Fixed: JoinedChannels race condition — IrcClientConnection.JoinedChannels replaced with thread-safe methods (JoinChannel, LeaveChannel, IsInChannel, GetJoinedChannels) using lock synchronization; prevents crashes when broadcaster threads read while the command handler writes Fixed: RequireRegistered fire-and-forget — converted from sync bool to async Task (RequireRegisteredAsync) so the error reply is properly awaited before the handler returns ChannelService Extraction Extracted channel management logic from ChannelsController and ChatService into a dedicated IChannelService / ChannelService ChannelsController is now a thin adapter — delegates CRUD operations to IChannelService and maps ChannelError to HTTP status codes ChatService.JoinChannelAsync delegates channel validation + membership to IChannelService.EnsureChannelMembershipAsync() New ChannelOperationResult result type with ChannelError enum for typed error handling across service boundaries IRC gateway uses IChannelService for topic queries and channel listing (instead of IChatService) EchoHub Branding Status bar \"EchoHub\" text now uses golden color (218, 165, 32) Infrastructure Audio MIME types in FilesController (mp3, wav, ogg, flac, aac, m4a, wma) CI workflows updated to handle Terminal.Gui submodule nuget.config workaround (rm -f step) Root nuget.config added for package source management Terminal.Gui formatting excluded from CI format checks Recursive submodule fetching enabled in CI workflows Server:Admins config array in appsettings.example.json for designating admin usernames Storage:CleanupIntervalHours and Storage:RetentionDays added to appsettings.example.json FakeChannelService test helper added for IRC unit tests Test suites: ChatLine, CommandHandler, DataMigrationService, FileValidationHelper, ImageToAsciiService, IrcMessageFormatter, JwtTokenService, LinkEmbedService IRC abstraction layer test suite: IrcMessage parsing, IrcMessageFormatter, IrcClientConnection, IrcCommandHandler, IrcBroadcaster Test helpers: TestDuplexStream, TestIrcConnectionFactory, FakeChatService, FakeChannelService, FakeEncryptionService for IRC unit testing without network I/O 346 total tests"
+ "summary": "v0.2.5 - Session Persistence, Auto-Updates, Audio & Transparent Theme Features Audio Message Support New Audio message type — uploaded audio files (.mp3, .wav, .ogg, .flac, .aac, .m4a, .wma) are automatically detected and categorized TUI client renders audio messages with ♪ [Audio: filename] (Enter to play) indicator Press Enter on an audio message to open the Audio Player dialog with animated wave visualization, play/pause/stop controls, and volume slider Per-type upload limits: 10 MB images, 10 MB audio, 100 MB generic files (with Kestrel request size configured to match) AudioPlaybackService enhanced with pause/resume, volume control, and playback-finished events Fixed: wrapped audio/file messages now remain clickable on all lines (attachment metadata propagated through word-wrap) IRC gateway formats audio messages as ♪ [Audio: filename] url Server detects audio files by extension via FileValidationHelper.IsAudioFile() File Downloads Press Enter on a file message in the TUI client to download and open it with the system default application ApiClient.DownloadFileAsync() streams file downloads from the server File and audio messages in the chat list now show colored indicators with interaction hints File Cleanup Service FileCleanupService (BackgroundService) periodically removes old uploaded files Configurable via Storage:CleanupIntervalHours (default 1h) and Storage:RetentionDays (default 30d) Data Migration Service DataMigrationService runs at startup to handle schema/data evolution Ensures #general channel and pre-existing channels are marked public Migrates legacy ANSI escape codes in image messages to printable color tags ({F:RRGGBB}, {B:RRGGBB}, {X}) Migrates legacy single-object EmbedJson to array format Promotes usernames listed in Server:Admins config to Admin role True Transparent Background Transparent theme now uses the terminal's native background instead of solid black Powered by Color.None (alpha=0) which emits ANSI CSI 49m (default background) instead of explicit RGB Terminal transparency, acrylic, wallpaper effects now show through the TUI Dialogs retain solid DarkGray background for readability Uses local Terminal.Gui fork (submodule) with transparent color support pending upstream merge (gui-cs/Terminal.Gui#4234) Enhanced Status Bar Status bar now shows EchoHub branding at the start Connection state is color-coded: green (Connected), red (Disconnected), yellow (transitional states like Connecting, Reconnecting, Authenticating) Current channel shows its type: #channel - public or #channel - private Remember Me (Session Persistence) \"Remember me\" checkbox in the connect dialog — saves a 30-day refresh token so users can reconnect without entering their password Saved servers with active sessions show [session] indicator in the connect dialog and saved servers list Token-based login: selecting a saved server with a session lets you click Login with an empty password Graceful expiry handling: if the saved session is expired or revoked, shows an error and prompts for password Refresh token rotation: rotated tokens are automatically persisted to config so the session stays valid across refreshes New \"Logout\" menu item (Server menu): revokes the refresh token server-side and clears the saved session Removed dead SavedServer.Token field (stored 15-min access token that was never read back) Automatic Update Checking UpdateChecker rewritten to use the AlwaysUpToDate library for self-updating Polls the EchoHub version manifest hourly (active only in RELEASE builds) UpdateConfirmDialog shows current vs. available version with Update/Cancel buttons UpdateProgressDialog displays real-time download progress bar Errors are logged via Serilog instead of being silently swallowed Windows Installer New Inno Setup script (installer/Installer.iss) to build a Windows installer Auto-reads product version from the built EXE User-level install by default (no admin required), with admin override option Creates desktop and quick-launch shortcuts (optional) Supports English and German languages Application Icons New hue_icon branding assets (ICO, PNG, SVG) in assets/ Application icon set on both Client and Server projects #general Channel Protection #general channel is now auto-recreated if somehow missing (both in GetChannels endpoint and JoinChannel flow) Users cannot /leave the #general channel (client-side guard) Connecting while already connected now prompts to disconnect first instead of silently leaking the previous connection Fixes IRC Gateway Fixed: IRC JOIN history replay showed encrypted gibberish — IrcCommandHandler.HandleJoinAsync now decrypts channel history before formatting for IRC clients (history was encrypted for SignalR transport but sent raw to IRC) Fixed: JoinedChannels race condition — IrcClientConnection.JoinedChannels replaced with thread-safe methods (JoinChannel, LeaveChannel, IsInChannel, GetJoinedChannels) using lock synchronization; prevents crashes when broadcaster threads read while the command handler writes Fixed: RequireRegistered fire-and-forget — converted from sync bool to async Task (RequireRegisteredAsync) so the error reply is properly awaited before the handler returns ChannelService Extraction Extracted channel management logic from ChannelsController and ChatService into a dedicated IChannelService / ChannelService ChannelsController is now a thin adapter — delegates CRUD operations to IChannelService and maps ChannelError to HTTP status codes ChatService.JoinChannelAsync delegates channel validation + membership to IChannelService.EnsureChannelMembershipAsync() New ChannelOperationResult result type with ChannelError enum for typed error handling across service boundaries IRC gateway uses IChannelService for topic queries and channel listing (instead of IChatService) EchoHub Branding Status bar \"EchoHub\" text now uses golden color (218, 165, 32) Infrastructure Audio MIME types in FilesController (mp3, wav, ogg, flac, aac, m4a, wma) CI workflows updated to handle Terminal.Gui submodule nuget.config workaround (rm -f step) Root nuget.config added for package source management Terminal.Gui formatting excluded from CI format checks Recursive submodule fetching enabled in CI workflows Release workflow: use --notes-file instead of inline --notes interpolation to prevent shell expansion of special characters in commit messages Server:Admins config array in appsettings.example.json for designating admin usernames Storage:CleanupIntervalHours and Storage:RetentionDays added to appsettings.example.json FakeChannelService test helper added for IRC unit tests Test suites: ChatLine, CommandHandler, DataMigrationService, FileValidationHelper, ImageToAsciiService, IrcMessageFormatter, JwtTokenService, LinkEmbedService IRC abstraction layer test suite: IrcMessage parsing, IrcMessageFormatter, IrcClientConnection, IrcCommandHandler, IrcBroadcaster Test helpers: TestDuplexStream, TestIrcConnectionFactory, FakeChatService, FakeChannelService, FakeEncryptionService for IRC unit testing without network I/O 346 total tests"
},
"index.html": {
"href": "index.html",