The following script will insert a #glossary directive followed by a customStylesScripts macro that includes open graph meta tags for title, url, and description. I have tested this in Google's Structured Data Testing Tool and Facebook's Open Graph Object Debugger and it works. With these tags in place, you should be able to post a Fargo blog post to Facebook and have the open graph meta tags properly parsed.

To make this work, you need to add the script below to your menubar.opml file. Write your blog post, then put the cursor on the title of the post, and choose the add meta og script. Everything you need will be automatically written. By default, the description tag pulls the first line of your blog post. You can edit it afterwards if you want.



Visit the Fargo scripting page in the docs to learn how to install this script, or watch this video.

09/12/14; 02:23:37 PM

Tiny Tiny RSS is a open-source RSS reader that you can install on any LAMP server (Linux/Apache/MySQL/PHP). I installed this yesterday and it wasn't too complicated. Lifehacker has a tutorial, but one doesn't need any Linux or command line experience to install this application. You do need to be comfortable with cPanel and FTP software.


Download the tar to your hard drive and extract.

Open the Web Host Manager for your server, and go to the cPanel for the domain onto which you are installing the application. Then go to the MySQL Database Wizard. You will need to create a new database, a new user for that database, and create a password. Then give the user all privileges. Make sure you note these all down, and then you can sign out of your Web Host Manager.

Next, open FTP software (like Filezilla). Rename the folder that you extracted from the tar to tt-rss, and upload the folder (and all of its contents) to the public_html directory of your domain.

After upload is complete, visit the install page at Enter the database settings you created in the MySQL wizard, and hit the test button. If it was a success, initialize the database. The app will provide you the contents of a custom config.php file. Copy this text and paste it into a new file in a text editor. Search for SIMPLE_UPDATE_MODE in the file and change its value to true so that the feeds will update every 1/2 hour while you're using the app. Save the file as config.php and upload into the tt-rss directory.

Now you can go visit /tt-rss/ and log in initially with admin and password. You can go into preferences to change the admin password, create users, and so on.


Installation Notes

Updating Feeds

09/11/14; 09:25:41 AM

Had a talk with my wife last night about the Apple event. She does not follow Apple news. She uses one of my old iPhones as an iPod Touch to play Letterpress.

I told her I wanted to upgrade to the 5s (which is a year old), and she asked, "But do you need it?"

That fact is, I don't. My 4s works fine with iOS 7. The screen isn't cracked, I can make calls, the battery life is acceptable. I don't even want new hardware, I just want a phone that will work well with iOS 8, and I fear that my 4s won't cut it. Some of the iOS 7 animation effects are already kind of sluggish on my current phone, and god knows how many apps I'd have to delete just to be able to install iOS 8 on it, given that I am constantly getting "you have no more storage left" messages.

I told her I just like to play with productivity apps, it appeals to my geeky side. But is it worth it to spend even $150 just so I can perform actions in Notification Center, or use 1Password from within a supported app?

The Next New Thing

I have a history of always buying The Next New Thing, debt be damned. After twenty years or so of adulthood, I am working on being less impetuous. My wife is from Germany, and she reminds me -- often -- that German companies make products to last, and that companies take their products back from consumers when they are no longer functioning. Here in the U.S., planned obsolescence seems to be the rule rather than the exception. Also, there is something to be said for thinking about the environment. Apple's green record is improving, but if I upgrade my phone every two years even if it is working fine, in some sense I am needlessly supporting the extraction of more precious metals, and I am probably contributing to the Chinese factory worker problem.

This is not to say that I definitely won't upgrade this Fall, but the thought of doing so doesn't sit well with me. I may wait the release of iOS 8 out, and observe how much pain1 I endure when my favorite apps integrate iOS 8-only features.

1 This is the Fear of Missing Out (FOMA) pain of a geek who enjoys using Drafts, Launch Center Pro, Pythonista, etc. How would I feel reading blogs and not being able to do what the authors outline in their URL schemes/scripts/actions?

