Add Tailscale to GNOME quick settings. Fork of joaophi/tailscale-gnome-qs with continued maintenance and improvements. Features: • Quick Toggle — Enable/disable Tailscale directly from the Quick Settings panel • Copy Node IP - Long-click a node to copy that node's ip address to the clipboard • Exit Nodes — Select and disconnect exit nodes, including Mullvad support with country flag display • Multi-Account — Switch between multiple Tailscale accounts (profiles) •Status Indicator — Visual indication of your Tailscale connection status NOTE: This extension accesses the clipboard to copy the node ip address. NOTE: Make sure you set your user as tailscale operator: `sudo tailscale set --operator=$USER`
Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.
EGO-A-005 manual_review
extensions should not access the clipboard directly
Direct clipboard access via `St.Clipboard.get_default()` requires reviewer scrutiny.
extension.js:333
St.Clipboard.get_default()
extension.js:334
St.Clipboard.get_default()
EGO-L-003 warning
signals connected by extension should be disconnected in disable()
Signals assigned in `enable()` are missing matching disconnect calls in `disable()` or its helper methods.
extension.js:79
this._RunningNotifier = tailscale.connect('notify::running', () => setVisible())
extension.js:78
this._exitNodeNotifier = tailscale.connect('notify::exit-node', () => setVisible())
extension.js:127
action.connect('notify::pressed', () => {
if (action.pressed)
this.add_style_pseudo_class('active');
else
this.remove_style_pseudo_class('active');
})
extension.js:299
this._notifyExitNodeName = tailscale.connect('notify::exit-node-name', () => {
this.subtitle = tailscale.exit_node_name;
this.menu.setHeader(icon, this.title, this.subtitle);
disableExitNodeButton.reactive = tailscale.exit_node !== '';
})
extension.js:362
this._notifyNodes = tailscale.connect('notify::nodes', obj => updateNodes(obj))
extension.js:444
this._notifyProfiles = tailscale.connect('notify::profiles', obj => updateProfiles(obj))
extension.js:388
tailscale.connect('notify::accept-dns', obj => dns.setToggleState(obj.accept_dns))
extension.js:377
tailscale.connect('notify::accept-routes', obj => routes.setToggleState(obj.accept_routes))
extension.js:399
tailscale.connect('notify::allow-lan-access', obj => lan.setToggleState(obj.allow_lan_access))
extension.js:421
tailscale.connect('notify::ssh', obj => ssh.setToggleState(obj.ssh))
extension.js:410
tailscale.connect('notify::shields-up', obj => shields.setToggleState(obj.shields_up))
EGO-L-008 warning
Soup.Session instances should be aborted during cleanup
Soup.Session instances should be aborted during cleanup.
tailscale.js:11
this.session = new Soup.Session({
'remote-connectable': address,
'timeout': 0,
'idle-timeout': 0,
})
| Version | Status |
|---|---|
| v7 (10) | Rejected |
| v6 (9) | Active |
| v6 (8) | Rejected |
| v6 (7) | Rejected |
| v6 (6) | Rejected |
| 5 | Active |
| 4 | Inactive |
| 3 | Inactive |
| 2 | Rejected |
| 1 | Rejected |
1. Please use `connectObject()` and `disconnectObject()` so it is easier to track for cleanup. 2. Timeout should be removed on destroy and before creating a new one (line 157 `extension.js`): [EGO Review Guidelines: Timeout](https://gjs.guide/extensions/review-guidelines/review-guidelines.html#remove-main-loop-sources) 3. Remove version from the import (line 4 `tailscale.js`). 4. Also fix all of the Shexli's EGO-L-003. When you connect, you should disconnect (`disconnectObject`). Not source remove: [EGO Review Guidelines: Disconnect all signals](https://gjs.guide/extensions/review-guidelines/review-guidelines.html#disconnect-all-signals)