If you’re like me, you spend a little too much time on a few websites, particularly social media sites. Try as you might to avoid them, you find yourself unconsciously typing in Facebook, Reddit, or something else into your search bar. There are a ton of browser extensions, desktop apps, and router rules you can configure to help, but I wanted something more physical.
This project uses light switches and an at-home DNS server running on a Raspberry Pi Zero to turn on or off access to specific websites. If I want access to a site I have blocked, I need to physically get up and turn off the switch -- something that’s slightly more difficult than turning off a browser extension.
What You’ll Need To Make A Website Off Switch
- Raspberry Pi Zero W, SD Card, and Power Supply
- Two single-pole light switches
- A PVC double-gang switch box
- A plastic 2-toggle switch plate
- Four male-female jumper wires
- Phillips and flathead screwdrivers
How to Build a Website Off Switch With a Raspberry Pi
1. Set up your Raspberry Pi Zero W and connect to it remotely. If you don’t know how, see our tutorial on how to set up a headless Raspberry Pi.
2. Update and Install git if not already installed.
sudo apt-get update && sudo apt-get install -y git
3. Clone the code from this repository. It will handle the management of the dnsmasq tool, which will be our new DNS server.
git clone https://github.com/rydercalmdown/internet_kill_switch
4. Run the installation command from within the newly cloned directory. This will take care of installing all base dependencies, installing the dnsmasq tool, and ensuring it’s running.
cd internet_kill_switch make install
5. Ensure dnsmasq is running by entering the following command. To exit, use Ctrl + C. You should see status “Running” in green.
sudo systemctl status dnsmasq # Use Ctrl + C to exit
6. Try running the software to ensure everything works accordingly. You should see a few log messages with no errors. Exit the software with Ctrl + C.
make run # Use Ctrl + C to exit
7. Wire the male end of each jumper cable to the switches. You should be able to tuck the pin under the screw and tighten it until it’s snug. These switches are designed for high AC voltage, but will work just the same for our project.
8. Attach the female end of the jumper cables to the Raspberry Pi. Pin order doesn’t matter, as long as one end of the switch goes to a GPIO pin, and the other goes to a ground pin. The default code expects GPIO (BCM) pins 18 and 24, though this is configurable.
9. Tuck the raspberry pi into the PVC double-gang switch box, and affix it to the back with hot glue.
10. Run the power cable through the switch box inlet, and connect it to the Raspberry Pi.
11. Attach both switches to the switch box using the screws they came with.
12. Place the switch plate on top of the switches, and attach it with the screws it came with.
13. Label which switch belongs to which site. Keep track of which switch is attached to which pin.
14. Open the src/toggle_switches.py file for editing.
cd src/ nano toggle_switches.py
15. Modify toggle_switches.py to list the websites you want to block for each switch. You can add or remove switches by modifying the SWITCHES list, and adding new objects of the class SwitchConfig. The accepted parameters are the BCM pin number, followed by a list of sites to block.
# Example: The switch connected to BCM pin 18 blocks social media, and the switch connected to BCM pin 24 blocks video websites SWITCHES = [ SwitchConfig(18, ['facebook.com', 'instagram.com']), SwitchConfig(24, ['netflix.com', 'youtube.com', 'vimeo.com']), ]
16. Run the application to test it, and make note of the IP address it prints out when starting - that’s the IP address of your Pi.
cd ~/internet_kill_switch make run # IP Address is 10.0.0.25
17. Configure your DNS servers on your computer with that IP address. I'm configuring mine in System Preferences > Network of my MacBook, but you can also configure it at the router level.
18. Test the switches on the machine that now uses your Pi as a DNS server - in my case, my MacBook. With the switches in the off position, you should be able to access websites freely. Once you flip the switches to the on position, after a short delay, you should receive a network error when trying to visit that website.
19. To confirm, use the following command on your computer, substituting google.com with the site you’ve chosen to block:
# When the switch is off dig +short google.com 184.108.40.206 # When the switch is on dig +short google.com 127.0.0.1
20. Edit your /etc/rc.local file to include the following line, so this software runs when your Pi reboots.
sudo nano /etc/rc.local # Add this line before the very last line cd /home/pi/internet_kill_switch/src && sudo ../env/bin/python app.py &
21. Mount your switches. If you would like to put this switchbox on the wall, you’ll have to find a place to mount it that’s close to an outlet so you can power the Pi. Alternatively, you can just leave the switchbox on a table or shelf somewhere.
Enjoy, and if ever you’re not able to load websites, try removing the Pi’s IP address from your DNS servers - there’s likely a problem.