The worst part of visiting the dentist: Leaving with a light spray of baking soda all over my face.#

If you want to subscribe to my blog and linkblog in the Radio3 River, here is the new JSON URL:

One of the things that suck about being hard-of-hearing in one ear: Listening to The Beatles on the headphones, when Paul or John only sing on one channel.#

The latest release of River4 allows a user to bypass Amazon S3 and instead write all data to the local machine. This is big news -- the cost of bandwidth and all of the reading/writing from the node.js installation to Amazon is not cheap. Although Dave Winer has said that the "river of news" is not a feed reader, they feel equivalent enough that I don't want to be paying $20 a month just to create JSON files and host a river, when competitive feed readers are much less expensive.#

The initial problem with running River4 locally is that one would need to use the web server as a host, and not all web servers have that capability. For instance, I am running River4 on a VPS that does not have a fixed IP address. However, there is a workaround: Dropbox. One can't view the index.html file of the river on the web (even when made shareable) but one can make all of the JSON files shareable, and plug them in where they are referenced. #

I created a river4 subdirectory in Dropbox, put a lists folder in it, and added my OPML files. Because I have Dropbox installed on my Linux VPS, river.js can read/write to/from that subdirectory. All I had to do was go into .bashrc, put a # in front of my original s3path, and add the following line: #

export fspath=/root/Dropbox/river4/#

