# NextDNS Linux Trayicon This small Python script and .desktop file add a quick toggle to the desktop environment's system tray. ![NextDNS Tray demo](nextdns_tray_demo.png "NextDNS Tray demo") ## Prerequisites 1. **NextDNS CLI**: The script controls the nextdns service. If you haven't installed it yet: ```bash sh -c 'curl -sL https://nextdns.io/install | sh' ``` 1. **Python 3 & PyQt6**: The interface is built using Python 3 and the Qt6 toolkit. (This is installed by default on (K)ubuntu.) ```bash sudo apt update sudo apt install python3 python3-pyqt6 ``` 1. **Polkit Agent**: The script uses pkexec to handle start/stop commands safely. Most desktop environments (KDE, GNOME, XFCE) come with this pre-installed. ## Installation Preferred (single command): ```bash ./install.sh ``` Enable autostart during install: ```bash ./install.sh --autostart ``` ## Uninstall ```bash ./uninstall.sh ``` Preview what would be removed: ```bash ./uninstall.sh --dry-run ``` 1. **Copy the files to your home directory:** ```bash # Create directories if they don't exist mkdir -p ~/.local/bin ~/.local/share/applications ~/.local/share/icons # Copy the specific files cp home/.local/bin/nextdns-tray ~/.local/bin/ cp home/.local/share/applications/nextdns-tray.desktop ~/.local/share/applications/ cp home/.local/share/icons/nextdns.png ~/.local/share/icons/ ``` 1. **Make the script executable** ```bash chmod +x ~/.local/bin/nextdns-tray ``` The bundled `nextdns-tray.desktop` launcher runs `nextdns-tray` directly (via `PATH`) so it is not tied to any repository location. If your desktop session does not include `~/.local/bin` in `PATH`, use an absolute path in `~/.local/share/applications/nextdns-tray.desktop`. 1. **(Optional) Add to Autostart**: If you want the tray to start automatically when you log in: ```bash mkdir -p ~/.config/autostart cp ~/.local/share/applications/nextdns-tray.desktop ~/.config/autostart/ ``` ### Manual Installation (equivalent) ```bash sh -c 'curl -sL https://nextdns.io/install | sh' sudo apt update sudo apt install python3 python3-pyqt6 ``` ```bash mkdir -p ~/.local/bin ~/.local/share/applications ~/.local/share/icons cp home/.local/bin/nextdns-tray ~/.local/bin/ cp home/.local/share/applications/nextdns-tray.desktop ~/.local/share/applications/ cp home/.local/share/icons/nextdns.png ~/.local/share/icons/ chmod +x ~/.local/bin/nextdns-tray mkdir -p ~/.config/autostart cp ~/.local/share/applications/nextdns-tray.desktop ~/.config/autostart/ ``` ## Status Detection The tray distinguishes between service state and real DNS usage. - `Stopped`: NextDNS service is not running. - `Running / Not In Use`: service is running, but resolver settings do not point to NextDNS. - `Running / Usage Unknown`: service is running and resolver looks correct, but live verification is temporarily unavailable. - `Running / In Use`: service is running and usage is verified. Verification model: - Fast local checks run on each refresh cycle. - End-to-end validation uses `https://test.nextdns.io` and is cached for 30 seconds. - A start/restart action forces an immediate end-to-end re-check. Notes: - This validates host DNS routing; application-specific DoH settings may bypass host resolver behavior. - `curl` is used for the end-to-end check. If unavailable, status may appear as `Usage Unknown`.