This release focuses on feature requests that have been hanging around for a long time, addressing a few important platform-specific shortcomings. There is also a nice bunch of smaller quality-of-life improvements and bug fixes.
SOCKS5 proxy
SOCKS5 proxy support has been on the list of requested features for five years now, so continuing to ignore it was getting a bit awkward. In the end, implementing SOCKS5 proxying was not that difficult. It mainly affects the opening of network connections and how domain name resolution is handled.
SOCKS5 can be useful in a couple of ways. One prominent use case is routing traffic through Tor for anonymity. Another common use is tunneling through an SSH SOCKS proxy, which is a handy way to work around network restrictions or to browse as if you were on a different machine. For example, opening an SSH proxy on port 1080 is as easy as:
ssh -D 1080 -N user@example.com
The proxy settings can be found in Preferences > Network. Once configured, all network connections go through the proxy.
Native audio playback on Android
The Android port has been lagging behind iOS when it comes to audio playback. For this release, I've implemented new native audio decoding that works even better than the iOS version: the audio data is fed to a native Android MediaPlayer via a streaming buffer so it can take advantage of hardware acceleration and can continue playing even when the app is in the background. This is more efficient than the previous versions and supports a larger number of codecs.
I wrote more about the new audio code in another post:
The audio improvements were not confined solely to Android. Several behavioral glitches were addressed when it comes to the inline audio players for all platforms. For example, the player would not automatically stop itself when reaching the end of the content, nor would it release its decoder resources if the user navigated back in history.
Gamepad controls and handheld UI variant
My December/Christmas project last year was porting Lagrange to the Powkiddy RGB30. It is a small handheld game console that runs Linux, so technically the port was mostly about cross-compiling. I did end up implementing a couple of handheld-specific features, most prominently a virtual keyboard one can operate via the gamepad.
Gamepad controls are now available on all platforms thanks to SDL. Alas, they don't play nice with the native UI controls, so when using the gamepad, the build should have all native UI integration disabled. Hence, I'm still designating gamepad support as "experimental".
Windows dark mode
Another old entrant on the feature requests list is support for the system dark mode on Windows. This is now fully implemented: the app checks the system dark mode setting at launch and observes whether it changes at runtime. The only thing you need to do is check if the new toggle "Use system theme" is enabled in Preferences > Appearance.
At least on Windows, it is a common mouse gesture to scroll content by holding the middle button and moving the mouse up or down. This has been implemented application-wide, so any scrollable content can be scrolled with a middle button drag.
The feature is available on all platforms.
Input prompt at bottom
The input prompt dialog can now be moved to the bottom of the window. This can be useful if the dialog would obscure important page content at the top. The position can be toggled via the […] menu, or set as a default in Preferences > Appearance.
Error and warning messages displayed inline on a page are not selectable text, which has made it awkward to copy them, for example when reporting a problem. These special messages now have a context menu that includes an action to copy the text to the clipboard. You can also right-click on input prompts to copy them, too.
Other changes and fixes
- Plain text lines wrap to the maximum available width when the "expand to long lines" option is enabled. Gopher pages in particular are often plain text, so no they can be displayed without unnecessary wrapping if the window has enough room.
- For those on networks where both IPv4 and IPv6 are available, there is now an option to prefer IPv6 in DNS resolution. (This option has no effect if SOCKS5 is enabled.)
- Improved warning message when there is a problem with the proxy server certificate.
- Opening a link context menu via keyboard now correctly remembers which link was highlighted by keyboard navigation.
- Gopher: fixed misdetected menu styling, particularly with non-ASCII characters.
- Crash in the simple text renderer (TUI) when encountering a Backspace character.
- OpenSSL error messages are no longer printed to stderr.
📅 2026-03-18
🏷 Lagrange
CC-BY-SA 4.0