After source ~/.bashrc I stopped and restarted river.js, and the app started to write files to the Dropbox folder. I then had to make the JSON files shareable. For example, if I go to Dropbox/river4/rivers and make daveWiner.js shareable, I get To show the raw code, I change www to dl and hit enter, and get I can now plug this into the Settings at the Radio3 River Browser or replace the URL in the riversArray.json file in the data folder (although you'll have to do that in a copy in a different folder, otherwise the app will just rewrite over it if you add a new OPML file to the lists folder). Then I go to (as of this writing) line 706 of the index.html file and change the following line #

readHttpFile ("data/riversArray.json", function (jsontext) { #

such that the file that it reads points to where you are hosting the JSON file. This could be the shared Dropbox URL, if you change the URL to show the raw code.#

Special thanks to Chris Dadswell for helping me think this through.#

Want to comment? The permalink for this post is


I'm redirecting to my Fargo blog -- basically communicating that the blog subdomain is my home, even if all the other pages on my WordPress site are accessible.#

As an experiment I am converting this blog to the stream template (which is what Dave Winer is using at Scripting). I was looking at Chris Dadswell's blog (as well as his OPML) and realized that a stream blog can still contain type="outline" posts. For example, here is the 9/25 stream and here is one of his outline posts from 9/25. The RSS feed points to the full posts so the stream template is not a disservice to readers.#

All I've done as of this writing is change this blog from blogHome to stream and remove everything in my <%customStylesScripts%> in the #glossary other than my Google Analytics script.#

The downside is that the stream template does not support Markdown -- which is what I've written virtually all of my outline posts in -- so many of my posts on the home page will be presented as written (i.e., not converted to HTML). If I stick to writing in HTML then this formatting error will pass over time.#

I will also add a permalink at the end of each post, so that if you are reading it on the home page, you can click over to the post itself.#

Want to comment? The permalink for this post is



Dave Winer recently released his most cutting-edge product, RiverBrowser. It is the "river of news" living at, which is his new linkblogging tool, where you can post a link simultaneously to Twitter, Facebook, a WordPress blog, and your Radio3 page. #

The RiverBrowser depends on River4 or earlier (e.g. River 3). River4 is software running on the node.js framework that converts OPML subscription lists (of RSS feeds) into a JSON file, that is then rendered as a river of news. Setting up River4 is pretty darn complicated if you are not comfortable with Unix and Amazon Web Services.#

You can see the default RiverBrowser at [](, which contains Dave Winer's tabs. But you can follow my latest blog and linkblog posts by adding a JSON URL that I've generated in my own River4 installation.#

When you're at the RiverBrowser page, sign on to Twitter. Then click on Rivers, and then My Rivers. Click the plus sign, and in the new row, enter `Jeff` on the left and `` on the right. Save, and you'll see a new tab with any feeds that I've added to [my OPML file](




I just finished reading [this series]( There are few novels that I feel compelled to pick up outside of my subway commute, and these books belong to that category. I did not unequivocally love them, but they were all good reads. Think _Harry Potter_ but young American adults who curse and have sex; or a dark _The Lion, the Witch, and the Wardrobe_.#

While reading the first two books, I really wanted magic to be real. When I was in my late twenties or early thirties I tried some candle magick, and nothing came of it. It's possible that I just was not able to summon strong enough emotional energy and will it into a change in circumstances. But then we get into tricky territory, like "Be the change you want to happen" or all that _The Secret_ philosophy. Of course that's different than shooting light out of your fingers or flying, but essentially I think magic is about our emotions and our surroundings being One.#

One takeaway from these books is that you have to know yourself and know what you want to create something new. There is no room for ambivalence in magic, or at least if you're ambivalent the results of magic could turn out grotesque or half-formed. As a Pisces -- which is a mutable sign -- I often swim in both directions at once, so don't have the strong _I have to go in THIS direction and abandon everything else_ that I associate with a zodiac sign more suited for magic, like Scorpio. So maybe if magic _is_ real, it's just not for me. I tend to be more suited towards changing consciousness than changing matter.#


I don't think my tweets are anything special, but it occurred to me last night that I can use this blog as a repository of selected tweets so that more of my microblogging can be found in the same place. Dave Winer's [Happy Friends]( makes it easy to copy and paste tweets into a blog, because it exports an opml file on the web that can be viewed as a tab in Fargo.#

So here are yesterday's tweets in which I am not communicating with someone specific or promoting my own blog posts:#





I just learned that the new version of Drafts will be using CloudKit and will drop Simperium sync. So [if I choose not to upgrade my iPhone]( and want to try the [iOS-8-only version of Drafts]( on my iPad, I will not be able to sync my drafts between the two devices.#



I use Drafts pretty much daily, and I have written God knows how many Dropbox, Evernote and URL actions for it. Not only that, I keep it as a notes repository, storing snippets that I will never _act on_. Kind of like people use nvAlt.#

I could choose to only use Drafts as a place to take actions on drafts, i.e., send text to other apps -- and use a Dropbox text editor for storing notes. The big changes that Greg Pierce (the developer) has in store look so enticing that it would be difficult for me _not_ to try it out on my iPad.#



[Twitter cards]( show additional information associated with a link. Twitter draws this information from meta tags on your page. Twitter cards support the open graph protocol, so there are only two additional lines of code you would need to add to your site via my [meta open graph script]( to support a basic summary card:#



If you want to incorporate the above meta tags, use the following updated `add meta og` script. #

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


Make sure you replace @kishner with your own Twitter handle.#

In addition to having the meta tags on your page, you need to get your site whitelisted by Twitter. After you've published a post with the meta tags, enter your URL in the [Card Validator]( If the card is valid but your site has not been approved, then submit for review. After your site has been approved, your Twitter cards will show up.#


I've been debating whether I _absolutely have to_ get a new iPhone. If I do, I'd get the year-old 5s. But for a 32gb model, that's $150 plus a $40 activation fee to renew my 2-yr contract on AT&T, unless I go with their Next plan. I haven't done the math, but it appears that [the Next plan is a ripoff](, so I'd be paying close to $200 for a subsidized iPhone 5s. #

Yesterday, when iOS 8 was released, I decided to install it on my iPad mini. Although the new OS can technically be installed on a 4s, I've read that the animations are choppy, and I already find the iOS 7 animations on my 4s to be slow. I am test-driving the new versions of my favorite productivity apps in iOS 8 to see if I can live without them on my iPhone. #

So far, I've clipped an article in Safari to Evernote using the app's extension, and I've signed in to Pinner for Pinboard using the 1Password extension. The Evernote extension functionality is a big plus compared to using Everclip or a javascript bookmarklet or [this novel solution by Phillip Gruneich]( I haven't tested out the Instapaper extension yet, and I'm looking forward to trying the [new version of Drafts coming out in October]( #

I do most of my "consumption" on the iPad anyway, so saving articles to Evernote or Instapaper would happen there. I use my iPhone mainly for task management and brain-dumping; Launch Center Pro and Drafts are the killer apps for me there. #

My conscience is telling me to use my iPhone 4s until it is pretty much nonfunctional. It seems wasteful otherwise. Yes, I can upgrade to a 5s and hand my old phone down as an iPod Touch to a family member, but I'm still spending good money for a new product. And any new product uses up resources and has a labor cost as well. #


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.#



[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#


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?#

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.#

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.#

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.#

[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.#

_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.#

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)#

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.#

Tweet This Post#

TextExpander for iOS recently had to change how it works in iOS 7, and currently TaskPaper does not support snippets. [According to the Google group](!searchin/taskpaper/textexpander/taskpaper/R1KqfUh9saU/znxS0IKaLmMJ), the team is working on it but the text editing apps (like WriteRoom) are higher priority.#

I've come up with a workaround using Launch Center Pro. You can adapt this to your own needs. This action expands a TextExpander snippet within a TaskPaper search query, copies it to the clipboard, and opens my `todo` list in TaskPaper. If you're on your iOS device, you can tap on [this link]( to install it. #

Here is the URL of the action:#


In TextExpander, I have a snippet called `ddue3` that uses the following TextExpander math: `%@+3D%Y-%m-%d`. This expands into YYYY-MM-DD three days from today. If today is 2013-12-29, the search query is `@due < 2014-01-01`. #

TaskPaper uses a similar URL scheme to that of Writeroom's, so to open the app to my todo list, I use the x-success parameter from x-callback-url to go to `taskpaper://open/todo.taskpaper`. Then I just click on the search icon and paste the clipboard contents to see any tasks that are due before New Year's Day.#

© 2014 Jeffrey Kishner.
Last update: Tue, Sep 30, 2014 at 10:22 AM.