1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-05-15 00:32:47 -04:00

feat(tailscale): add Tailscale control center widget (#1875)

* feat(tailscale): add Tailscale control center widget

Full-stack Tailscale integration for DMS control center:

Backend (Go):
- Event-driven manager via WatchIPNBus (no polling)
- Reconnects with exponential backoff when tailscaled unavailable
- Typed conversion from ipnstate.Status to QML-friendly IPC types
- Testable via tailscaleClient interface with mock watcher
- Manager cleanup in cleanupManagers()
- 19 unit tests

Frontend (QML):
- TailscaleService with WebSocket subscription
- TailscaleWidget with peer list, filter chips, search
- Copy-to-clipboard for IPs and DNS names
- Daemon lifecycle handling (offline/stopped states)

Dependencies:
- Add tailscale.com v1.96.1 (official local API client)
- Bump Go to 1.26.1 (required by tailscale.com)

* cleanups

---------

Co-authored-by: bbedward <bbedward@gmail.com>
This commit is contained in:
Giorgio De Trane
2026-05-04 19:37:25 +02:00
committed by GitHub
parent 408beb202c
commit d223a74740
19 changed files with 2055 additions and 11 deletions
+119
View File
@@ -17225,5 +17225,124 @@
"context": "Keyboard hints when enter-to-paste is enabled",
"reference": "",
"comment": ""
},
{
"term": "Tailscale",
"translation": "",
"context": "Tailscale mesh VPN widget title",
"reference": "",
"comment": ""
},
{
"term": "Tailscale Network",
"translation": "",
"context": "Tailscale control center widget description",
"reference": "",
"comment": ""
},
{
"term": "Tailscale not available",
"translation": "",
"context": "Warning when Tailscale service is not running",
"reference": "",
"comment": ""
},
{
"term": "%1 online",
"translation": "",
"context": "Number of online Tailscale peers",
"reference": "",
"comment": ""
},
{
"term": "Search devices...",
"translation": "",
"context": "Tailscale device search placeholder",
"reference": "",
"comment": ""
},
{
"term": "This device",
"translation": "",
"context": "Label for the user's own device in Tailscale",
"reference": "",
"comment": ""
},
{
"term": "Network: %1",
"translation": "",
"context": "Tailscale network name",
"reference": "",
"comment": ""
},
{
"term": "Version: %1",
"translation": "",
"context": "Tailscale version",
"reference": "",
"comment": ""
},
{
"term": "No matching devices",
"translation": "",
"context": "No Tailscale devices match search",
"reference": "",
"comment": ""
},
{
"term": "No peers found",
"translation": "",
"context": "No Tailscale peers found",
"reference": "",
"comment": ""
},
{
"term": "relay: %1",
"translation": "",
"context": "Tailscale relay server name",
"reference": "",
"comment": ""
},
{
"term": "direct",
"translation": "",
"context": "Tailscale direct connection",
"reference": "",
"comment": ""
},
{
"term": "last seen %1",
"translation": "",
"context": "Tailscale peer last seen time",
"reference": "",
"comment": ""
},
{
"term": "Tags: %1",
"translation": "",
"context": "Tailscale device tags",
"reference": "",
"comment": ""
},
{
"term": "Owner: %1",
"translation": "",
"context": "Tailscale device owner",
"reference": "",
"comment": ""
},
{
"term": "Show my online devices",
"translation": "",
"context": "Toggle to show only online devices owned by the user",
"reference": "",
"comment": ""
},
{
"term": "Show all devices (%1)",
"translation": "",
"context": "Toggle to show all Tailscale devices",
"reference": "",
"comment": ""
}
]