Two independent root causes were producing auth failures on the upstream SOCKS5 dial path: 1. `url::Url::username()` / `Url::password()` return percent-encoded strings per the WHATWG URL spec, but the producer side already percent-encodes the credentials when assembling the upstream URL — so the upstream was receiving `%40` instead of `@` and authentication silently failed for any credential containing `@ : / + = % ! space` or non-ASCII characters. Centralize the decode in a new `upstream_userpass` helper and route all four upstream-dial sites through it (HTTP CONNECT → SOCKS5, HTTP CONNECT → HTTP Basic-Auth, local SOCKS5 → HTTP Basic-Auth, local SOCKS5 → SOCKS5). The Shadowsocks path already decoded manually and is unchanged. 2. async_socks5 0.6 issues a `write_u8` for every single-byte field of the SOCKS5 method-selection and RFC1929 sub-negotiation. On a raw `TcpStream` each call becomes its own TCP segment, and some upstream SOCKS5 implementations treat this fragmented submission as a misbehaving client and silently FIN instead of returning a status — curl with the same credentials succeeds because it buffers each sub-message into a single send(). Wrap the upstream socket in `tokio::io::BufStream` (the usage pattern the async_socks5 README shows) and enable TCP_NODELAY so flushes leave unsegmented. Includes unit tests covering percent-decode for ASCII / special-char / non-ASCII / no-credentials / username-only inputs, plus a trace-level SOCKS5 handshake byte logger that can be enabled with RUST_LOG=donutbrowser_lib::proxy_server=trace for future debugging.
Features
- Unlimited browser profiles — each fully isolated with its own fingerprint, cookies, extensions, and data
- Anti-detect Chromium engine — powered by Wayfern, which is privacy-focused Chromium fork that comes with advanced fingerprint spoofing which naturally hides information in a way that is not detected by Cloudflare, reCaptcha v3, and other browser fingerprinting and anti-bot services.
- DNS AdBlocker - block ads, trackers, and other unwanted content with per-profile DNS blocking
- Proxy support — HTTP, HTTPS, SOCKS4, SOCKS5 per profile, with dynamic proxy URLs
- VPN support — WireGuard configs per profile
- Local API & MCP — REST API and Model Context Protocol server for integration with Claude, automation tools, and custom workflows
- Profile groups — organize profiles and apply bulk settings
- Import profiles — migrate from Chrome, Firefox, Edge, Brave, or other Chromium browsers
- Cookie & extension management — import/export cookies, manage extensions per profile
- Default browser — set Donut as your default browser and choose which profile opens each link
- Cloud sync — sync profiles, proxies, and groups across devices (self-hostable)
- E2E encryption — optional end-to-end encrypted sync with a password only you know
- Zero telemetry — no tracking or device fingerprinting
Install
macOS
| Apple Silicon | Intel | |
|---|---|---|
| DMG | Download | Download |
Or install via Homebrew:
brew install --cask donut
Windows
Download Windows Installer (x64) · Portable (x64)
Linux
| Format | x86_64 | ARM64 |
|---|---|---|
| deb | Download | Download |
| rpm | Download | Download |
| AppImage | Download | Download |
Or install via package manager:
curl -fsSL https://donutbrowser.com/install.sh | sh
Troubleshooting AppImage
If the AppImage segfaults on launch, install libfuse2 (sudo apt install libfuse2 / yay -S libfuse2 / sudo dnf install fuse-libs), or bypass FUSE entirely:
APPIMAGE_EXTRACT_AND_RUN=1 ./Donut.Browser_x.x.x_amd64.AppImage
If that gives an EGL display error, try adding WEBKIT_DISABLE_DMABUF_RENDERER=1 or GDK_BACKEND=x11 to the command above. If issues persist, the .deb / .rpm packages are a more reliable alternative.
Nix
nix run github:zhom/donutbrowser#release-start
Self-Hosting Sync
Donut Browser supports syncing profiles, proxies, and groups across devices via a self-hosted sync server. See the Self-Hosting Guide for Docker-based setup instructions.
Development
See CONTRIBUTING.md.
Community
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Star History
Contributors
|
zhom |
Hassiy |
JockLee |
yb403 |
Huy Le |
drunkod |
|
Jory Severijnse |
Thiago Mafra |
Contact
Have an urgent question or want to report a security vulnerability? Send an email to contact@donutbrowser.com.
License
This project is licensed under the AGPL-3.0 License - see the LICENSE file for details.
