Releases: fuzzywalrus/Hotline-Navigator
v0.2.8 - Quality of Life
v0.2.8
There's been a lot of rapid changes in Navigator's capabilities so this release UX quality-of-life series of fixes since the Discord style chat introduced a new UX paradigm which inevitable had some loose ends.
Disconnects are detected in seconds instead of minutes, chat icons no longer fall back to gray letter placeholders for emotes or for users who chatted before their info loaded, and ! / / commands now appear above the bot's response instead of below it. News browsing also works on multi-tier servers like VesperNet, where top-level entries are folders of folders.
Next release will be new feature bound.
Bugfixes and Improvements
- Optimistic Command Echo — Chat commands prefixed with
!(server bots) or/(e.g./me,/em) now render locally the moment you hit send, so they reliably appear above the bot's broadcast response instead of below it. Pending messages display at 60% opacity until the server confirms; regular chat keeps its original wait-for-echo behavior. - Faster disconnect detection — When a server vanishes silently (peer crash, network drop, NAT timeout), the client now notices in ~60s on macOS/Linux and ~130s on Windows, down from the OS TCP retransmit default of 15+ minutes. Auto-reconnect kicks in correspondingly faster.
- Chat icons for emote messages —
*** name action(from/me) now shows the sender's icon and username header instead of a gray letter placeholder. Multi-word usernames likedmg - devresolve correctly via a longest-prefix match against the live user list. - Chat icons no longer get stuck — Messages that arrived before the user list populated previously kept the gray letter placeholder forever. Icons (and admin badges) are now resolved from the live user list at render time, with the receipt-time value as a fallback for users who have since left.
- News browsing on nested servers — On servers like VesperNet where the top-level news entries are folders containing more folders, navigation no longer dead-ends with an empty article pane. The client now dispatches based on the clicked item's actual type (bundle vs. category) rather than assuming any non-root path holds articles.
Technical
- TCP
SO_KEEPALIVEconfigured on the control channel viasocket2: idle=30s, interval=10s, retries=3 on macOS/Linux. Windows uses the OS default retry count. - App-level keepalive failure now emits
StatusChanged(Disconnected)and clears the transport, instead of silently breaking. - Rust chat handler extracts the sender from the
***emote prefix when noUserNamefield is present. DiscordChatRendereraccepts a liveusersprop and resolvesiconId/isAdminper-render via aresolveLive(msg)helper.- Optimistic insert tagged with
pending: trueandoptimisticKey; echo dedup matches byuserName + message textwithin a 10s window./meand/emare preformatted as*** name actionto match the server echo. 30s safety timeout clears the pending flag if no echo arrives. - News load effect dispatches on a tracked
newsLeafType(2 = bundle →get_news_categories; 3 = category →get_news_articles). Going back always sets leaf type to bundle, since non-leaf path segments are bundles by invariant. - Protocol version field corrected to
u16per Hotline spec.
Installation
Download the installer for your platform from the release assets.
.dmg = macOS, .msi/.exe = Windows, .apk = Android, .ipa = iOS/iPadOS, Linux hippies can figure it out...
v0.2.7 - Chat history!
v0.2.7
Server-side chat history is here! Connect to a server running the Chat History Extension and you'll see the conversation that happened before you arrived. Scroll back through it, pull to load more, just like Discord. Servers without history support are completely unaffected.
This is a pretty big upgrade and allows servers to add chat history. Anyone writing their own server can always yank Navigator and run the tauri in dev mode as there's a ton of debugging that is exposed.
Also hardened link preview fetching against SSRF, added a link preview toggle, and fixed download filename collisions.
As writing this the only server that has chat history is Apple Media Archive as it's the only hotline server I run.
New Features
- Server-Side Chat History - Servers that support the Chat History Extension (capability bit 4) now serve historical messages to Navigator. The latest 50 messages load on connect, and you can scroll back through the full archive with a pull-to-load-more gesture. Retention policy is displayed above the history (e.g., "This server keeps 30 days / 10,000 messages of chat history").
- Separate History Preferences - "Server Chat History" (on by default) and "Local Chat History" (off by default) are now independent toggles in Settings. Local recording is automatically suppressed on servers that provide server-side history.
- Link Previews Toggle - Rich link previews (title, description, image) in Discord chat mode can now be toggled independently from Discord mode.
- Apple Media Archive uses HOPE --The default bookmark for Apple Media Archive now has HOPE enabled, with automatic migration for existing users.
Improvements
- Sign-on/off messages from server history render as centered italic system text, matching live join/leave notifications in Discord mode for history.
- Sending a message while scrolled up through history snaps back to the bottom
- Elastic pull-to-load-more when scrolling to the top of chat history, with a progress indicator and spinner
- "Beginning of chat history" marker shown when the full archive has been loaded
- Download filename collisions now append numbered suffixes (
file (1).txt,file (2).txt) instead of overwriting - Startup chat history passphrase prompt removed - local vault uses a default passphrase
Security
- SSRF Protection for Link Previews — Link preview fetches now validate target URLs before connecting. Private/internal IP ranges are blocked (RFC 1918, loopback, link-local, CGNAT, ULA IPv6). Only http/https schemes allowed. Redirects are followed manually with per-hop validation, preventing redirect-based SSRF attacks.
Technical
- New
protocol/history.rsmodule with packed binary entry parser, mini-TLV sub-field skipping, and 6 unit tests CAPABILITY_CHAT_HISTORY(bit 4),TransactionType::GetChatHistory(700), and 8 newFieldTypevariants (0x0F01–0x0F08) added to protocol constantsget_chat_historymethod onHotlineClientwith cursor-based pagination via pending-transaction patternChatHistoryResponse/ChatHistoryEntryTauri command with message IDs serialized as strings to avoid JSNumberprecision loss on u64ServerInfoextended withchatHistorySupported,historyMaxMsgs,historyMaxDaysis_private_ip()andvalidate_url_target()for SSRF-safe link preview fetching with manual redirect following- Reconnect catch-up via
AFTERcursor when the tab stays alive across disconnect/reconnect cycles
Installation
Download the installer for your platform from the release assets.
.dmg = macOS, .msi/.exe = Windows, .apk = Android, .ipa = iOS/iPadOS, Linux hippies can figure it out...
v0.2.6 - Hotfix release
v0.2.6 Mini Release
Sometimes you don't adequately test. Inline images weren't rendering. OpenGraph previews for links in Discord mode.
- Fix CSP img-src to allow http:/https: URLs (images were blocked in compiled builds)
- Add OpenGraph link preview cards for non-image URLs in Discord chat mode
- Inline images now display by default in Discord mode
- Add fetch_link_preview Rust command for server-side OG metadata extraction
v0.2.5
Major chat UX overhaul with a new Discord-style display mode, makes things look a lot cleaner. It's the default chat mode but also allows for retro mode as well
Windows builds are now available via GitHub-hosted runners.
New Features
- Discord Chat Mode - New chat display option that groups consecutive messages by user with Hotline icons, timestamps, and batched message groups. Image URLs render as inline previews without showing the URL. Set as the default for new users, switchable to Retro (IRC-style) in Settings.
- Reconnect Button - Disconnected server tabs now show a ↺ button next to the close button for quick one-click reconnection without opening a new tab.
- Server Chat History Deduplication - Servers that replay chat history on connect (like Janus) no longer cause duplicate messages. Replayed messages are labeled "Server History" to distinguish them from live chat.
Improvements
- Chat timestamps suppressed for server history messages since the original time is unknown
- Server history messages don't play notification sounds or get re-persisted to local storage
- Chat display preferences are mode-aware, retro-specific toggles are greyed out in Discord mode
- User icons are now captured and stored with chat messages for Discord mode rendering
Technical
- New
DiscordChatRenderercomponent with message batching logic (breaks on sender change, system messages, or 5-minute gap) - Windows build workflow added using GitHub-hosted
windows-latestrunners - Duplicate join/leave system messages deduplicated
- Removed 32 bit support for Android. It makes the binary bigger. It causes build issues. Android 14 was the last to support 32-bit apps and google play around 2019 started mandating 64-bit support. No one was going to make use of this binary. Even if this project's goal is to support as many OSes and wide of range of devices as possible, this can be effectively removed and absolutely 0 people on planet will notice.
Bugfixes
- Server chat replay no longer duplicates messages when reconnecting with chat history enabled
- Username prefix no longer doubled in Discord mode when server embeds sender name in message data
- User icon resolution falls back to username lookup when server sends userId 0
Installation
Download the installer for your platform from the release assets.
.dmg = macOS, .msi/.exe = Windows, .apk = Android, .ipa = iOS/iPadOS, Linux hippies can figure it out...
v0.2.5 - Discord style conversations
v0.2.5
Major chat UX overhaul with a new Discord-style display mode, makes things look a lot cleaner. It's the default chat mode but also allows for retro mode as well
Windows builds are now available via GitHub-hosted runners.
New Features
- Discord Chat Mode - New chat display option that groups consecutive messages by user with Hotline icons, timestamps, and batched message groups. Image URLs render as inline previews without showing the URL. Set as the default for new users, switchable to Retro (IRC-style) in Settings.
- Reconnect Button - Disconnected server tabs now show a ↺ button next to the close button for quick one-click reconnection without opening a new tab.
- Server Chat History Deduplication - Servers that replay chat history on connect (like Janus) no longer cause duplicate messages. Replayed messages are labeled "Server History" to distinguish them from live chat.
Improvements
- Chat timestamps suppressed for server history messages since the original time is unknown
- Server history messages don't play notification sounds or get re-persisted to local storage
- Chat display preferences are mode-aware, retro-specific toggles are greyed out in Discord mode
- User icons are now captured and stored with chat messages for Discord mode rendering
Technical
- New
DiscordChatRenderercomponent with message batching logic (breaks on sender change, system messages, or 5-minute gap) - Windows build workflow added using GitHub-hosted
windows-latestrunners - Duplicate join/leave system messages deduplicated
- Removed 32 bit support for Android. It makes the binary bigger. It causes build issues. Android 14 was the last to support 32-bit apps and google play around 2019 started mandating 64-bit support. No one was going to make use of this binary. Even if this project's goal is to support as many OSes and wide of range of devices as possible, this can be effectively removed and absolutely 0 people on planet will notice.
Bugfixes
- Server chat replay no longer duplicates messages when reconnecting with chat history enabled
- Username prefix no longer doubled in Discord mode when server embeds sender name in message data
- User icon resolution falls back to username lookup when server sends userId 0
Installation
Download the installer for your platform from the release assets.
.dmg = macOS, .msi/.exe = Windows, .apk = Android, .ipa = iOS/iPadOS, Linux hippies can figure it out...
v0.2.4
v0.2.4
Massive change in the development stack that users really won't experience. I now have working GitHub actions to manage builds for macOS, iOS/iPadOS, Linux (ARM64/AMD64) and Android. Windows will require another machine.
Added HOPE encryption for file transfers with HOPE/ChaCha20-Poly1305
New Features
- HOPE end-to-end encryption schemas do not require TLS. TLS will work, but you're just running it over the top of HOPE.
Improvements
- User Color change rendering for supported servers
- Usernames appear bold in chat, color delineation for Discord bot relays
- Check version renders the release notes with markdown formatting
Technical
- Moved to OpenSpec for development changes
- HOPE ChaCha20-Poly1305: file transfers (HTXF) are now encrypted with per-transfer AEAD keys derived via HKDF-SHA256 when the control connection uses AEAD mode.
Bugfixes
- Custom Icons show now be loading
- Opening URLs should not have any issues
Installation
Download the installer for your platform from the release assets.
.dmg = macOS, .msi/.exe = Windows, .apk = Android, .ipa = iOS/iPadOS, Linux hippies can figure it out...
v0.2.3
v0.2.3
The Hotline community now has its own search engine. Mnemosyne is an indexing service that participating Hotline servers sync their content to message board posts, news articles, and file listings. Navigator can now search across all of them before you even connect.
The app ships with vespernet.net pre-configured as the default search instance. Existing users get a one-time prompt to opt in.
New Features
Mnemosyne Search
- Search across files, news articles, and message board posts from multiple Hotline servers all without connecting first
- Ships with vespernet.net as the default search instance
- Filter results by content type with All/Board/News/Files toggles
- Index stats shown on the search screen (servers indexed, total files, posts, articles)
- Add custom Mnemosyne instances via the Connect dialog (⌘K → "Mnemosyne (Search)" type) with a connection test button
New Default Server
- Added Hotline Central Hub (server.bigredh.com) as the first default server bookmark
Improvements
- Remote user icons from hlwiki.com now load correctly (CSP fix for
img-src). This was a goof by me adding more security. - Search button in the Tracker header opens the search tab directly, hidden when no search engines are configured
- Mnemosyne instances appear in the bookmark list with a purple search icon and right-click context menu
Technical
- All Mnemosyne API requests are proxied through a Rust-side
mnemosyne_fetchTauri command usingreqwest, bypassing browser CORS restrictions - Mnemosyne bookmarks persisted in localStorage, independent of server bookmarks
- Tab system extended with
mnemosynetype — deduplication, close button, magnifying glass icon - URLs without a protocol prefix are auto-normalized to
http:// - 21 Vitest tests covering search, filters, stats, errors, and URL normalization
- README updated with full Mnemosyne documentation section
Bugfixes
- Fixed Content Security Policy blocking remote user icons from hlwiki.com, custom icons now render instead of falling back to numeric IDs
Installation
Download the installer for your platform from the release assets.
.dmg = macOS, .msi/.exe = Windows, .apk = Android, .ipa = iOS/iPadOS, Linux hippies can figure it out...
v0.2.2 - Vintage TLS + Auto Connect/Reconnect + better disconnect feedback
v0.2.2
So (Lemoniscate)[https://github.com/fuzzywalrus/lemoniscate/], my C re-write of Mobius (Hotline Server) for both PowerPC OS X and x86 macOS 10.11 and above now supports full end-to-end encryption. Unfortunately though, OS X 10.4/10.5 only supports TLS 1.0 which created a massive undertaking for both the client and server to support both.
So Navigator now supports TLS 1.0 (opt in). The rest of this is largely around connectivity. Previously, Navigator didn't display disconnected servers clearly. Now there's re-connect features in the prefs and the ability to create servers to auto connect to on lunahc
New Features
Legacy TLS Support (TLS 1.0/1.1)
- New "Allow Legacy TLS" toggle in Settings for connecting to servers that only support TLS 1.0 with older cipher suites (e.g. DHE-RSA-AES256-SHA)
- Uses vendored OpenSSL for full control over protocol versions and ciphers — macOS SecureTransport has removed these legacy cipher suites
- Modern TLS (1.2+) is always attempted first; legacy is only used as a fallback when enabled
- Covers both the main connection and file transfers
- Helpful error message when TLS fails suggesting the legacy TLS setting
Auto-Reconnect
- New "Auto-Reconnect" toggle in Settings with configurable options:
- Retry interval (1–999 minutes)
- Max retries (1–99)
- Sliding interval option that doubles the wait after each attempt (e.g. 3m → 6m → 12m, capped at 12 hours)
- Countdown timer shown in the disconnect modal with attempt counter
- "Retry Now" and "Cancel" buttons during reconnect
- Only triggers on unexpected server disconnects — manual disconnect (clicking Disconnect) does not auto-reconnect
Tracker Server Search (Experimental)
- After reconnect retries are exhausted, a "Search Trackers" button queries all configured trackers for the server name
- If the server is found at a different IP, shows results with an "Update & Connect" button to update the bookmark and reconnect
- Helps recover when a server changes its IP address
Connect on Launch
- New "Connect on launch" checkbox in the Edit Bookmark dialog
- Bookmarks with this enabled automatically connect when the app starts
- Multiple bookmarks connect in parallel without blocking each other
Native Menu Bar (macOS/Windows/Linux)
- Full native menu bar with Hotline Navigator, Edit, Window, and Help menus
- Hotline Navigator menu: About, Settings (⌘,), Hide/Show, Quit
- Edit menu: Undo, Redo, Cut, Copy, Paste, Select All
- Help menu: Hotline Navigator Wiki, GitHub, Report an Issue, README
- Settings menu item switches to the Tracker tab and opens Settings
Improvements
- Disconnected server tabs now show a red dot and greyed-out icon in the tab bar
- Connection status synced from ServerWindow to the tab store for real-time tab styling
- Protocol debug logging now emits to the frontend for TLS handshake, connection, HOPE probe, login, and version negotiation events
- All TLS paths (modern and legacy) now have 10-second timeouts to prevent hanging on unresponsive servers
- MacRoman encoding verified with new Rust unit tests (café → 0x8E, CJK → UTF-8 fallback)
Bugfixes
- TLS handshakes no longer hang indefinitely against servers that don't respond
Installation
Download the installer for your platform from the release assets.
.dmg = macOS, .msi/.exe = Windows, .apk = Android, .ipa = iOS/iPadOS, Linux hippies can figure it out...
v0.2.1 - Hope Support
v0.2.1
This release adds HOPE (Hotline One-time Password Extension) secure login support and maintains compatibility with original. This is more future tensed as more servers pop up that support HOPE.
New Features
HOPE Secure Login (Beta)
- Implements the Hotline One-time Password Extension for secure authentication
- MAC algorithm negotiation supporting HMAC-SHA1, SHA1, HMAC-MD5, MD5, and INVERSE (original obfuscation)
- Optional RC4 transport encryption on the main control connection after login
- Per-bookmark HOPE toggle — enable it in the Connect or Edit Bookmark dialogs
- Automatic fallback to legacy XOR login if the server doesn't support HOPE
- Encryption status indicator in the server header when HOPE transport is active
- Tested against Janus-family servers (see HOPE_JANUS_INTEROP.md for details)
Retro Server Compatibility
- Protocol version downgrade: handshake now tries subversion 2, then automatically reconnects and retries with subversion 1 for 1990s-era servers
- String encoding fix: outgoing text (chat, usernames, paths) is now encoded as MacRoman first, only falling back to UTF-8 for characters with no MacRoman equivalent (e.g. CJK)
- News categories now parse both
NewsCategoryListData15(field 323, v1.5+) and the olderNewsCategoryListData(field 320) format from pre-v1.5 servers - File transfers gracefully handle servers that don't send the FILP header — falls back to reading fork data directly or raw file bytes
- HOPE probe reconnect delay: 2-second pause before reconnecting after a failed HOPE probe to avoid triggering rate limits or IP bans on classic servers
Improvements
- New
hope.rsandhope_stream.rsmodules with clean separation: crypto helpers, encrypted transport wrappers, and login orchestration - Bookmark model extended with
hope: boolfield (defaults tofalsefor backward compatibility) - Build script improvements for macOS release packaging
Future
- HOPE is opt-in while we validate interop with more server implementations
- Store passwords encrypted at rest
- Custom icons from wiki
- Settings entry in the drop down menu
Installation
Download the installer for your platform from the release assets.
.dmg = macOS, .apk = Android, .ipa = iOS/iPadOS (sideload via AltStore, Sideloadly, etc.)
v0.2.0 - Chat History, Chat Time Stamps and Hotline 1.9 Full coverage
v0.2.0
This release brings the big quality of life improvement, chat history and full Hotline protocol coverage and a new structured debug logging system for developers. Every transaction type in the Hotline spec now has a corresponding client-side handler.
Note the that the chat history only exists while connected to a server. If you log off it will not "see" messages, only the last messages. Hotline Navigator is officially a "mature' client as future releases will be extended feature support / bug fixes / UX improvements.
New Features
Chat History (Encrypted at Rest)
- Chat messages are now persisted per-server using Tauri Stronghold, encrypted on your device
- Max 1000 messages per server, auto-trimmed
- Timestamps can be enabled independently of chat history in Settings
- Manage and clear history per-server or all at once from Settings
- Chat history is enabled by default but can be toggled off
Full Hotline Protocol Coverage
- Went through the complete Hotline protocol spec (hlwiki.com) and filled in every missing transaction type
- Added client support for: MakeFileAlias, DownloadFolder, UploadFolder, DownloadInfo, ServerBanner event, ListUsers, UpdateUser, UserAccess request, KeepAlive, and full account management (create/delete/get/set user)
- Switched keepalive from piggy-backing on GetUserNameList to the proper KeepAlive (500) transaction
- Private chats should work, but I haven't found a server with them
Developer Debug Mode!
- New structured logging system replaces scattered console.logs
- Categorized by: Chat, Users, Files, Transfer, News, Board, Connection, Banner, Agreement, Permissions
- Only outputs in dev mode (
import.meta.env.DEV), zero overhead in production - Every Tauri event listener now has corresponding debug output
Improvements
- Tracker connect/refresh buttons collapse below 440px for better small-screen support (targeting 320px usable)
- Added
stronghold:defaultandcore:path:defaultto Tauri capabilities for encrypted storage - Broadcasts are now persisted to chat history alongside regular messages
Bugfixes
- Download banner now shows again when the server agreement is displayed
Future
- HOPE secure login: re-enable the probe with a reconnect delay once the approach is validated with server authors
- Store passwords encrypted at rest (bcrypt) and eventually an optional password vault requiring a user-defined password at startup
- Bugfix: Help does nothing in the drop down menu
- Need to add a settings entry to the drop down menu
- Custom icons from wiki
Installation
Download the installer for your platform from the release assets.
.dmg = macOS, .msi/.exe = Windows, .apk = Android, .ipa = iOS/iPadOS, Linux hippies can figure it out...
Install and launch Hotline Navigator.
v0.1.9 - Markdown + Future specs
v0.1.9
This is now getting into future mindset as I spent a lot of going through https://github.com/fogWraith/HLServer/tree/main to add the new feature sets. This is a smaller release one one large feature for markdown, and brings Hotline Navigator to feature parity with 1.9 with the Hotline Spec. Some minor serendipity that 0.1.9 brought 1.9 features.
New Features
- Markdown is optionally support in chat/new/board and with a separate setting for Greeting as ASCII art is still used in these
- Add Hotline protocol error codes from hlwiki spec to make sure all the extended protocol is supported and consumed
- add PrivateChatTab for future prviate chat
- Frontend renders user names with server-provided color; no default red for admins unless DATA_COLOR is present
Improvements
Versions are per platform
- Now latest version isn't tied to macOS
Various
- commands/mod.rs: read_preview_file now validates paths are within allowed directories (downloads, app data, documents).
- Update checker now finds platform-specific assets (Windows .msi/.exe, Linux .deb/.appimage) instead of only macOS .dmg
- expand protocol/client/state/command updates across chat, files, users, and constants
- improve About credits layout at >=700px and clip settings modal content to rounded corners
- remove outdated planning/release markdown docs
- Disconnect Messages should be now displayed
- Get Client info now exists
- Delete File / Set File Info / Move File / Download File support from 1.9.x
Bugfixes
- Two pre-existing build errors: added missing rust-argon2 dependency to Cargo.toml for the Stronghold plugin, and added the missing tauri::Manager import in commands for app.path() calls.
Future
- HOPE secure logi: re-enable the probe with a reconnect delay once the approach is validated with server authors
- Chat persistence remains the big unsolved problem
- Need to test the 1.9.x features work: Private chats work, User Name Data color, Disconnect Messages, Get Client Info, Delete File, Get File Info, Move File, Downlaod file
- Store passwords encrypted at rest (bcrypt) and eventually an optional password vault that requires at startup a user defined password
- Bugfix: Help does nothing in the drop down menu
- Need to add a settings to drop down
Installation
Download the installer for your platform from the release assets.
Builds for other OSes coming in a few hours.
.dmg = macOS, .msi/.exe = Windows, .apk = Android, .ipa = iOS/iPadOS, Linux hippies can figure it out...
Install and launch Hotline Navigator.
