Back to NetNewsWire

Ever since NetNewsWire came back from the dead, I’ve been thinking I’d eventually switch to it. I’ve been happy with my homemade RSS reading system, but it’s generally better to be in the hands of an expert, and you’d be hard-pressed to find someone more expert at RSS parsing than Brent Simmons. This morning, I switched over. It’s possible I’ll find something in NNW that’ll make me switch back, but it’s looking good so far.

I have a few unbreakable rules for an RSS reader:

  1. It must work on all my devices.
  2. It must sync between all my devices.
  3. It cannot force me to use a third-party RSS service to do the syncing.

Initially, the rejuvenated NNW broke all my rules; until recently, it broke Rule 3. But with the addition of iCloud syncing, it ticks all the boxes.

By the way, Rule 3 is not entirely due to my being a cheap bastard. I just don’t trust RSS services to stay in business. I keep thinking of Gabe Weatherhead’s wise assessment of the Google Reader apocalypse:

Bigger revelation: Google built a service that you configure with all your interests and biases. They couldn’t make it profitable.
macdrifter (@macdrifter) Mar 13 2013 7:45 PM

This is not a review of NetNewsWire. If you’re a Mac user interested in RSS readers, you’ve read the reviews and know how fast and “Mac-assed” it is. You’re probably already using it.

But I do want to tell you how I got the list of feeds from my homemade system into NNW. First, the list is built directly into the Python code:

python:
jsonsubscriptions = [
    'http://leancrew.com/all-this/feed.json',
    'https://daringfireball.net/feeds/json',
    'https://sixcolors.com/feed.json',
    'https://www.robjwells.com/feed.json',
    'http://inessential.com/feed.json',
    'https://macstories.net/feed/json',
    'http://automationorchard.com/resources.json',
    'https://furbo.org/feed/json']

xmlsubscriptions = [
    'http://feedpress.me/512pixels',
    'http://alicublog.blogspot.com/feeds/posts/default',
    'http://bitsplitting.org/feed/',
    'https://kieranhealy.org/blog/index.xml',
    'http://brett.trpstra.net/brettterpstra',
    'http://www.libertypages.com/clarktech/?feed=rss2',
    'https://david-smith.org/atom.xml',
    'http://stratechery.com/feed/',
    'http://feeds.feedburner.com/IgnoreTheCode',
    'http://indiestack.com/feed/',
    'http://feeds.feedburner.com/theendeavour',
    'http://www.kungfugrippe.com/rss',
    'http://www.caseyliss.com/rss',
    'http://www.macdrifter.com/feeds/all.atom.xml',
    'http://macsparky.com/blog?format=rss',
    'http://www.marco.org/rss',
    'http://merrillmarkoe.com/feed',
    'http://mjtsai.com/blog/feed/',
    [and so on…]
    ]

As you can see, it’s really two lists, one for JSON feeds and one for regular RSS/Atom/XML feeds. I copied this code into a new BBEdit document, and used its Text▸Prefix/Suffix Lines… command to strip off the quotation marks and commas. Then a couple more deletions got me down to a simple list of feed URLs:

http://leancrew.com/all-this/feed.json
https://daringfireball.net/feeds/json
https://sixcolors.com/feed.json
https://www.robjwells.com/feed.json
http://inessential.com/feed.json
https://macstories.net/feed/json
http://automationorchard.com/resources.json
https://furbo.org/feed/json
http://feedpress.me/512pixels
http://alicublog.blogspot.com/feeds/posts/default
http://bitsplitting.org/feed/
https://kieranhealy.org/blog/index.xml
http://brett.trpstra.net/brettterpstra
http://www.libertypages.com/clarktech/?feed=rss2
https://david-smith.org/atom.xml
http://stratechery.com/feed/
http://feeds.feedburner.com/IgnoreTheCode
http://indiestack.com/feed/
http://feeds.feedburner.com/theendeavour
http://www.kungfugrippe.com/rss
http://www.caseyliss.com/rss
http://www.macdrifter.com/feeds/all.atom.xml
http://macsparky.com/blog?format=rss
http://www.marco.org/rss
http://merrillmarkoe.com/feed
http://mjtsai.com/blog/feed/
[and so on…]

Now it was time to convert this list to OPML format so NNW could import it. To see what kind of OPML NetNewsWire was expecting, I added two feeds “by hand” and exported them. The result was

