DNSCrypt Proxy GUI 1.1.0
Robustness release covering everything landed since 1.0.5.
Fixed
- Tray crash no longer deactivates your proxy. If the system-tray thread failed, the app used to quit entirely - silently stopping a running proxy and reverting your DNS. It now logs the failure, switches to taskbar mode and keeps protecting you; closing the window then asks before exiting.
- Auto-reactivation race eliminated. When a resolver-list refresh completed faster than startup reactivation, a second activation attempt could spawn a second dnscrypt-proxy over the live one - leaving a proxy that the Deactivate button could not stop. Reactivation now happens exactly once per session.
- Corrupted or mirrored resolver lists can no longer break the app. Duplicate or nameless entries are dropped at both ingestion points (upstream fetch and local cache); previously a duplicate name crashed the server table with an internal error.
- Hand-edited settings are tolerated. A malformed relay mapping no longer crashes config generation, and listing the same relay twice produces one clean route instead of duplicated entries.
- Partial cache files load safely - older cache files missing newer fields no longer cause errors when populating the server list.
Hardened
- Run-at-startup registration is correct for every install type and handles paths with spaces/quotes/special characters on Windows, Linux and macOS.
- Single-instance detection is reliable; configuration restarts report "busy" instead of silently dropping changes.
- Partial DNS restores keep their backup for retry instead of falling back to a DHCP reset.
- More diagnostics in the log file for proxy-output and shutdown edge cases.
For contributors
- CI gates every PR and push: lint + tests + headless GUI smoke test on Python 3.11/3.12, with job timeouts; Dependabot tracks GitHub Actions versions.
What's Changed
- Production readiness: name dedupe, tray fallback, reactivation race by @neohiro in #16
- Ingestion tolerance: malformed relay maps, duplicate relays, partial caches by @neohiro in #17
Full Changelog: v1.0.5...v1.1.0