đŸ›Ąïž AdGuard VPN

August 2, 2026 · View on GitHub

AdGuard VPN — DankMaterialShell Plugin

đŸ›Ąïž AdGuard VPN — DankMaterialShell Plugin

Quality CI Version 1.6.0 DMS >= 1.4.0 22 locales 31 parser tests MIT License

Control, monitor, and configure AdGuard VPN directly from your DankBar — no terminal needed. Language / Idioma: English is the primary documentation language. A Portuguese (Brazil) version is provided below for the same user-facing guidance.

AdGuard VPN plugin popout — connected hero with account, quick actions, and locations list with search, favorites, and one-tap connect


✹ Features

CategoryWhat you get
Live monitoringReal-time status, account info, tunnel interface, SOCKS endpoint, and ranked locations
One-click actionsConnect / Disconnect / Fastest / Location quick-connect — Enter in the field connects too
Runtime configMode (TUN / SOCKS), Protocol (Auto / HTTP2 / QUIC), Update channel, DNS upstream
Location toolsSearch & filter, city/country quick-connect, favorites pinned on top, "show more" paging
ResilienceAuto-connect on startup, auto-reconnect with 3-step backoff, connect preflight checks
DiagnosticsLast command log, tunnel log viewer, login-required banner with copyable command
AccessibilityFull keyboard navigation (Tab + Enter/Space) with visible focus and Accessible roles
Multilingual22 fully translated languages (EN, PT-BR + 20 additional locales)
Tested parsersANSI-safe, multi-format CLI parsing covered by 31 unit tests in CI

📋 Requirements

DependencyVersion
DankMaterialShell>= 1.4.0
adguardvpn-cliAny recent version — install guide
AdGuard accountLogged in (adguardvpn-cli login)

🚀 Installation

Optional systemd-managed tunnel

By default the plugin invokes adguardvpn-cli directly, so it works without extra system services. Advanced setups can set useSystemdService: true in the plugin settings and provide /usr/local/sbin/adguardvpn-dms-control; in that mode connect and disconnect actions delegate the persistent tunnel to a root systemd service rather than leaving it in the DMS cgroup. Keep this opt-in unless the matching service and control wrapper have been installed.

A reference implementation ships in scripts/adguardvpn-dms-control:

sudo install -m 755 -o root -g root \
  scripts/adguardvpn-dms-control /usr/local/sbin/adguardvpn-dms-control

Then grant the desktop user a NOPASSWD sudoers rule for that exact path — the plugin always calls it through sudo -n, so an interactive prompt makes the action fail silently.

Write your own helper? Make connect-fastest and connect-location idempotent. systemctl restart tears the tunnel down for a few seconds: NetworkManager flags the interface as unmanaged, systemd-resolved swaps DNS servers, and every in-flight connection dies with it — downloads, SSH, long HTTP sessions. A helper that restarts unconditionally turns a no-op click ("connect to the location I'm already on") into a real network outage. The reference implementation exits 0 without restarting when the unit is already active and /var/lib/adguardvpn-dms/location already matches the requested target; --force restores the unconditional behaviour for deliberately re-picking a server.

1. Clone into DMS plugins directory

git clone https://github.com/bernardopg/dms-adguard-vpn-plugin.git \
  ~/.config/DankMaterialShell/plugins/adguardVPplugin

2. Reload & enable

dms ipc plugins reload adguardVPplugin
dms ipc plugins enable adguardVPplugin

3. Add to DankBar

Open DMS Settings → Widgets and add AdGuard VPN to your bar.


⚙ Settings

All settings are configurable through the DMS plugin settings screen.

