• Sending Scheduled Text Messages with Workflow

    Being accessible at all times of day to everyone is a ridiculous way to live, but unfortunately it seems that we have just enough access to modern technology to make it possible, but not enough comfort with it to program quiet times. Although Do Not Disturb has been available on iOS since version 6, many people don’t take the time to enable it. Not wanting to be rude by texting at 5am or 11pm when an idea comes to me, I will often either forget to send the message later at a more appropriate time or frequently stress over the fact I need to send a message but it is still not an appropriate time. This is the exact problem that systems like GTD try to avoid.

    I created a couple workflows in Workflow that solves this problem. The first Workflow creates a reminder in Omnifocus for the time I want to send the message, with an URL containing the message and recipient. When the URL is tapped it triggers the second workflow that creates the message already addressed with the recipients name.

    Download the workflow to create the reminder.

    Download the workflow to send the message.

  • Translating Emoji with Workflow

    Being old1, I often have no idea what the emojis mean that my children, wife, and younger friends send me. A simple Workflow workflow2 translates these for me. It’s simple because Workflow already has an action that translates the emojis. This workflow just takes the clipboard text, strips any non-emoji text3, and displays the text translation of anything remaining. Having the workflow in the widget screen means translation is always 1-2 swipes and a tap away.

    1. Older than 26. 

    2. I wish they’d named these differently. TextExpander has snippets and Keyboard Maestro has macros. 

    3. To save time rather than carefully selecting only the emoji. 

  • Markdown to HTML with TextExpander

    I needed a way to convert Markdown-formatted text to HTML without any line breaks for writing show notes for podcasts using the Driftwood platform, because it holds the shownotes in the YAML front matter. I wanted to be able to do this on both iOS and OS X.

    I haven’t given up on TextExpander, yet1, and so far it is the only option I’m aware of in which I can sync the same macros across all my iOS and OS X devices.

    The problem ended up being fairly simple2.

    First I needed to find a javascript library to do the conversion. Googling returned just such a library, Marked by Chris Jeffrey.

    I took the minified version and created a TextExpander snippet of just that code.

    Then I made the snippet for the conversion. It consists of only two lines of code. The first calls the Marked library:


    and the second takes whatever is in the clipboard, runs it through the marked library, and then removes newlines:

    marked(TextExpander.pasteboardText).replace(/(\n)+/g, '');

    It doesn’t get much simpler than that.

    1. I haven’t “upgraded” yet either. 

    2. If it takes me less than an hour to figure it out and write the blog post, it is “simple”. 

  • Driftwood: quickly start podcasting from your iPhone

    Driftwood is a tool I created to rapidly deploy the necessary tools for publishing a podcast: a website, a podcast formatted RSS feed, and hosting for the files. A secondary goal was to be able to do all this from an iPhone. I was inspired in part by Manton’s microcast Timetable, and from my own use of Jekyll and Github pages to host my blog. My final goal was to be able to “self”-host podcasts that I’m currently paying $100+ a year to a commercial company, especially on one that is mostly retired but not dead.


    • The demo page can be seen here.

    • My own page using this template is here.

    • The Github repository is here.


    The concept and execution is simple: Github is used to both host the source files, build the website and RSS feed from those source files using Jekyll, and host the audio files.

    The template design for the webpage is clean and elegant, thanks to Kiko by @gfjaru. I made a few tweaks but nothing significant. Since podasts are all about the audio and not the webpage1, I think a simple page is best, and the user can add additional features as needed.

    Getting started is simple:

    1. Clone or fork Driftwood to your own repository.
    2. Rename it.
    3. Edit _config.yml with your information.
    4. Edit about.md with your information.2
    5. Replace images/itunes.png with your own logo (1400x1400)
    6. Replace audio/ep1.m4a with your own file
    7. Edit the file in _posts with your information, date, shownotes, etc.

    And your first episode is up!

    Add future episodes by adding a new audio file to /audio/ and a new markdown file to /_posts/ making sure to follow the template of the original file.

    If you need further information on formatting post pages for Jekyll, you’ll find a lot of information at the Jekyll website or on Google, since the first thing one does after using Jekyll to publish their blog is to write a post on using Jekyll to publish their blog.

    Doing it iPhone only

    You can edit the files directly on Github in the browser, but I find it much more pleasent to use one of the awesome iOS apps for Github: Working Copy or Git2Go.

    You’ll need one of those apps anyway to upload the audio files and logo because there is no way to upload a binary directly to Github from the browser even on a desktop OS. Edit: Ten days after I wrote this Github announced they’re adding the ability to upload binaries from the browser..

    If you don’t have a logo, you can make one very easily using Pixelmator for iOS, which is a steal at $5.3

    Record your own episode. You can use the built-in Voice Memos app, which is free with very limited editing functionality, or use Ferrite, which is more expensive but very powerful with multi-track editing and other professional features. Again, use one of the above apps to upload it.


    1. Is Github the best place to host audio files?

      Probably not. It’s certainly not designed for that and if one makes changes to the files then the version tracking aspect of Git will cause those changes to be saved using up a lot of storage space. File size is limited to 100mb and anything over 50 will likely get a warning. Also, a repository size is soft-limited to 1 gig. In general, these will not likely be an issue, especially for small project podcasts. The purpose of Driftwood is a tool for rapid deployment. If you want to host the files somewhere else, it is a trivial problem. Merely put the full URL for the audio file in the YAML front matter for the episode page and change the podcast.rss file from <enclosure url="http://soitscometothis.net" length="" type="audio/x-m4a"/> to <enclosure url="" length="" type="audio/x-m4a"/>. You can Dropbox, S3, Internet Archive, or any other place where you can directly link to the url of your file.

    2. What about using Github Large File Storage for the audio files?

      I tried that and it didn’t work. Either I missed something or you can’t really link directly to the file url so it breaks. If you find a way to get it to work, please let me know.

    3. I want to use mp3 files not m4a files.

      No problem. Just change the audio type in podcast.rss to mp3.

    1. I don’t think I’ve ever been to the webpage of 95% of the podcasts I listen to. I even considered making this tool “headless”–without a website, just the RSS feed. 

    2. Please leave the attributions. 

    3. The “repair” tool alone is worth that in its ability to save any photo. 

  • TextExpander Snippet for Title Case

    One of the benefits of TextExpander now being able to use Javascript is that you can make much more powerful scripts that run both on the Mac and iOS. One benefit of 1Writer using Javascript and being popular with the technocrats is you can easily adopt their scripts for TextExpander and use them in other apps.

    Brian Jones recently published a 1Writer script for changing selected text to the title case format of John Gruber.

    By removing the last three lines

    var selectedText = editor.getSelectedText();
    var formattedText = toTitleCase(selectedText);

    and replacing them with


    it can now be used with TextExpander on iOS or Mac.

    The code on Github.