Back to Skills
    šŸ¦ž

    adguard

    Control AdGuard Home DNS filtering via HTTP API.

    By @rowbotik
    View on GitHub
    SKILL.md
    ---
    name: adguard
    description: Control AdGuard Home DNS filtering via HTTP API. Use when managing blocklists/allowlists, checking domain filtering status, toggling protection, or clearing DNS cache. Supports blocking/allowing domains, viewing statistics, and protecting/disabling DNS filtering.
    ---
    
    # AdGuard Home Controller
    
    Manage AdGuard Home DNS filtering from the command line via the REST API.
    
    ## Requirements
    
    - AdGuard Home running with web interface
    - Admin username and password
    - `curl` installed (usually default on macOS/Linux)
    
    ## Quick Start
    
    ```bash
    # Set password once
    export ADGUARD_PASSWORD=your_admin_password
    
    # Use commands
    ./adguard.sh status
    ./adguard.sh check example.com
    ./adguard.sh allow broken-site.com
    ./adguard.sh block malware.ru
    ```
    
    ## Configuration
    
    Set environment variables for your AdGuard instance:
    
    ```bash
    export ADGUARD_URL="http://192.168.1.100:3000"      # Your AdGuard IP and port
    export ADGUARD_USERNAME="admin"                     # Usually 'admin' (default)
    export ADGUARD_PASSWORD="your_admin_password"       # REQUIRED
    ```
    
    Add to `~/.bashrc` or `~/.zshrc` for persistence.
    
    ### Config File Alternative
    
    Create `~/.adguard/config.json` (optional):
    
    ```json
    {
      "url": "http://192.168.1.100:3000",
      "username": "admin"
    }
    ```
    
    Then set `ADGUARD_PASSWORD` separately for security.
    
    ## Commands
    
    ### check `<domain>`
    
    Check if a domain is currently blocked or allowed.
    
    ```bash
    ./adguard.sh check doubleclick.net
    # āœ— doubleclick.net IS BLOCKED
    #   Blocked by: Adblock Plus filter
    
    ./adguard.sh check example.com
    # āœ“ example.com is NOT blocked (allowed)
    ```
    
    ### allow `<domain>` | whitelist `<domain>`
    
    Add a domain to the allowlist (whitelist). Creates an exception rule that overrides blocklists.
    
    ```bash
    ./adguard.sh allow broken-site.com
    # āœ“ Added rule: @@||broken-site.com^
    #   Domain: broken-site.com
    #   Action: allow
    ```
    
    ### block `<domain>` | blacklist `<domain>`
    
    Add a domain to the blocklist. Creates a custom blocking rule.
    
    ```bash
    ./adguard.sh block spyware-domain.ru
    # āœ“ Added rule: ||spyware-domain.ru^
    #   Domain: spyware-domain.ru
    #   Action: block
    ```
    
    ### status | stats
    
    Display DNS filtering statistics and protection state.
    
    ```bash
    ./adguard.sh status
    # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    # AdGuard Home Status
    # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    # Protection: āœ“ ENABLED
    # 
    # DNS Queries: 1,234
    # Blocked by rules: 156
    # Blocked by safe browsing: 23
    # Safe search replacements: 5
    # Block rate: 14%
    # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ```
    
    ### toggle | protection
    
    Enable or disable DNS protection. Useful for temporarily disabling filtering.
    
    ```bash
    ./adguard.sh toggle
    # Disabling protection...
    # āœ“ Protection is now false
    ```
    
    ### cache-clear
    
    Clear the DNS cache to apply rule changes immediately.
    
    ```bash
    ./adguard.sh cache-clear
    # Clearing DNS cache...
    # āœ“ Cache cleared
    ```
    
    ## Finding Your AdGuard Home Device
    
    If you don't know your AdGuard URL:
    
    1. **Router admin panel** — Look for a device named "AdGuard Home" or check for port 3000
    2. **Local network scan** — Use `nmap` or check "Connected Devices"
    3. **If running on same machine** — Default is `http://localhost:3000`
    4. **mDNS/Bonjour** — Try `http://adguard-home.local:3000` (depends on network)
    
    ## Filtering Rules Syntax
    
    AdGuard uses a DNS filtering rule syntax:
    
    | Rule | Effect |
    |------|--------|
    | `\|\|example.com^` | Block example.com and subdomains |
    | `@@\|\|example.com^` | Allow example.com (exception/whitelist) |
    | `example.com` | Block exact domain only |
    | `\|\|ad.example.com^` | Block only ad.example.com |
    
    See [API Reference](references/api.md) for complete syntax.
    
    ## Common Scenarios
    
    ### Allow a site that's blocked by accident
    
    ```bash
    adguard.sh allow my-bank.com
    ```
    
    ### Block a known malware domain
    
    ```bash
    adguard.sh block malicious-tracker.xyz
    ```
    
    ### Check if a domain is being filtered
    
    ```bash
    adguard.sh check ads.google.com
    ```
    
    ### View today's statistics
    
    ```bash
    adguard.sh status
    ```
    
    ### Temporarily disable filtering (e.g., for troubleshooting)
    
    ```bash
    adguard.sh toggle
    ```
    
    ## Troubleshooting
    
    **Error: Failed to authenticate**
    → Check `ADGUARD_PASSWORD` is correct and set
    → Verify `ADGUARD_URL` points to the right IP and port
    
    **Error: API call failed (HTTP 401)**
    → Authentication failed, check credentials
    
    **Rules don't take effect**
    → Run `adguard.sh cache-clear` to flush DNS cache
    → Wait 5+ minutes for clients to refresh their cache
    → Restart your device's network connection
    
    **Can't connect to AdGuard**
    → Verify device is on the same network
    → Check firewall isn't blocking port 3000
    → Ping the device: `ping <ip>`
    
    ## Advanced: Batch Operations
    
    Block multiple domains:
    
    ```bash
    for domain in tracker1.com tracker2.com tracker3.com; do
        adguard.sh block "$domain"
    done
    ```
    
    Check multiple domains:
    
    ```bash
    for domain in example.com test.org my-site.net; do
        echo "Checking $domain..."
        adguard.sh check "$domain"
    done
    ```
    
    ## API Reference
    
    See [references/api.md](references/api.md) for complete AdGuard Home API documentation.