SettingTypeDefaultDescription
adguardBinarystringadguardvpn-cliCLI binary name or absolute path
refreshIntervalSecint8Status polling interval (3–120 s)
locationsCountint20How many locations to fetch (5–100)
connectStrategyenumfastestDefault connect behavior: fastest or location
defaultLocationstring—Preferred location (city, country, or ISO code)
ipStackenumautoForce ipv4 or ipv6 on connect
autoRefreshLocationsbooltruePeriodically refresh ranked server list
autoConnectOnStartupboolfalseAuto-connect when plugin / session starts
autoReconnectOnDropboolfalseAuto-reconnect when the tunnel drops unexpectedly
showLocationInBarbooltrueDisplay connection text next to bar icon
bypassMultiRouteCheckboolfalseSkip the pre-connect multi-default-route check (Settings → Advanced) if it false-positives on your setup
useSystemdServiceboolfalseDelegate connect/disconnect to the optional, separately installed adguardvpn-dms-control systemd helper
languageOverrideenumautoUI language: auto, en_US, pt_BR, es_ES, zh_CN, hi_IN, ar, bn_BD, fr_FR, de_DE, ja_JP, ru_RU, ko_KR, id_ID, tr_TR, vi_VN, it_IT, pl_PL, nl_NL, fa_IR, th_TH, ur_PK, ms_MY

đŸ—ïž Project Structure

adguardVPplugin/
├── plugin.json                 # Manifest & permissions
├── qmldir                      # QML singleton registration
├── AdGuardVpnWidget.qml        # Bar pill + popout UI
├── AdGuardVpnSettings.qml      # DMS settings screen
├── AdGuardVpnService.qml       # Singleton: polling, actions, state
├── AdGuardVpnParsers.js        # CLI output parsers (status, config, license, locations)
├── AdGuardVpnI18n.qml          # Localization singleton
├── i18n/
│   ├── en.js                   # English (fallback)
│   ├── pt_BR.js                # PortuguĂȘs (Brasil)
│   ├── es_ES.js                # Espanol
│   ├── zh_CN.js                # Chinese (Simplified)
│   ├── hi_IN.js                # Hindi
│   ├── ar.js                   # Arabic
│   ├── bn_BD.js                # Bengali
│   ├── fr_FR.js                # French
│   ├── de_DE.js                # German
│   ├── ja_JP.js                # Japanese
│   ├── ru_RU.js                # Russian
│   ├── ko_KR.js                # Korean
│   ├── id_ID.js                # Indonesian
│   ├── tr_TR.js                # Turkish
│   ├── vi_VN.js                # Vietnamese
│   ├── it_IT.js                # Italian
│   ├── pl_PL.js                # Polish
│   ├── nl_NL.js                # Dutch
│   ├── fa_IR.js                # Persian
│   ├── th_TH.js                # Thai
│   ├── ur_PK.js                # Urdu
│   ├── ms_MY.js                # Malay
│   └── README.md               # Translation guide
├── scripts/
│   ├── check-i18n-keys.mjs     # i18n key parity checker
│   ├── test-parsers.mjs        # Parser unit tests (status/license/config/locations)
│   ├── lint-markdown.sh        # Markdown linter
│   └── validate-qml.sh         # QML syntax validator
├── docs/
│   ├── ARCHITECTURE.md         # Component design & data flow
│   ├── COMMANDS.md             # CLI command mapping
│   ├── RELEASE_CHECKLIST.md    # Release process
│   └── releases/               # Per-version release notes
├── CHANGELOG.md
├── CONTRIBUTING.md
└── LICENSE                     # MIT

For detailed architecture and data flow, see docs/ARCHITECTURE.md. For the CLI command map, see docs/COMMANDS.md.


🔒 Security & Permissions

The plugin only executes local CLI commands through the DMS process API. No credentials are stored — secrets live in adguardvpn-cli's own config. Network traffic is entirely managed by the CLI itself.

PermissionPurpose
settings_readLoad plugin settings
settings_writePersist plugin settings
processExecute adguardvpn-cli commands

🔍 Troubleshooting

adguardvpn-cli unavailable

Verify the binary is accessible:

adguardvpn-cli --version

If using a custom path, update it in plugin settings (adguardBinary).

Auth / session issues

Authenticate interactively, then refresh in the widget:

adguardvpn-cli login
Location connect errors (city / country / ISO not found)
  • Hit Refresh in the widget to update the location list.
  • Prefer the visible city, country label from the list, or an ISO code when you want the CLI to choose within a country.
  • If a saved preferred location is stale, update it in settings.
