Update: The app is now open source

The app is no longer on AppStore, a cleaned-up and rewritten version is now available on GitHub

Download it on the app store

TL;DR: If you downloaded the app don’t forget to toggle the Safari switch in Settings

The “Do something with Hacker News” idea

Searching for HN clients on the app store results in many reasonable looking apps. Some of them abandoned a few years back, others look like a developer needed at least one random published app to apply for the job.

If another HN client is to be built, it needs some outstanding features, not necessarily useful, just something to separate it from the crowd.

But the iOS app wasn’t the first spawn of the “Do something with Hacker News” itch of mine, the first one was a newsletter prototype, complete with sketchy categorization provided by GCP NLP, even if using a combination of HN comments and text from the linked article as input.

Yes, very useful categorization

Yes, very useful categorization

You might recognize that the same categories pop up in certain subreddits, I’m thinking they might’ve taken a similar approach trying to add something of value to their feeds.

The iOS app

A few weeks into the “Do something with Hacker News” phase, I decided that the app store is missing another HN app.

But it can’t be just another wrapper around the site, that would be too boring.

Besides the granular snapshots, it should also have a graph representation of the community engagement with the news item, both comments and upvoting activity.

Pretty graphs and analytics really put the “meta” in the “Metalens”!

For good measure throw a “curated feed” feature that would pick news items using “handcrafted algorithms”, no need to chose what to read, an algorithm can do the thinking for you.

Those features would make the app unique, and unique is the only thing that matters, the usefulness can wait a bit.

SwiftUI?

Initially, the project used SwiftUI, development was going so fast and the prototyping phase went smooth. But SwiftUI it’s not ready for production yet, while some things are trivial other essential UIKit features are just absent.

  • Want to implement a pull to refresh feature, nope.
  • Want to find out how far has the user scrolled the list? nope.
  • The list goes on.

There are workarounds, but it felt like I was fighting SwiftUI. Also, the app at that stage had some bizarre bugs when items in a list would not have the correct height until you scrolled a pixel or two. Then the scrolling performance was not good, using UIKit and CoreAnimation reduced CPU time in half when scrolling the same items. A rewrite using UIKit was imminent.

I got the same rejection reason as Matt Stanford with his Hacker News Zero app. The only way I could get it approved was by opening links in Safari app, while every other app seems to get away just fine by opening them in SFSafariViewController. I included a toggle switch in settings when enabled opens links in SFSafariViewController and this seems to satisfy the reviewer,

The more you think about it the less sense it makes. Why Apple even added SFSafariViewController and recommends it as the primary way to open external links, should it only be used for ToS and Privacy Policies?

Copyright infringement?

Copyright infringement?

No auto-renewing subscriptions for you

The reviewers were very insistent that I should use a non-renewing subscription. Shame, since I really could’ve used the total MRR of $2 generated by the turned on and forgotten $0.50 monthly auto-renewing subscription.

But after 6 reviews and 5 iterations, Metalens finally got approved. If you plan to install and use it, then definitely toggle on the “Use internal Safari browser” switch.

Upcoming features and improvements (maybe)

The app is still not there yet, it could have a few extra features of questionable usefulness bolted on.

  • Add trends for the search feature, something similar to Metamate
  • Get notified when someone replies to your comments or submission.

The backend

Nothing special, Go + SQLite running in a VM on CGP with Cloudflare + CF Workers so I could take advantage of their network and cache in case the app gets a surge of requests, you gotta be ready in case it gets exposure to millions of users overnight, scalable!