I recently added some scripts to my work laptop designed to help me break out of my reflexive “cmd-T, T, enter” keyboard habit. That keyboard sequence loads up my Twitter timeline in a new tab before I’ve even realized what’s happening. I’m untraining myself out of habitual social media grazing by enforcing a rigid schedule.
Based on Mike Rugnetta’s excellent write-up, I basically hijack my Mac laptop’s /etc/hosts
file on a daily interval from 10am to 6pm, with a one hour lunch break at noon.
I’ve modified his approach slightly, since I tend to edit my /etc/hosts
file regularly for web development, and can’t be bothered to maintain two separate copies of it. Instead of swapping between two different hosts
files, I use sed
to modify the file in place.
In my hosts file I have a couple lines that look like this at the beginning of the day:
# distractionland
# 127.0.0.1 twitter.com mobile.twitter.com api.twitter.com instagram.com mltshp.com
The rule starts the day commented out, so up until 10am it’s still open season on my wandering attention. Notice that you can stack up a bunch of hostnames after the IP address, there’s no need to make a separate line for each one. I recently deactivated my Facebook, so I don’t need that one in the mix any more.
My first script /usr/local/bin/disable-distractions
blocks access to Twitter, et al by uncommenting the line:
#!/bin/sh
sudo sed -i .bak -E 's/^# (127.0.0.1 twitter.com.+)$/\1/' /etc/hosts
The script creates a backup file hosts.bak
and then removes the comment like this:
# distractionland
127.0.0.1 twitter.com mobile.twitter.com api.twitter.com instagram.com mltshp.com
The second script /usr/local/bin/enable-distractions
comments the line back out, unblocking the websites:
#!/bin/sh
sudo sed -i .bak -E 's/^\s*(127.0.0.1 twitter.com.+)$/# \1/' /etc/hosts
The -i
flag for sed
is for “inline” editing, and the -E
activates extended regular expression syntax. The edit command uses the form 's/.../.../'
, which basically reads as “search for … and replace it with …” The first … is a regular expression matching the line, and the second … either prefixes the line with #
or removes the #
.
I use the launchd daemon to call these scripts using four .plist files according to a daily schedule:
- 10am:
disable-distractions
- 12pm:
enable-distractions
- 1pm:
disable-distractions
- 6pm:
enable-distractions
Note that the computer must be running at each transition time, or the scripts won’t fire. But I can always just invoke one or the other from the command line if needed.
The launchd configuration is handled by four .plist files saved in my /Library/LaunchDaemons
folder. Once everything was set up I activated them like this:
sudo launchctl load /Library/LaunchDaemons/org.phiffer.workday-start.plist
sudo launchctl load /Library/LaunchDaemons/org.phiffer.workday-end.plist
sudo launchctl load /Library/LaunchDaemons/org.phiffer.lunchbreak-start.plist
sudo launchctl load /Library/LaunchDaemons/org.phiffer.lunchbreak-end.plist
I’ve found this “one simple trick” has been effective at managing my novelty-seeking brain. Each time I absent-mindedly load up a blocked page I take a deep breath and close the tab. For now I’ve chosen not to block my feed reader, so I’m keeping up with the weblogs I subscribe to much more regularly than I did before. Keep on posting, friends!