v3.6.0 — Dangerous Donkey
Settings reorganized — 7 tabs
The settings window has been restructured around clear domains: General → Tunnels → WiFi → Appearance → History → Advanced → About.
| Tab | Now contains |
|---|---|
| General | Language, app mode, Start with Windows, confirm disconnect on exit |
| Tunnels (was Tunnel Groups) | Group management, auto-reconnect mode, kill switch mode, config validation, display options (tunnel count, empty groups, DNS indicator) |
| WiFi (merges WiFi Rules + Default Action) | SSID rules, disable-rules toggle, default action, open network protection, rules display options |
| Appearance | Theme, font, notifications, show activity log |
| Advanced | Maintenance only: import/export, log level, installation, WireGuard client, orphaned services |
The WiFi tab reads top-to-bottom in the same order the app evaluates a network change: rules first, then the default action when no rule matches, plus open network protection.
Companion tunnels — WireGuard app awareness
Tunnels connected or disconnected outside MasselGUARD (WireGuard for Windows app, CLI) are now fully tracked:
- Activity log — external transitions are logged:
Connected: <name> via WireGuard app/Disconnected: <name> via WireGuard app. - History & timeline — externally started sessions appear in the connection history and activity timeline (source: WireGuard app); externally dropped sessions are closed properly instead of staying open forever.
- Deactivating a tunnel in the WireGuard app is recognised as deliberate — MasselGUARD logs it and skips auto-reconnect instead of fighting the WireGuard app over the tunnel. A genuine service crash still reconnects.
Unified dual-variant theme system
The theme architecture has been completely redesigned. Instead of maintaining separate dark and light theme files, every theme is now a single file that contains both colour variants.
New theme format
{
"name": "My Theme",
"fontFamily": "Segoe UI",
"cornerRadius": 6,
"dark": {
"colorWindowBg": "#0E1117",
"colorAccent": "#58A6FF"
},
"light": {
"colorWindowBg": "#F6F8FA",
"colorAccent": "#0969DA"
}
}- Root level holds structural settings only — font, corner radius, window chrome, status bar, background image, logo.
"dark"and"light"sections hold the colour fields for each mode.- Either section can be omitted. The app auto-generates the missing side at load time using HSL lightness inversion — nothing is written to disk.
- Any colour field omitted from a section falls back to the Windows system palette for that slot.
What this means for users
- Theme selection is now a single picker — choose one theme, the app applies the dark or light colours based on Settings → Appearance → System mode (Light / Dark / Auto).
- Custom themes survive a mode switch automatically.
- Built-in themes: Grey and High Contrast — plus System (Windows colors), which uses the Windows accent palette and is the default.
- Custom themes can also live in
%APPDATA%\MasselGUARD\themes\so they survive app updates.
Colour auto-generation
When only one variant is defined, the other is derived at load time:
| Neutral colours (saturation < 15 %) | Straight invert — L → 1 − L in HSL |
|---|---|
| Chromatic colours (accents, status, danger) | Invert L then clamp to 0.30 – 0.75 |
| Background fields | Invert L then clamp to 0.06 – 0.94 |
Settings — Appearance tab redesigned
- Single theme picker replaces the separate dark/light ComboBoxes and the "Use custom theme" toggle.
- System mode pill (Light / Dark / Auto) stays, now controls which colour variant of the selected theme is shown.
- System (Windows colors) is included in the picker as a first-class option — no separate toggle needed.
- ▶ Dark / ▶ Light preview buttons — try either colour variant of the selected theme for 10 seconds before saving.
Tunnel connect — reliability improvements
Pre-flight config validation
Config files are now validated before the WireGuard service is created. Catches common mistakes that would cause a silent exit:
| Field | Check |
|---|---|
PrivateKey / PublicKey / PresharedKey |
44-character base64 (32-byte key) |
Address / AllowedIPs |
Valid CIDRs; IPv6 group count with fix suggestion |
DNS |
Valid IP addresses |
MTU |
576 – 9000 |
ListenPort / PersistentKeepalive |
1 – 65535 |
Endpoint |
host:port format |
| Required fields | PrivateKey, Address, PublicKey, Endpoint |
Example fix suggestion: fd00:dead:beef:4/64 → "4 of 8 groups. Did you mean: fd00:dead:beef::4/64?"
Skip-validation options
- Per-tunnel — "⚠ Skip config validation" toggle in the tunnel Edit and Add dialogs.
- Global override — Settings → Tunnels → Config validation section.
False-positive connect detection fixed
Previously, a failed tunnel start and a successful one both left the service in Stopped state, making them indistinguishable. After detecting Stopped, the app now waits 300 ms and probes the WireGuard management pipe (\\.\pipe\WireGuard\<name>) and the network adapter. If neither is found the failure is logged clearly with a pointer to the Windows Event Log.
Orphaned service cleanup
When a tunnel fails to start, the WireGuardTunnel$<name> SCM entry is now always cleaned up before throwing, preventing orphaned service entries.
Config source priority fixed
stored.Path (the .conf.dpapi file) is now checked before the legacy inline stored.Config blob. Prevents a stale inline blob from being used when a valid file exists alongside it. Priority order:
stored.Path→.conf.dpapifile (DPAPI decrypt)stored.Path→ plain.conffilestored.Config→ legacy inline DPAPI blobstored.Config→ raw plaintext (very old builds)
BOM handling
- Temp conf files are written without BOM (
UTF-8 NoBOM). StripBom()helper is applied to all decrypted content before writing.- Prevents tunnel.dll (Go) from failing to parse a config that starts with a UTF-8 BOM byte sequence.
Diagnostic conf log
After writing the temp conf, a debug line is logged:
[DBG] Conf written: 456 bytes, BOM=False, first line=[Interface]
Auto-reconnect
- Tunnels that drop unexpectedly (sleep/wake, network blip, service crash) are automatically reconnected.
- 3 retry attempts with increasing backoff: 5 s, 10 s, 15 s. Gives up cleanly after the third failure.
- Only fires on unexpected drops — intentional disconnects (user click, WiFi rule, CLI) and clean deactivations via the WireGuard app are never retried.
- Global mode in Settings → Tunnels:
- Off — disabled globally.
- Per tunnel — each tunnel has its own toggle in the Edit dialog.
- Always — every tunnel reconnects regardless of the per-tunnel toggle (default).
- When mode is Off, the per-tunnel toggle is hidden in the Edit dialog.
- When mode is Always, the toggle shows as disabled with (controlled globally).
- Activity log entries: dropped → reconnecting (attempt N/3) → reconnected ✓ or giving up.
- Each attempt waits for the connect to actually finish before reporting success or failure.
Setup wizard expanded
The wizard now covers the most important behaviour settings, so a fresh install is fully configured in one pass:
- Auto-reconnect mode (Off / Per tunnel / Always)
- DNS leak indicator and tray notifications
- Start with Windows and confirm disconnect on exit
- History capture (connections / WiFi)
- The WiFi step explains how rules work — WiFi rules, default action, and open network protection, with a typical-use example — since rules themselves are created after the wizard, once tunnels exist
- A summary page at the end shows every chosen setting before finishing.
Language picker — country flags
The language selector (Settings → General and the wizard) now shows a country flag next to each language name. Flags are 20×15 PNG files in lang\flags\, referenced by a _flag key in each language file — include one when adding your own language.
What's New — rendered Markdown
The What's New panel on the About tab now renders the release notes as formatted Markdown (headings, tables, bold) instead of plain text. Notes are fetched live from GitHub; when offline, a fallback panel links to the project pages.
Updated dependencies
tunnel.dllrebuilt from wireguard-windows source (v1.1).wireguard.dllupdated to wireguard-NT v1.1.- DLL validation at connect time checks file size to distinguish wireguard-NT from the WireGuard-for-Windows stub.
install-dotnet.bathelper included — checks for the .NET 10 Desktop Runtime and offers to install it when missing.
Directory ACL hardening
%APPDATA%\MasselGUARD\is now restricted to the current user only on first write.- Removes the default Administrators read-access inherited from
%APPDATA%. - Applies retroactively to existing installations on the first Settings save after updating.
- Inheritable —
tunnels\subfolder and all history/config files inside are covered automatically.