DNSBlocker Widgets is a desktop widget for monitoring and controlling your DNS blocker (Pi-hole or AdGuard Home).
It is developed with JavaFX, and uses the framework TilesFX.


| Platform | Installer Type | Minimum Version | Status |
|---|---|---|---|
| Windows | Portable EXE (app-image) | Windows 10 (64-bit) | ✅ Fully Supported |
| macOS | PKG | macOS 10.15 (Catalina) | ✅ Fully Supported |
| Linux (Debian/Ubuntu) | DEB | Ubuntu 20.04+ | ✅ Fully Supported |
| Linux (Fedora/RHEL) | RPM | Fedora 35+ | ✅ Fully Supported |
All installers include bundled Java runtime - no separate installation required!
All donations are welcome and any amount of money will help me to maintain this project :)
For End Users (using installers): - None! Java runtime is bundled with all installers. - Last version of Pi-hole running on your network.
For Developers (building from source):
- Java 25 JDK (set JAVA_HOME to your JDK 25 installation).
- Git (for cloning the repository).
- Platform-specific build tools (see DISTRIBUTION.md for details).
The widget automatically sets its configuration to the default pi-hole local address if that doesn't work, open the configuration interface by right clicking on the widget then click on Settings.

Select your Platform (Pi-hole or AdGuard Home), then enter the IP Address, Port, and your credentials:
You can optionally configure a second DNS blocker (e.g., a backup Pi-hole or a secondary AdGuard Home instance). The widget will combine statistics from both blockers and display aggregated data. Toggle actions (enable/disable blocking) will apply to both DNS blockers simultaneously.
Leave DNS 2 empty if you only have one DNS blocker.
Click Apply.

Your settings are stored in a settings.json file under your user home directory:
%USERPROFILE%\\DNSBlocker Widget\\settings.json~\/DNSBlocker Widget\/settings.jsonOn startup, the app will create this file only if it is missing (it will not overwrite an existing settings.json).

Enable Expert Settings

then click on configure app password

For AdGuard Home, use the same Username / Password you use to log into the AdGuard Home web interface.
You can set your Widget size, layout, theme, and refresh behavior in the Widget Settings panel.
Note: settings marked with (*) in the UI (typically Size and Layout) require a restart to take effect.

Available options: - Size: Small, Medium, Large, XXL, Full Screen - Layout: Horizontal, Square - Theme: Dark, Light - Refresh intervals (seconds): - Status update (s) - Fluid update (s) - Active update (s) - Top domains update (s) - Top domains count: how many domains to show in the “Top X Blocked” tile
Download the latest installer for your platform from the Releases page:
.zip, unzip it, and run DNSBlocker Widgets.exe.pkg installer.deb file and install with:
bash
sudo dpkg -i dnsblocker-widgets_*.deb.rpm file and install with:
bash
sudo rpm -i dnsblocker-widgets-*.rpmAll packages include the bundled Java runtime - no separate Java installation needed!
All builds are done through Gradle commands directly:
# Clone the repository
git clone https://github.com/FoKss-LTS/PiHoleWidgets.git
cd PiHoleWidgets
# Build and test
./gradlew build test
# Run the application (without installer)
./gradlew run
Create Platform Installers:
# Windows portable ZIP
./gradlew portableZip -PinstallerType=app-image
# macOS PKG
./gradlew jpackage -PinstallerType=pkg
# Linux DEB (Debian/Ubuntu)
./gradlew jpackage -PinstallerType=deb
# Linux RPM (Fedora/RHEL)
./gradlew jpackage -PinstallerType=rpm
For detailed build instructions, see DISTRIBUTION.md.
After installation, launch DNSBlocker Widgets from: - Windows: Start Menu > DNSBlocker Widgets, or run directly from the portable folder - macOS: Applications folder - Linux: Applications menu (under Network or Utilities)
Context Menu (Right-click): - Hide to Tray - Minimize to system tray - Refresh All Now - Manually refresh all data - Settings - Open configuration window - Exit - Close the application

System Tray: When the widget is hidden to tray, you can: - Double-click the tray icon to restore the widget - Right-click for Show, Hide, Settings, and Exit options
App has been tested on: - Windows 10 & 11 (64-bit) - macOS (Catalina and later) - Linux Mint, Ubuntu, and Fedora
Automated builds and testing are performed via GitHub Actions on all supported platforms.
If you find any bugs or want to suggest new features, please open an issue on the GitHub tracker: FoKss-LTS/PiHoleWidgets issues
This project includes comprehensive cross-platform build support:
📚 Documentation: - docs/QUICKSTART.md - Quick reference for users and developers - DISTRIBUTION.md - Detailed build and distribution guide - CHANGELOG.md - Version history and release notes - docs/project_analysis.md - Project analysis and improvement recommendations - docs/DEPENDENCY_UPDATES.md - Dependency update management guide
🔧 Build Commands:
./gradlew build test # Build and test
./gradlew run # Run the application
./gradlew portableZip -PinstallerType=app-image # Windows portable ZIP
./gradlew jpackage -PinstallerType=pkg # macOS PKG
./gradlew jpackage -PinstallerType=deb # Linux DEB
./gradlew jpackage -PinstallerType=rpm # Linux RPM
🚀 CI/CD:
- GitHub Actions automatically builds all platforms
- Tagged releases create installers for Windows, macOS, and Linux
- See .github/workflows/build.yml
Shoutout to :
hans0l0 for the project TilesFX.
afsalashyana for the helpful Covid Widget and JavaFX Tutorials.
Copyright (C) 2022 - 2025. Reda ELFARISSI aka FoKss-LTS
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.
Go back to : Table of Content
$ claude mcp add PiHoleWidgets \
-- python -m otcore.mcp_server <graph>