xml:
<?xml version="1.0" encoding="UTF-8"?>
<!-- OPML generated by NetNewsWire -->
<opml version="1.1">
    <head>
        <title>Subscriptions-iCloud.opml</title>
    </head>
<body>
    <outline text="And Now It's All This" title="And Now It's All This" description="" type="rss" version="RSS" htmlUrl="https://leancrew.com/all-this/" xmlUrl="http://leancrew.com/all-this/feed.json"/>
    <outline text="Daring Fireball" title="Daring Fireball" description="" type="rss" version="RSS" htmlUrl="https://daringfireball.net/" xmlUrl="https://daringfireball.net/feeds/json"/>
    </body>
</opml>

I copied the top several lines and bottom two lines and pasted them directly into my new file (I did change the <title>). I guessed that I could get away with leaving out all the <outline> attributes except xmlUrl, so another go-round with Text▸Prefix/Suffix Lines…, this time Inserting rather than Removing, left me with

xml:
<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.1">
<head>
    <title>old-subscriptions.opml<title>/>
</head>>
<body>
    <outline xmlUrl="http://leancrew.com/all-this/feed.json"/>
    <outline xmlUrl="https://daringfireball.net/feeds/json"/>
    <outline xmlUrl="https://sixcolors.com/feed.json"/>
    <outline xmlUrl="https://www.robjwells.com/feed.json"/>
    <outline xmlUrl="http://inessential.com/feed.json"/>
    <outline xmlUrl="https://macstories.net/feed/json"/>
    <outline xmlUrl="http://automationorchard.com/resources.json"/>
    <outline xmlUrl="https://furbo.org/feed/json"/>
    <outline xmlUrl="http://feedpress.me/512pixels"/>
    <outline xmlUrl="http://alicublog.blogspot.com/feeds/posts/default"/>
    <outline xmlUrl="http://bitsplitting.org/feed/"/>
    <outline xmlUrl="https://kieranhealy.org/blog/index.xml"/>
    <outline xmlUrl="http://brett.trpstra.net/brettterpstra"/>
    <outline xmlUrl="http://www.libertypages.com/clarktech/?feed=rss2"/>
    <outline xmlUrl="https://david-smith.org/atom.xml"/>
    <outline xmlUrl="http://stratechery.com/feed/"/>
    <outline xmlUrl="http://feeds.feedburner.com/IgnoreTheCode"/>
    <outline xmlUrl="http://indiestack.com/feed/"/>
    <outline xmlUrl="http://feeds.feedburner.com/theendeavour"/>
    <outline xmlUrl="http://www.kungfugrippe.com/rss"/>
    <outline xmlUrl="http://www.caseyliss.com/rss"/>
    <outline xmlUrl="http://www.macdrifter.com/feeds/all.atom.xml"/>
    <outline xmlUrl="http://macsparky.com/blog?format=rss"/>
    <outline xmlUrl="http://www.marco.org/rss"/>
    <outline xmlUrl="http://merrillmarkoe.com/feed"/>
    <outline xmlUrl="http://mjtsai.com/blog/feed/"/>
    [and so on…]
</body>
</opml>

My guess was right. NetNewsWire accepted my hastily made OPML file without complaint and figured out all the titles and other details on its own. I put in ten minutes of work at the most and had a fully functioning blog reader with over 40 subscriptions. A testament to BBEdit’s tooling and NetNewsWire’s adherence to Postel’s Law.

One last pleasant surprise: For reasons I don’t fully understand, when I first opened NetNewsWire, it populated the “On My Mac” account with several blogs I used to read. Presumably these subscriptions were saved in some preferences file in my Library folder, but I was doing this on my new MacBook Air, and I didn’t use Migration Assistant when setting it up. A similar thing happened in the “On My iPhone” and “On My iPad” accounts when I installed NNW on those devices.

Anyway, before deleting those subscriptions (remember, I want all of them synced through my iCloud account), I noticed a few blogs that I’d somehow lost track of over the years and which hadn’t made it into my homemade system. It was nice to see that they’re active, and I added them to my list of iCloud subscriptions.

Update Jul 4, 2021 11:16 PM
In a tweet, Brent Simmons told me that NetNewsWire populates the “On My Device” account with 16 subscriptions upon installation—and it’s the same 16 subscriptions for everyone. It just so happens that I have at some point subscribed to all 16 of them.