Plugin not loading
dms ipc plugins status  adguardVPplugin
dms ipc plugins reload  adguardVPplugin

đŸ’» Development

Follow the DMS plugin development guide.

Recommended loop:

# edit code

dms ipc plugins reload adguardVPplugin

Quality checks before committing:

node scripts/check-i18n-keys.mjs   # i18n key parity
node scripts/test-parsers.mjs      # parser unit tests
bash scripts/lint-markdown.sh       # markdown lint
bash scripts/validate-qml.sh       # QML syntax

🌐 Localization

This plugin is now officially multilang and ships with:

  • Full locales: English, PortuguĂȘs (Brasil)
  • Full locales (previously extended with English fallback): Español, äž­æ–‡ (çź€äœ“), à€čà€żà€šà„à€Šà„€, Ű§Ù„ŰčŰ±ŰšÙŠŰ©, àŠŹàŠŸàŠ‚àŠČàŠŸ, Français, Deutsch, æ—„æœŹèȘž, РуссĐșĐžĐč, 한ꔭ얎, Indonesia, TĂŒrkçe, Tiáșżng Việt, Italiano, Polski, Nederlands, ÙŰ§Ű±ŰłÛŒ, àč„àž—àžą, Ű§Ű±ŰŻÙˆ, Bahasa Melayu

Every shipped locale is now fully translated (all 179 message keys). Untranslated strings, if any are added later, fall back to English.

Adding or extending locales is straightforward — see i18n/README.md.


đŸ€ Contributing

See CONTRIBUTING.md for workflow, quality checks, and release process.


📩 Publishing

Follow the Release Checklist, then:

git tag vX.Y.Z
git push origin main --tags

Submit to the DMS Plugin Registry.


📄 License

MIT — Bernardo Gomes


PortuguĂȘs (Brasil)

Controle, monitore e configure o AdGuard VPN diretamente pela DankBar — sem precisar abrir o terminal.

Recursos

CategoriaO que vocĂȘ recebe
Monitoramento ao vivoStatus, conta, interface do tĂșnel, endpoint SOCKS e localizaçÔes ranqueadas em tempo real
AçÔes em um cliqueConectar / Desconectar / Mais rĂĄpida / Conectar por localização — Enter no campo tambĂ©m conecta
Configuração em runtimeModo (TUN / SOCKS), Protocolo (Auto / HTTP2 / QUIC), canal de atualização e DNS upstream
Ferramentas de localizaçãoBusca, filtro, favoritos fixados no topo e paginação "mostrar mais"
ResiliĂȘnciaAuto-conectar ao iniciar, auto-reconectar com backoff em 3 etapas e preflight de conexĂŁo
DiagnĂłsticoÚltimo comando, visualizador do log do tĂșnel e banner de login com comando copiĂĄvel
AcessibilidadeNavegação completa por teclado (Tab + Enter/Espaço) com foco visível e roles Accessible
MultilĂ­ngue22 idiomas totalmente traduzidos (EN, PT-BR + 20 locales adicionais)
Parsers testadosRemoção de ANSI e parsing multi-formato cobertos por 31 testes unitårios no CI

Requisitos

DependĂȘnciaVersĂŁo
DankMaterialShell>= 1.4.0
adguardvpn-cliQualquer versão recente; veja o guia oficial de instalação
Conta AdGuardSessĂŁo iniciada com adguardvpn-cli login

Instalação

git clone https://github.com/bernardopg/dms-adguard-vpn-plugin.git \
  ~/.config/DankMaterialShell/plugins/adguardVPplugin

dms ipc plugins reload adguardVPplugin
dms ipc plugins enable adguardVPplugin

Depois, abra DMS Settings → Widgets e adicione AdGuard VPN à barra.

TĂșnel gerenciado por systemd (opcional)