09/10/14; 09:29:42 AM

The problem I have with most podcasting apps is that they assume I want to always download the most recent episodes of podcasts to which I am subscribed. I would prefer to only download episodes to which I actually want to listen. After getting frustrated tweaking settings in apps like Instacast and Overcast, I've resorted to the following routine:

Review the Podcasts Tab in River4

River4 shows podcast enclosures. I can quickly scan the podcasts in my river and decide what I want to listen to.



I then right click on the mp3 link and copy the link location to my clipboard.

Send the Link to My iPhone

Using the Pushbullet Chrome extension, I send the link to my iPhone. I just make sure to precede the link with a g (explanation below).



When I receive the push notification (the Pushbullet app on the iPhone is of course required), I swipe on it, and the link immediately opens to...

Download in GoodReader

GoodReader is an excellent app for downloading just about any media: mp3s, movie files, images, html files, PDFs. When an URL is preceded by a g, it tells Safari to go to GoodReader, and then GoodReader downloads the file.

This app remembers where I leave off in the middle of listening to a podcast -- although I have to hit the "Stop" button after pausing the recording -- so I can easily resume the podcast just by tapping on the filename. When I'm done, I swipe to delete.

09/10/14; 08:58:03 AM

I have a 16 gb iPhone 4s. I am constantly hitting my memory limits, and I fear that the phone will run sluggishly if I install iOS 8. After following today's Apple event, I am thinking of just getting a 32 gb 5s for $149. As much as I'd love a 6, knowing that 16 gb is not enough I'd have to get a 64 gb model, which costs $299. (And that's with a renewed 2-year contract!)

Of course, I could choose to do nothing, but I really want iOS 8. I am, after all, a major iPhone geek, and I want Extensions and Handoff.

I'm much more interested in the latest software than the latest hardware, but I feel I have to invest in more recent hardware to get the best out of the latest iOS update, and I think the 5s will be fine for my needs.

09/09/14; 04:32:16 PM

I just got my Amazon Web Services bill. It looks like the portion of it attributable to running River4 for August was a little over ten dollars. I know this is not backbreaking, but it's not free either. It's more expensive than a paid account at Newsblur or Feedly. And I'm already running Fever on my VPS for no extra cost. Right now I'm liking my river but the cost of the Amazon bandwidth and service requests are higher than I had anticipated.

I remember going through a similar experience when I was running River2 and River3. At that time, the big cost was running the EC2 instance 24/7. With River4, I'm running the software on my VPS, so it's not costing me anything extra. It's all Amazon.

09/03/14; 12:39:18 PM

Yesterday I blogged about fargoPublisher and Heroku but I got pretty much everything wrong. Thanks to clarification from Dave Winer on the Fargo2 Google group, I finally got fargoPublisher working as intended.

First, follow Dave's Heroku for Poets tutorial. I created a Heroku app, and put the domain name of that app in the CMS settings in Fargo (at the top right, where your name is), e.g., (not the real app name).

