Alfred Reminders

Reminders, an extension for Alfred, and now a workflow, thanks to @hudgins.

Designed for the times when you just need to quickly record a reminder. You specify how many minutes to wait and what the reminder is for, and this extension will use a sticky Growl to remind you when it is time. The format of the command is:


Where 15 is the number of minutes to wait before reminding. In fifteen minutes, you’ll see a Growl notification like this one:

Requires the Powerpack for Alfred and growlnotify, a free command-line tool that you can download for free if you don’t have it already. You can check to
see if you already have it by running which growlnotify in the terminal – if it shows you /usr/local/bin/growlnotify, you already have it. If it is installed somewhere else, for now, you’ll need to update the extension after you install it.

Download the Alfred Workflow for Alfred v.2

Download the Alfred Reminders extension for Alfred v.1

Download GrowlNotify

Source on Github

45 thoughts on “Alfred Reminders

  1. Hello
    it’s a good idea
    I try it but I never see any notification !
    I have Alfred+ powerpack + growlnotify ( free version) installed .
    /usr/local/bin/growlnotify is OK

    remindme 1 bravo
    don’t work !

    From France

    • Will definitely try to troubleshoot this for you if you wanna send me some info:

      1. Which version of growlnotify are you running? Run ‘growlnotify –version’ from the command line.
      2. Which version of OSX are you running?

  2. Pingback: Simple Reminder Notification via Alfred.app and Growl Notify « The Monkey Represents Sharing

  3. Really useful! Thanks a lot for this!

    Came across a very small issue which probably isn’t easy to solve – the reminder growl notification didn’t have the correct image for me. I use the Dropbox syncing feature so I changed this:

    $HOME/Library/Application Support/Alfred/extensions/scripts/Reminders/reminders.png
    To this:
    $HOME/Dropbox/Alfred/extensions/scripts/Reminders/reminders.png

    And it now appears. Not sure if there’s a way to get the path of the extension container in a script though.

    Thanks again!

    • Marc,

      I just pushed version 1.2 that checks for growlnotify and the Reminders installation path. I tried a method to find this automatically, but it was too resource intensive to search for this each time you create a reminder. You won’t benefit from the new version, but thanks for pointing it out. Will probably help other users. 🙂

      • If you want to make things clean, couldn’t you just test to see if:
        $HOME/Library/Application Support/Alfred/extensions/scripts/Reminders/reminders.png

        Exists, and if not, set the path to:
        $HOME/Dropbox/Alfred/extensions/scripts/Reminders/reminders.png

        Those are the main two paths any Alfred user is most likely to use. No need to search.

    • This wouldn’t conflict with the “Remdiner” extension because it creates the equivalent of a ‘cron’ in your user account, then cron calls growlnotify. You can check to see if the cron is being created by typing:
      `launchctl list | grep approductive`

      This will show you ‘crons’ (which are actually called launchd items) that are registered. You should also check to see if any have been created in the past:
      `ls ~/Library/LaunchAgents/`

      The plist is created as ‘com.approductive.remindersapp.{DATE EPOCH}.plist’.

      Let me know what you find.

      • (Sorry for the typos in my previous message.)
        Hm, It seems eveything is fine. First command returns this:
        0 com.approductive.remindersapp.1336420934
        And second one shows some more, like com.google.Chrome.framework.plist and com.linotype.FontFolderProtector.plist.
        I’ll try your extension on another computer tonight and will keep you posted. Thanks a lot.

  4. Simonvx,

    The output that you are getting indicates that a ‘launchd’ event was created, but it hasn’t fired yet. Do this: ‘cat ~/Library/LaunchAgents/com.approductive.remindersapp.1336420934.plist’ In the plist, you’ll see the section

    StartInterval
    60

    The integer is the number of seconds until the event would trigger growlnotify. Make sure it isn’t a really high amount of seconds.

    • For a reason, my interval is set at 300. I’ve made tests using 1, 3 and 5 minutes. Now that explains why the 1 and 3 minutes reminders didn’t work, but not the 5 minutes one… I’m trying it right now with a 10-minute test reminder, and I’ll also try to change the Interval value. Thanks once again for all your help.

      • Also, keep in mind that each time you create a reminder, a new plist file is generated in ~/Library/LaunchAgents/ as com.approductive.remdinersapp.EPOCH.plist. And a new launchd event is created. So, to clarify, if I created three new reminders, each for 5 minutes, then immediately ran the following commands, I would see three new scheduled events:

        launchctl list | grep approductive (would show something like)
        0 com.appro….
        0 com.appro…
        0 com.appro…

        ls ~/Library/LaunchAgents/com.appro*
        com.approductive.remindersapp.EPOCH…
        com.approductive.remindersapp.EPOCH…
        com.approductive.remindersapp.EPOCH…

        This is why I created the ‘remindme cleanup’ command. It checks against the launchctl output and removes the plists that are no longer active.

        Hope that helps

  5. I really love this extension. One thing that I think it needs is sound. For anyone who wants to add sound, you can edit script.sh and modify the plist to:

    /bin/bash
    -c
    $GROWL -s –image $IMAGEPATH -m $REMINDER -t Reminders;afplay $SOUNDPATH

    Note: You need to define the following two variables above, such as:
    IMAGEPATH=$HOME/Dropbox/Alfred/extensions/scripts/Reminders/reminders.png
    SOUNDPATH=/System/Library/Sounds/Blow.aiff

    • Jeff – I tried to get this to work but the cron never kicks off I am doing a bash -c afplay xxx; growl-notify xxx. I see the PLIST file being created exactly the way I specify but the job hangs with a status code of 2. It some how worked once after I stopped the job so thinking it is some how waiting for input. Did you get this to work ?

  6. Hey,

    Been looking for a good Alfred reminders extension for a while so I’m excited to try this. I’d love a way to check what reminders were running with how long they had left and to perhaps be able to optionally set the time in hours rather than minutes. I’ll have a look at the source in a coupe of weeks and let you know how I get on unless you decide to make the changes yourself 🙂

  7. I can’t seem to get this to work – I am syncing Alfred with dropbox, but my dropbox folder is stored on another volume

    I can’t quite work out where in the script I need to change the path…

    Could you let me know which lines need changing ?

    Many Thanks

  8. I love the idea of this extension but I can’t get it to work. I have growlNotify installed in the right place and I’ve modified the script slightly as I use Dropbox syncing:

    growlnotify=$(which growlnotify | awk ‘{printf(“%s”,$0)}’)
    if [ ! $growlnotify == /usr/local/bin/growlnotify ]; then
    echo “growlnotify wasn’t found.”
    echo “Download it here: http://growl.info/downloads#generaldownloads
    open http://growl.info/downloads#generaldownloads
    exit 1
    fi

    if [ ! -d ~/”Dropbox/Alfred Sync/extensions/scripts/Reminders” ]; then
    echo “It looks like your Alfred scripts aren’t stored in the default path. You’ll have to update the Reminders/script.sh wherever your Alfred scripts are stored.”
    exit 1
    fi

    /bin/bash script.sh {query}


    I get the initial Growl notification to say I’ve created a reminder but the actual reminder doesn’t then appear. Can anyone help?

  9. I ran into an issue where launchctl was not loading the entry CRON for com.approductive.remindersapp.$TIMESTAMP.plist since the file was being created with permissions 666. I verified that umask was not set and defaulting to 022 in BASH shell however the file still got created with 666. I added a line just up the launchctl line in script.sh “chmod 644 ~/Library/LaunchAgents/com.approductive.remindersapp.$TIMESTAMP.plist” which fixed the problem.

      • No problem but really stretching my Unix scripting knowledge it has been 20 years since I actively did scripting.

  10. I found another privilege issue on the script.sh file. The script is set to -rw-r–r– and is not executable so the cleanup argument does not work. No sure how the cron ets created but I am guessing Alfred reads the file and just writes the output to the PLIST file. After changing the script.sh file to rwxr-x-r-x the cleanup argument works.

    • The version 1.5 worked without setting 644. It works because in the Alfred setting we are calling it as /bin/bash script.sh. If we call it as ./script.sh it would need to be executable.

  11. Something else I suspect is that “cleanup” will not work if there is not an active task. So if you run it and there is no active task cleanup does nothing. “launchctl list | grep com.approductive.remindersapp > /dev/null” only returns a value greater then Null if there is an active task.

    I suggest changing the line to “if ls ~/Library/LaunchAgents/com.approductive.remindersapp.* | grep com.approductive.remindersapp > /dev/null; then”

    Also wondering why not add the if statement to cleanup before the “cat > ~/Library/LaunchAgents …” so the directory is alway clean ? I modified the script.sh and also added the sound option at the start of the script.

    • Thanks for looking at this Mike.

      I removed the top line, since I’m checking for that later in the code.

      As it turns out, the default “for plist in array” bash format was spitting out all array elements. I’ve updated the plugin to version 1.5 that fixed the issue. Here is the diff if you want to see the changes. Worked when I tested it this afternoon, so let me know if it works for you.

      https://github.com/brockangelo/Reminders/commit/ebc8ec6c23eaaedf3d8365935fe9bd42b5249b88

      • It works but by removing the initial check the code is always executing regardless. I prefer to avoid that with an initial check. I prefer the first check especially since I added the cleanup code to the body so that it always cleans up old entries. This way I really do not need to run the cleanup argument. Let me know what you think.

        In addition I followed a developers advice with launchctl since I wanted to add sound. I created a executable in the extension directory which I call and it runs the sound and then it runs growlnotifier and then I just pass the one argument for the reminder to it since everything else is constant. My PLIST in the end only has the one argument whcih is the script and the other whcih is the body of the reminder. Here is the shell script.

        /usr/bin/afplay $HOME/Library/Sounds/Basso.aiff\
        /usr/local/bin/growlnotify -s –image “$HOME/Library/Application Support/Alfred/extensions/scripts/Reminders/reminders.png” -t Reminders -m $1

  12. Version 2.0 should help everyone who has posted here. Check out the new ‘commands.sh’ file that is included. This allows you to extract out everything so you can more easily customize the image, audio, and script locations. I also threw in text-to-speech because, heck why not.

    Also, if you hate bash, check out the top of script.sh. You can set $COMMANDS_LANG and $COMMANDS_FILE – this means you could use any language and can create your own script and place it wherever you want. This will *hopefully* make it easier in case there are future updates.

    I’ve updated the README on Github here: https://github.com/brockangelo/Reminders#customizing
    You can view the diff from 1.5 to 2.0 here: https://github.com/brockangelo/Reminders/compare/b0a4b5e…4a32536

    Thanks everyone for your feedback.

  13. using the alfre 2 with powerpack. growlnotigy is properly installed. when i set a reminder, at that point of time the growl pops up a notification that the reminder has been set but after the specified time the notification doesn’t pop up. Please suggest something to counter this difficulty

  14. You can verify that these are loaded into the scheduler by running:

    launchctl list | grep “com.approductive”

    This should show you any reminders that are scheduled and waiting to be triggered.

    • After running launchctl list in terminal, i got this
      three columns: 1st Pid-‘-‘ 2nd status-‘0’ 3rd – com.approductive.remindersapp.1366134766

      After running grep “com.approductive” the terminal keepsundergoing the grep process for a long time. had to close terminal window.

      Does this mean these are loaded into schduler?

      Also, would like to tell here that i am on mac 10.6.8

  15. I’m not certain then about this issue. It appears that they are loading into the launchctl agent, but not firing. Its possible that the syntax of the plist file that is getting created isn’t compatible with 10.6.8, but unfortunately I don’t have a way to test that.

    You may have to step through the commands in the script.sh files and try running them on the command line to see if you can identify why it never loads.

  16. Just a quick update to anyone subscribed here that the latest update on Github now supports parsing of simple time formats for hours and minutes. Ever wanted to use this format? “remindme 1hr get back to work!” In version 2.2 you can. 🙂 Less math, moar remembering.

Let me know if you try it...

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s