How can I get SelfControl to always run?

I use the SelfControl app.

Is there a way to make it always run?


Solution 1:

Yes. Simply open System Preferences from the /Applications folder, select "Accounts" and, with your user name highlighted in the list to the left, select the "Login items" tab. Either drag and drop SelfControl into the list, or click the "+" button and navigate to its location.

Then, SelfControl will always start up when you log in.


You'll need to download and install Daniel Jalkut's Usable Keychain Scripting to quickly and securely access your admin password in order to activate SelfControl.

Add password to Keychain

Open Keychain Access.app. Create a new password by typing Cmd-N or going to File » New Password Item... Under Keychain Item Name, type 'SelfControl.' Make up any Account Name in the next field, and in the Password field, type the password for your user account (the password you would use to authenticate anything in OS X). Click 'Add', and you should now have a new application password entitled 'SelfControl' in your Keychain.

Create the AppleScript

Paste the following contents (originally from here)to a new window of AppleScript Editor.app:

on run argv
 set defaultTime to 1440

 try
  set myTime to item 1 of argv as number
 on error
  set myTime to defaultTime
 end try

 tell application "Usable Keychain Scripting"
  tell current keychain
   set myPass to (password of first generic item ¬
    whose name contains "SelfControl")

   -- eliminate invisible characters, or "gremlins," from password
   set x to quoted form of myPass
   set myPass to do shell script "echo " & x & " | perl -pe 's/[^[:print:]]//g'"
  end tell
 end tell

 tell application "SelfControl" to activate

 tell application "System Events"
  tell process "SelfControl"
   tell slider of window "SelfControl" to set value to myTime
   click button "Start" of window "SelfControl"
  end tell
  tell window 1 of process "SecurityAgent"
   with timeout of 15 seconds
    repeat
     set tryAgain to false
     try
      set value of text field 2 of scroll area 1 of group 1 to myPass
     on error
      delay 1
      set tryAgain to true
     end try
     if not tryAgain then exit repeat
    end repeat
    click button 2 of group 2
   end timeout
  end tell
 end tell
end run

We set defaultTime to 1440 (i.e. 24 hours) here so you can automatically kick off SelfControl for the maximum time.

Now, from AppleScript Editor, save this file somewhere by pressing File » Save, e.g. /Users/your-username/SelfControl.scpt, which would be in our home folder. Remember that path.

Create the launchd entry

Then open your favourite text editor or the Property List Editor.app that comes with the Mac OS X Dev tools on Snow Leopard or is integrated into Xcode on Lion.

Either way, paste the following contents, but make sure to change the path to the script accordingly (it't the one we remembered above):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>my.selfcontrol.launcher</string>
    <key>ProgramArguments</key>
    <array>
        <string>osascript</string>
        <string>/Users/your-username/SelfControl.scpt</string>
    </array>
    <key>StartInterval</key>
    <integer>86400</integer>
    <key>RunAtLoad</key>
    <false/>
    <key>KeepAlive</key>
    <false/>
</dict>
</plist>

Save this file with the .plist extension under /Users/your-username/Library/LaunchAgents/my.selfcontrol.launcher.plist. If the Library folder is hidden, you can open Finder, press CmdShiftG and paste ~/Library to open it.

Load the launchd entry

Finally, open a terminal and run:

launchctl load ~/Library/LaunchAgents/my.selfcontrol.launcher.plist

This will tell launchd to open the AppleScript and start SelfControl for twenty four hours every twenty four hours.

Since it's in ~/Library/LaunchAgents it will be loaded automatically when you log in. If you want your computer back, replace load in the above command with unload, then wait for the remaining SelfControl time to expire.

Solution 2:

You can easily make SelfControl block for any length of time you want--although we don't offer an "infinite" setting, I think a year-long block achieves most of the same purpose. And you can always restart it then. To block for up to a year, first close SelfControl, then open Terminal and run these commands:

defaults write org.eyebeam.SelfControl MaxBlockLength -int 31556900
defaults write org.eyebeam.SelfControl BlockLengthInterval -int 432000

Reopen SelfControl, and the slider will go all the way up to a year (with 5-day intervals). You can do this trick with any block length and interval, although our display currently doesn't do years--it'll probably display that length in days or weeks instead.

For more information, see this article on our wiki. Note however that we cannot provide support if you screw up your computer in Terminal, so this is for pro users only. More information on tweaks like this will eventually be available on our new website.