I registered the domain And created an Amazon S3 bucket called (although I think you can call the bucket whatever you want, it doesn't have to coincide with the domain name). At my domain registrar, I have a wildcard CNAME ("*") pointing to

On the Heroku dashboard for my app, under domains, it shows the name of my app. I added to it *

I have the following set up as config variables on the same settings page (minus the Amazon secret keys):

fpDataPath = /

fpDomain =

fpHostingPath = /

fpRedirect = false

fpServerPort = 80

I then created a new outline in Fargo, named it (File > Name Outline...) and added a few entries. When I put the cursor on a headline and clicked on the eye icon in the left rail, Fargo successfully opened the correct URL.

From what I understand from Dave, Heroku does all the serving of content, Amazon just stores the data.

09/03/14; 11:22:26 AM

Please disregard the content below and go here instead.

I have managed to successfully deploy fargoPublisher on Heroku using Dave Winer's instructions. It was surprisingly easy. (The only snag was that I had to put ** in the CMS settings globally, not per individual outline.) The difficult part has been figuring out how to actually publish the sites.

fargoPublisher seems to essentially be the same software used to create subdomains on If you want to publish one of your outlines on your own Amazon S3 bucket, you need to "name" it. As of this writing, my Heroku app is publishing to a bucket called (same as a domain name I registered). Theoretically, if I name an outline "blog," it will publish at However, there are two separate DNS components necessary to make this work. First I need to point (the "endpoint") to via CNAME. And to the best of my knowledge, I need to point a wildcard A record to the IP address of the node where I am hosting fargoPublisher. This is where the users are redirected to their subdomains. Unfortunately, Heroku apps only have dynamic IP addresses, and I don't currently see a solution to this, so I can only access my example named site at, not

This is problematic because links in Fargo sites are relative, e.g, "href=2014/09/01/blogpost.html", and named outlines have the structure. One workaround is adding a few directives in the outline: #opmlLink "" and #opmlFeed "".

This appears to successfully replace with in the rendered HTML, so that if I click on a link to a post from an index.html page, I will be directed to the correct path. Unfortunately, this solution is not working for #type "stream" blogs (i.e., link or note blogs like I believe that since you can only click on a date, Fargo is expecting the base domain, no additional directories.

Another problem is that the RSS feed points to the address, so unless I can figure out how to fix that, any feed subscribers clicking on a feed item will be directed to a 404 page.

As currently implemented, this solution is definitely better than not having fargoPublisher deployed at all. I can publish all the outlines I want to my own AWS account. I just have to tweak every outline a bit to make relative links work, and I guess stream blogs are out of the question until I can find a workaround.

09/02/14; 01:08:58 PM

I've been occasionally using Workflowy simply because Fargo does not have a native iOS app, and its web app is barely serviceable: I need to close most tabs to increase responsiveness, and even with the arrow pad, writing and editing on the iPad or iPhone in Fargo is frustrating. Only Workflowy has an iOS app, and it works well.

Fargo is far-and-away a superior product on the desktop. Just a few of the things I can do in Fargo that I can't in Workflowy:

  • Publish a blog.

  • Add attributes other than _note.

  • Run scripts.

Sharing an outline is possible from both apps.

  • In Fargo, I can share the public Dropbox URL of an outline, and a reader can import that into Fargo or view it in something like Small Picture Reader.

  • In Workflowy, I can share any outline via a secret link, and even make it editable.

Both have pretty good keyboard shortcuts.

Importing and Exporting OPML

  • I can copy the full text from an OPML file in my Dropbox account (where Fargo stores outlines) and paste it into Workflowy, and Workflowy will respect the hierarchy (although not import unsupported attributes). I can also export any outline in Workflow as OPML.

  • This Fargo script allows me to import OPML into an outline:

    • add opml in dialog box (workflowy)

    • dialog.ask ("paste raw opml here", "", "", function (data) {

    • op.insertOpml (data, down);

    • });

    • Visit the Fargo scripting page in the docs to learn how to install this script, or watch this video.

    • Just paste the OPML from Workflowy into the dialog box, hit Enter, and the outline will import into your current tab in Fargo.

  • You can also just import plain text into Fargo, because the app recognizes hard tabs as child nodes.

08/18/14; 03:01:19 PM

I've added two lines of code to my River4 homepage to let me send a link in the river to Instapaper, or to read the post on a clean page using the Instapaper parsing engine.



How to Add This to Your River

After you've installed River4 (available on GitHub), you will need to grab the HTML of the index.html file in your Amazon S3 bucket. Open it in a text file, and add these two lines of code immediately after <class="actions">:

<li><a href="{{if item.permaLink}}${''+item.permaLink}{{else}}${''}{{/if}}" rel="external" target="_blank">Send to Instapaper</a></li>

<li><a href="{{if item.permaLink}}${''+item.permaLink}{{else}}${''}{{/if}}" rel="external" target="_blank">Instapaper Text</a></li>

Then save as index.html, upload to the root of your bucket, and make sure to grant "Everyone" permission to open/download (in Properties).

08/14/14; 09:24:23 AM

I got Dave Winer's River 4 to work on my Linux VPS. You can see it here.

I know next to nothing about node.js; I managed to install it, as well as npm and an app called forever that will run river.js in the background. (Thanks to Chris Dadswell and Andrew Shell for their blog posts about this.)

If you know enough to install apps in Linux, grab the above, clone river 4 via git, and run node river.js from within the river4 folder. If everything works, you can run forever start river.js in the background.

Honestly, the hardest part was getting my Amazon S3 bucket to work. I learned via Stack Overflow that in order to map via CNAME to my bucket, I had to name the bucket That was the only major hurdle.

I also learned that I needed to store the three environmental variables in .bashrc so that they would stay permanent.

The cool thing about River 4 is that one can use include to reference an OPML file that is not stored in your S3 bucket. As an experiment, I uploaded an OPML file that includes a link to an OPML file hosted in Fargo. Sure enough, the feeds in the OPML file in Fargo appear in my river, so in the future, all I have to do is add a new feed to my list in Fargo instead of having to re-upload an OPML file to Amazon everytime I want to add a new feed to a tab.

08/05/14; 03:47:10 PM

This is a bash script that only requires a single command in Terminal and a single swipe on your iPhone to make a phone call. It is an adaptation of my command line Pushover script, so please review that before proceeding below.

Create a file called callhome at /usr/local/bin with the following contents:

#! /bin/bash


action="Call Home"

url_title="Make the Call"

curl -s \

  -F "token=$APP_TOKEN" \

  -F "user=$USER_KEY" \

  -F "title=$action" \

  -F "message=$message" \

  -F "url_title=$url_title" \

  -F "url=tel:8005551212" \

Replace the two instances of 8005551212 with a phone number, and $APP_TOKEN and $USER_KEY with your app token and user key.

Make the script executable: chmod +x callhome.

Now all you have to do is type callhome from the command line. When you get a notification on your iPhone, swipe it. Pushover will open the supplementary URL, which will dial the number.

07/24/14; 01:32:12 PM

If you include emoji in your Fargo blog (using the Emoji Cheat Sheet format), they will render on your WordPress page in the latest update to my plugin.

07/23/14; 02:58:38 PM

Of all the Weird Al videos that have been released so far over his 8-day streak, this one is my favorite. It's clever and well-animated.

07/18/14; 08:41:18 AM

Pushbullet is the best service I've seen so far that will allow me to push info from my phone to my work computer and vice versa. (I cannot install Command-C at the office.) I installed the Chrome extension and the iPhone app. From the Chrome extension, I can push a note or a list to the iOS app. This in itself is unremarkable -- I use Pushover all the time for that. But the killer feature is that I can send a link to my phone, and the moment I swipe the notification, that URL will open in the Chrome browser. And if I send an address to my iPhone, after I swipe the notification Google Maps will open to that location.

Also, I can quickly send the clipboard contents on my iPhone to the desktop extension. This is a lot faster than emailing text to myself or uploading it to Dropbox via Drafts or Launch Center Pro.


There's an IFTTT channel that allows you to push a note, link, file or address to your iPhone. I haven't played around with this, but there are many shared recipes for the channel, and I imagine you can create a recipe to automatically send images from a feed to your device.

URL Schemes

Pushbullet has URL schemes. Bachya wrote this bookmarklet to send the current page in your iOS web browser to the Pushbullet app:

javascript:window.location='pushbullet://compose?type=link&title=' + encodeURIComponent(document.title) + '&url=' + encodeURIComponent(window.location)

The Only Downside: Google

I've been working to become less reliant on Google -- for example, moving to With Pushbullet, you can only sign in with Google, and you have no choice but to open links and addresses in Google Chrome and Google Maps. Granted, their iOS maps app is my default, and I use Chrome for Mac at work, but I still would prefer to have a choice.

Pushbullet vs. Pushover

I have been using my Pushover command line script to send text to my phone, and after a recent release, now a swipe of a Pushover notification will open a supplementary URL (if available). This is great, because I can execute Drafts actions with a swipe of a notification. For example I can make my message an URL and the Drafts action "launch url" (which is just launch://?url=[[draft]]). This will open a link in Safari for iOS with a single swipe. However, it is definitely less work for me to just open the Pushbullet extension and send a link to my phone that way.

I will continue to use my Pushover script to execute actions in Drafts, but Pushbullet is more convenient if I just want to quickly send text or a link to my phone.

07/11/14; 12:21:20 PM

I am constantly fidgeting with my productivity apps and system. I was engaged to Paperless for many months, but now I am playing with Todo.txt on the command line and on iOS. As a result, I've been thinking about types of lists and the most appropriate apps for each type of list.

1. Actionable Tasks

These lists include only tasks that require a physical (measurable/observable) action to mark as complete. This is what the GTD system is all about. Over the years I have used Omnifocus, TaskPaper, Paperless, and now Todo.txt. I have found that -- for me -- text-file-based apps are the best (TaskPaper, Todo.txt). They both support tags/contexts (the @ sign) and projects (the + sign in Todo.txt; a string followed by a : for TaskPaper). I can open them in any text editor, or I can manipulate the text in supported apps. (Jesse Grosjean removed his TaskPaper app from the iOS App Store, but fortunately Ole Zorn created an excellent TaskPaper module for Editorial.)

1a. Actionable Tasks With "Hard" Due Dates

Some actionable tasks need to be done at a very specific time, or by a very specific time. "Mail the DVD at 8:30am" or "Go to Trader Joe's at 6pm." These I put in Due or Fantastical/iOS Reminders.

2. "Consumption" Lists

These are items that I want to consume: books, movies, music tracks, groceries. None of this is urgent (well, except for food). These items do require checkboxes, because once I've rented/downloaded/borrowed/purchased the item, I don't need to do it again (... except for food). I am still using Paperless for this, because the app provides a note field where I can include all the meta info I need (URLs, for example, or who suggested a particular book). And in Paperless, I can uncheck a grocery item to re-add it to my shopping list.

3. Ideas Lists

I have a list that is more-or-less called, "Things I Need to Remember to Do at Home to Avoid the Wrath of My Wife." Another is "Lunch Ideas." These items should not have checkboxes, because they are reference materials, not one-time (or even recurring) tasks. Right now I have these lists in Listary which pulls notes with a specific tag from Simplenote. You can toggle a setting for a list in Paperless to remove checkboxes and just use the list as a reference. I have also used Carbonfin Outliner with the checkboxes toggled off for these types of lists.

Of course, one can store all these lists in simple text files and store them in a single directory. nvAlt fans do this. But am I either in front of my phone or a work computer, and I cannot sync Dropbox at work. (One can sync an nvAlt folder with Dropbox.) Although I feel too spread out with my various list apps, I do believe that the ultimate test is whether my system supports both "brain dump" and "information access." Can I quickly note down an idea or todo? And can I easily find it later? Part of my problem is that I don't always recall where I put a todo. With this three-part categorical division, I hope I can better recall a todo's location. If it's actionable, it's in Todo.txt or iOS Reminders; if it's about something I want to buy, it's in Paperless; if it's an evergreen list, it's in Listary. We'll see how it goes.

07/11/14; 09:59:17 AM

If you're trying to wrap your head around url schemes, encoding and x-callback-url, listen to this excellent podcast in which the hosts of Pocket Sized Podcast interview Alex Guyot.

Here's the link to the .m4a file.

07/11/14; 08:48:55 AM

I recently created an IFTTT recipe to add the first url mentioned in a tweet to Instapaper if I favorite the tweet. Now I am concerned that someone will interpret my favorite as condoning the content of a tweet, whereas all it means is that I want to "read it later." A favorite is not the equivalent of a on Facebook.

07/10/14; 04:02:39 PM

The newest version of my action (import it into LCP) includes priorities A-C.

texttool://x-callback-url/transform?text=[list|clipboard=[clipboard]|prompt=[prompt-return:tasks]]&method=affix&prefix=[-list:priorities|A=%28A%29%20|B=%28B%29%20|C=%28C%29%20|none={{}}][textexpander:ddate]%20&suffix=[-list|no context={{}}|@online=%20%40online|contexts=%20%40[prompt-list( @)]][-list|no project={{}}|+Bills=%20%2BBills|projects=%20%2B[prompt-list( +)]]&scope=lines&x-success={{drafts:///create?text=[[output]]&action=todotxt}}

So now you can send something like the following to Drafts:

(A) 2014-07-10 complete task @context +project

This works with the Todo.txt command line interface and the iPhone app.

Visit the first post in this series to get the Drafts Dropbox action, and the second one for more about the contexts and projects.

07/10/14; 01:24:31 PM

Yesterday I posted a Launch Center Pro action to prepend the date and append a single tag to all the items in a list, and then append that text to a file in Dropbox. Since then, I have been using the todo.txt command line tool and decided to upgrade the action.

This action lets you enter a task and then enter either (a) no tag (I prefer that to "context"); (b) a tag called @online; (c) any number of tags; followed by (d) no project; (e) a project called +bills; (f) any number of projects. To enter multiple tags or projects you need to hit Return after each, and then Next only when you're done.

Import the new action. Or enter the following in the action composer:

texttool://x-callback-url/transform?text=[prompt-return:tasks]&method=affix&prefix=[textexpander:ddate]%20&suffix=[-list|no tag={{}}|@online=%20%40online|tag=%20%40[prompt-list( @)]][-list|no project={{}}|+Bills=%20%2BBills|project=%20%2B[prompt-list( +)]]&scope=lines&x-success={{drafts:///create?text=[[output]]&action=todotxt}}

If you can decipher this action then you ought to be able to customize it, e.g., add +work in the projects list.

07/09/14; 01:45:33 PM

A blog reader emailed the following question:

I have texttool, draft and LCP apps on my iphone.

Please help me this issue.

I have todo.txt file in directory dropbox/todo/todo.txt

I write in draft app one note with multiline line:




I want to add this list to shown todo.txt (each line separate) in this format:

[current date] task1 @grocery 

[current date] task2 @grocery 

[current date] task3 @grocery 

@grocery tag optional and may be replaced with other tag.

How to do this?

Here is a solution that adds the current date before each list item and the single tag of your choice after each list item.

Import the LCP action or enter the following in the action composer:


When I tap on this action, I enter each list item on a new line (hitting Return after each item except the last) and when I'm done I hit "Next".




Then the next prompt asks me to enter a tag:


The action outputs the following in TextTool:

2014-07-08 apple @groceries

2014-07-08 orange @groceries

2014-07-08 banana @groceries

The above action requires that I have a TextExpander snippet called ddate in the following format: %Y-%m-%d, and that I have imported snippets into Launch Center Pro.

Prepending the Output to the todo.txt File

Import this action to prepend the output from TextTool to your todo.txt file, or enter the following into the LCP action composer:


The above action requires that you import this Dropbox action into Drafts. Or enter the following as a Dropbox action:

Name: todotxt

Path: /todo/

File (predefined): todo

Ext: txt

Write: Prepend

Template: [[draft]]

It is possible to accomplish the above without LCP. Import this URL action into Drafts, or enter the following as an URL action:


The only difference is that you need to enter the tag name on the first line:





Everything else works exactly the same. (You still need to install the Dropbox action and to import TextExpander snippets.)

07/08/14; 11:51:00 AM

SoundCloud has url schemes to jump to a user or a specific track in the iOS app. I have cobbled the following together after reading a few threads on Stack Overflow.

How to Create a User URL Scheme

Let's get the url scheme for Tasha Blank. Click on the share icon then choose the Embed tab and then copy the embed code into a text editor.

<iframe width="100%" height="450" scrolling="no" frameborder="no" src=";auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true"></iframe>

Look for Copy the numerical string immediately after that, up until the &. Put that string after soundcloud://users/ and you'll get soundcloud://users/325143. If you click on this link on your iOS device, it will bring you to her page. And you can add it to Launch Center Pro in an action or list.

How to Create a Track URL Scheme

Let's get the url scheme for one of Tasha's recent tracks. Click on the share icon then choose the Embed tab and then copy the embed code into a text editor.

<iframe width="100%" height="450" scrolling="no" frameborder="no" src=";auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true"></iframe>

Look for Copy the numerical string immediately after that, up until the &. Put that string after soundcloud://tracks/ and you'll get soundcloud://tracks:156299506. If you click on this link on your iOS device, it will bring you to that track and start to auto-play. And you can add it to Launch Center Pro in an action or list.


I don't know how else to get track and user IDs without signing up for a developer account, but if you find a solution, please let me know in the comments or on Twitter.

07/08/14; 10:05:06 AM

If you're browsing the Tumblr or Instagram apps on your iOS device and want to get the share URL, they are formatted as follows:

Unfortunately, these are web links. What if you want a link that will bring you right to that post ID in the app? I have written a couple of Launch Center Pro actions to automate these processes.


The URL scheme for a Tumblr post (as per GitHub) is as follows:


All the information you need is in the web link, but you need to rearrange it all to make it work.

Import the Tumblr action or enter the following into LCP:


To make this action work, you will also need TextTool and Drafts. And you will need to import this URL action into Drafts.

Let's work with a random Tumblr post to see how this works:

Copy this URL to your iOS clipboard, and then tap on the Tumblr action in LCP. LCP sends this string to TextTool, which splits the string at the /:





It then takes that output and sends it back to TextTool to split at the .:








It then sends that output to Drafts and triggers the tumblr-id URL action:


This action inputs lines 3 and 7 of the draft into the relevant points of the url scheme, and creates a new draft with the final result:


And just to make the action icon look nice, I added lc-icon=tumblr.


The Instagram action is more complicated. It requires TextTool, Drafts, and Textastic. Import the LCP action or enter this into a new action:


Instagram's url scheme for a post is as follows (as per its iPhone Hooks page):


The media ID is not part of the web URL. But we can get that info from Instagrams's Embed API. Let's use an example post ( and add it after the url=:

This API returns JSON:

 {"provider_url":"http:\/\/\/","media_id":"759343924702114562_1483611","title":"Another beautiful day in the city! \ud83d\ude0d","url":"http:\/\/\/hphotos-ak-xfp1\/10537269_595401073912091_331298792_n.jpg","author_name":"newyorkcity","height":640,"width":640,"version":"1.0","author_url":"http:\/\/\/newyorkcity","author_id":1483611,"type":"photo","provider_name":"Instagram"} 

We can see that the media_id is 759343924702114562_1483611. instagram://media?id=759343924702114562_1483611 would bring us right to that post in the app, but we need the LCP action to automate the process.

We first need an easy way to grab the HTML of the API results. Textastic has an url scheme that lets you download a file and open the HTML in the editor by replacing http:// with textastic://. The first part of the LCP action does just that. However, even though Textastic supports x-callback-url, it doesn't for this particular action. So we need to tap on the share button at top right of the screen after the HTML has downloaded, and choose "Copy All." Then we take advantage of a new feature introduced in LCP: lc-callback. For apps that do not support x-callback-url, this is the next best thing. We define the callback action, but instead of it triggering automatically after the first action, we double-tap on the home button (to get the app launcher) and choose LCP. Once we tap on LCP, the next action gets triggered.

Because the embed API also provides the raw image URL for the Instagram post, the lc-callback starts with a list. We can get the iOS url scheme ("url") or the raw image URL ("image"). Let's see what happens when you choose "url":

The entire HTML is sent to TextTool, which splits the string at ":












Another beautiful day in the city! \ud83d\ude0d
































This entire string is then sent to Drafts, and the insta-api action is triggered. Import it into Drafts or enter the following as an URL action:


It simply takes line 8 -- which contains the media_ID -- and inserts into into the URL scheme.

Now, if we would rather get the raw image URL, we choose "image" after the lc-callback. It also performs a " split and sends that output to Drafts, but it instead triggers the insta-api-url action. Import it into Drafts or enter the following URL action:


Line 16 -- the raw image URL -- is sent to TextTool. Why? All the forward slashes in the URL are "escaped"


so we have to unescape them:

This action stops at TextTool. It has sharing features, so you can do what you like with URL: e.g., download the image.

To make the action icon look nice, I added lc-icon=instagram.

Granted, this LCP action is not fluid. I think it would possible to perform the conversion without the "Copy All" and lc-callback using the JSON parser in Pythonista, but I'm not proficient enough to accomplish that as of this writing. If you write an action that accomplishes the conversion with fewer steps, I would love to hear from you in the comments section or on Twitter.

Thanks to @epramono and @youens on Twitter for helping me to understand LCP 2.3.x at a deeper level.

07/07/14; 01:38:49 PM

I use Paperless for the majority of my list-making on my iOS devices. I've already written how to mark an item as complete without using the app and how to view your lists on the web. Today, I am going to share a unix command line bash script to "print" incomplete items from a list.

I created a text file called "prl" and put it in /usr/local/bin/:

#! /bin/bash


grep -A 1 \<dateCompleted\>\<\/dateCompleted\> ~/Dropbox/Paperless/$list.xml | sed -n 's:.*<itemName>\(.*\)</itemName>.*:\1:p'

I made it executable while in that directory: chmod +x prl

Now, to view the incomplete items in any list, I just type prl followed by the list name. If I have a list named Bills, I just type prl Bills and the script will output all bills that are due. (This script does not output the notes field.)

How It Works

All your Paperless lists are stored as XML files. I use grep to look for all items for which there is no completion date: <dateCompleted></dateCompleted> with -A 1 to also print out the lines immediately after each match (which are the list items themselves). Those results are piped into a sed which extracts any string sandwiched between <itemName> and </itemName>.

If I need to see a note, I can do a quick grep: grep -A 1 verizon ~/Dropbox/Paperless/Bills.xml. This will output all lines matching verizon plus the lines immediately following, including the XML tags. It's not pretty but it will get me the info I need (e.g., the due date).

<itemName>Verizon $100.00</itemName>

07/07/14; 11:30:32 AM

I'm amazed at all the stuff that's available:


An Evernote Client

A Twitter Client

I am a keyboard-shortcut fanatic; adding a note to Evernote with syntax like

geeknote create --title "A Title" --content "Some content." --tags "tag1"

beats the web interface hands down.

Granted, the cli doesn't support images, and since I'm ssh-ing into a VPS I can't open media from the command line, but for quick data input/output, nothing beats it. (I'm faster at typing on a physical keyboard than on an iPhone.)

07/03/14; 11:53:19 AM

Last built: Fri, Sep 12, 2014 at 2:33 PM

By Jeffrey Kishner, Friday, September 12, 2014 at 2:33 PM.