A touchscreen dashboard for your Pi-hole

22 designs, free and open source. Pick one and try it right here: it runs live, on made-up numbers.

Monolith
One giant number
1 / 16

Try: Pause · tap a blocked domain · Allowed · Style. Arrow keys switch designs. Open in a new tab ↗

What it does

  • The numbers at a glanceBlocked in the last 24 h, the blocked share, total queries and the domains just blocked.
  • Pause with one tapBlocking pauses for 5 minutes, with a countdown and Resume.
  • Let a site throughTap a blocked domain to see which list caught it. Allow it for an hour or for good, with press and hold and Undo.
  • Safe by designThe Pi-hole password never reaches the browser. The service listens on the Pi only and never changes Pi-hole’s settings.

Build the screen

The hardware this runs on: a Raspberry Pi 4 behind a 4.3" touchscreen in a 3D-printed case. About an afternoon to put together, plus a six-hour print in PETG.

Drag to turn, scroll or pinch to zoom. The Pi, screen and boards are stand-ins to show the fit.

Print status: the base and retainer (rev 4) and the rev 5 shell are printed and in use. Rev 6 only raises the bottom edge of the screen window 1 mm to even out the border, and hasn’t been printed yet.

Enclosure files: CC BY 4.0, print and remix freely with credit. Print settings and assembly steps are in enclosure/README.md.

You need

  • Raspberry Pi 4 Model B2 GB is plenty for Pi-hole and the screenAmazon ↗
  • Waveshare 4.3" DSI touchscreen800×480 capacitive, ribbon to the Pi's DSI port, no driver neededAmazon ↗
  • GeeekPi Armor Lite coolerHeatsink with a built-in fan; wires to pins 4, 6 and 7. The case is sized for itAmazon ↗
  • USB-C power supply, 5.1 V 3 A, right-angle plugThe socket sits just under the case roof, so a straight plug won’t fit. The official supply works with a 90° USB-C adapterAmazon ↗
  • microSD card, 16 GB or moreTo install Raspberry Pi OS (and to keep as a spare if you boot from SSD)

To assemble the case

  • 4 × M3 heat-set inserts, 5.7 mmPressed into the shell with a soldering iron (ruthex RX-M3x5.7)Amazon ↗
  • 4 × M3 × 8 countersunk screwsBase into the shell, from underneath (DIN 965)
  • 4 × M2.5 × 25 and 2 × M2.5 × 10 screwsPan or cap head. Don’t go longer than 25 mm: it can reach the display panel

Optional: boot from an SSD

  • 52Pi / GeeekPi N02 NVMe board for Pi 4Mounts under the Pi, powered by pogo pins on the headerAmazon ↗
  • M.2 2280 NVMe SSD, 256 GBA low-power drive such as the Patriot P300Amazon ↗

Optional: screen sleeps when you walk away

  • HLK-LD2410C radar sensorSees people even sitting still; this pack includes Dupont wiresAmazon ↗
Radar wiring (Pi header pins)
LD2410CPi pin
VCC25 V
GND14ground
OUT16GPIO 23
RX / TX8 / 10optional, for tuning over serial

Install with sudo PRESENCE=1 ./install.sh. Without a sensor the screen just stays on. Tune the range in Hi-Link’s phone app if it sees too far.

Plain Amazon links, no affiliate tags. Listings change, so check the model before you buy.

Install on your Pi

You need

  • A Raspberry Pi running Pi-hole v6
  • Raspberry Pi OS with the desktop (Bookworm or later)
  • An 800×480 touchscreen

The installer adds a small Python service and a full-screen Chromium window. Python standard library only, nothing loaded from the internet.

  1. Get the code on the Pigit clone https://github.com/gsylvest/pihole-dash-themes.git && cd pihole-dash-themes
  2. Run the installer as your desktop usersudo ./install.sh
  3. In Pi-hole’s web admin, create an app passwordSettings → Web interface / API (switch to Expert if you don’t see it)
  4. Save it on the Pi and paste it when askedread -rs -p "Paste app password: " P; echo; printf '%s' "$P" | sudo tee /etc/pihole-dash/app-password >/dev/null; unset P; sudo chmod 600 /etc/pihole-dash/app-password; sudo systemctl restart pihole-dash
  5. Pick a design on the screen under Style

Make your own design

A design is two files in app/themes/: a JavaScript file that draws it and a CSS file that styles it. Copy hifi to start; it’s about 70 lines. Test it in any browser with ?demo&theme=yourid, no Pi needed.

window.PiSkins.add("myid", {
  mount(el)     { /* build it once */ },
  render(el, m) { /* every second: m.data.blocked,
                     m.ticker, m.paused … */ },
  unmount()     { /* stop animations */ },
}, "My Design", "One-line description", thumb);