Por padrĂŁo o plugin chama o adguardvpn-cli direto e funciona sem nenhum serviço extra. ConfiguraçÔes avançadas podem ativar useSystemdService: true e fornecer /usr/local/sbin/adguardvpn-dms-control; nesse modo, conectar e desconectar delegam o tĂșnel persistente a um serviço systemd de root em vez de deixĂĄ-lo no cgroup do DMS. HĂĄ uma implementação de referĂȘncia em scripts/adguardvpn-dms-control:

sudo install -m 755 -o root -g root \
  scripts/adguardvpn-dms-control /usr/local/sbin/adguardvpn-dms-control

Depois conceda ao usuĂĄrio do desktop uma regra NOPASSWD no sudoers para esse caminho exato — o plugin sempre chama por sudo -n, entĂŁo um prompt interativo faz a ação falhar em silĂȘncio.

Vai escrever seu prĂłprio helper? Faça connect-fastest e connect-location serem idempotentes. O systemctl restart derruba o tĂșnel por alguns segundos: o NetworkManager marca a interface como unmanaged, o systemd-resolved troca de servidor DNS e toda conexĂŁo em curso morre junto — downloads, SSH, sessĂ”es HTTP longas. Um helper que reinicia incondicionalmente transforma um clique que nĂŁo muda nada ("conectar na localização em que jĂĄ estou") numa queda de rede real. A implementação de referĂȘncia sai com 0 sem reiniciar quando a unit jĂĄ estĂĄ ativa e /var/lib/adguardvpn-dms/location jĂĄ corresponde ao destino pedido; --force restaura o comportamento incondicional para reescolher servidor de propĂłsito.

ConfiguraçÔes

Todas as configuraçÔes ficam na tela de settings do plugin no DMS.

ConfiguraçãoTipoPadrãoDescrição
adguardBinarystringadguardvpn-cliNome do binĂĄrio ou caminho absoluto do CLI
refreshIntervalSecint8Intervalo de polling de status (3–120 s)
locationsCountint20Quantidade de localizaçÔes carregadas (5–100)
connectStrategyenumfastestEstratégia padrão: fastest ou location
defaultLocationstring—Localização preferida: cidade, país ou ISO
ipStackenumautoForçar IPv4 ou IPv6 nas conexÔes
autoRefreshLocationsbooltrueAtualizar lista de localizaçÔes periodicamente
autoConnectOnStartupboolfalseConectar automaticamente ao iniciar plugin/sessĂŁo
autoReconnectOnDropboolfalseReconectar se o tĂșnel cair inesperadamente
showLocationInBarbooltrueMostrar texto/localização ao lado do ícone
bypassMultiRouteCheckboolfalsePular a checagem de mĂșltiplas rotas padrĂŁo antes de conectar (ConfiguraçÔes → Avançado) em setups com falso positivo
useSystemdServiceboolfalseDelegar conexĂŁo/desconexĂŁo ao helper systemd opcional adguardvpn-dms-control, instalado separadamente
languageOverrideenumautoIdioma da UI; auto segue o locale do sistema

Segurança e permissÔes

O plugin executa apenas comandos locais pelo processo do DMS. Credenciais nĂŁo sĂŁo armazenadas pelo plugin; elas ficam no prĂłprio adguardvpn-cli.

PermissĂŁoFinalidade
settings_readLer configuraçÔes do plugin
settings_writePersistir configuraçÔes do plugin
processExecutar comandos locais do adguardvpn-cli

Solução de problemas

Se o CLI aparecer como indisponĂ­vel, verifique:

adguardvpn-cli --version

Se usa caminho customizado, atualize adguardBinary nas configuraçÔes. Para problemas de sessão, rode adguardvpn-cli login. Para erros de localização, atualize a lista no widget e prefira o rótulo visível cidade, país; use ISO quando quiser deixar o CLI escolher dentro do país.

Desenvolvimento

Loop recomendado:

dms ipc plugins reload adguardVPplugin

Checks antes de commitar:

node scripts/check-i18n-keys.mjs
node scripts/test-parsers.mjs
bash scripts/lint-markdown.sh
bash scripts/validate-qml.sh

Licença

MIT — Bernardo Gomes