Show HN: A native macOS client for Hacker News, built with SwiftUI (github.com)

265 points by IronsideXXVI ↗ HN
Hey HN! I built a native macOS desktop client for Hacker News and I'm open-sourcing it under the MIT license.

GitHub: https://github.com/IronsideXXVI/Hacker-News

Download (signed & notarized DMG, macOS 14.0+): https://github.com/IronsideXXVI/Hacker-News/releases

Screenshots: https://github.com/IronsideXXVI/Hacker-News#screenshots

I spend a lot of time reading HN — I wanted something that felt like a proper Mac app: a sidebar for browsing stories, an integrated reader for articles, and comment threading — all in one window. Essentially, I wanted HN to feel like a first-class citizen on macOS, not a website I visit.

What it does:

- Split-view layout — stories in a sidebar on the left, articles and comments on the right, using the standard macOS NavigationSplitView pattern.

- Built-in ad blocking — a precompiled WKContentRuleList blocks 14 major ad networks (DoubleClick, Google Syndication, Criteo, Taboola, Outbrain, Amazon ads, etc.) right in the WebKit layer. No extensions needed. Toggleable in settings.

- Pop-up blocking — kills window.open() calls. Also toggleable.

- HN account login — full authentication flow (login, account creation, password reset). Session is stored in the macOS Keychain, and cookies are injected into the WebView so you can upvote, comment, and submit stories while staying logged in.

- Bookmarks — save stories locally for offline access. Persisted with Codable serialization, searchable and filterable independently.

- Search and filtering — powered by the Algolia HN API. Filter by content type (All, Ask, Show, Jobs, Comments), date range (Today, Past Week, Past Month, All Time), and sort by hot or recent.

- Scroll progress indicator — a small orange bar at the top tracks your reading progress via JavaScript-to-native messaging.

- Auto-updates via Sparkle with EdDSA-signed updates served from GitHub Pages.

- Dark mode — respects system appearance with CSS and meta tag injection.

Tech details for the curious:

The whole app is ~2,050 lines of Swift across 16 files. It uses the modern @Observable macro (not the old ObservableObject/Published pattern), structured concurrency with async/await and withThrowingTaskGroup for concurrent batch fetching, and SwiftUI throughout — no UIKit/AppKit bridges except for the WKWebView wrapper via NSViewRepresentable.

Two APIs power the data: the official HN Firebase API for individual item/user fetches, and the Algolia Search API for feeds, filtering, and search. The Algolia API is surprisingly powerful for this — it lets you do date-range filtering, pagination, and full-text search that the Firebase API doesn't support.

CI/CD:

The release pipeline is a single GitHub Actions workflow (467 lines) that handles the full macOS distribution story: build and archive, code sign with Developer ID, notarize with Apple (with a 5-retry staple loop for ticket propagation delays), create a custom DMG with AppleScript-driven icon positioning, sign and notarize the DMG, generate an EdDSA Sparkle signature, create a GitHub Release, and deploy an updated appcast.xml to GitHub Pages.

Getting macOS code signing and notarization working in CI was honestly the hardest part of this project. If anyone is distributing a macOS app outside the App Store via GitHub Actions, I'm happy to answer questions — the workflow is fully open source.

The entire project is MIT licensed. PRs and issues welcome: https://github.com/IronsideXXVI/Hacker-News

I'd love feedback — especially on features you'd want t...

82 comments

[ 3.5 ms ] story [ 97.2 ms ] thread
No No. Don’t do that, don’t make it better and easy to use. I’m already addicted and spent more time than I should. Now, this app that I can keep it open all day!

Btw, can you allow me to set the font-family, font-size, etc. for the interface? I can’t even do the default `CMD + +` to zoom in.

Just pushed an update allowing users to adjust text size
Brilliant. Another suggestion then; `CMD + ,` is the default shortcut to fire the Settings of any macOS app. You need to bind the default native OS Keybaord shortcuts to the App.
Found another must-have.

Mark as Un/Read, manually and auto after I clicked and read.

Ok. Look at NetNewsWire. Start by copying the key features. That is what you are building, but for HN. https://netnewswire.com

Nice. It is actually very close to the experience I have via RSS on Reeder.
> Built-in ad blocking — a precompiled WKContentRuleList blocks 14 major ad networks (DoubleClick, Google Syndication, Criteo, Taboola, Outbrain, Amazon ads, etc.) right in the WebKit layer. No extensions needed. Toggleable in settings

This is a good start, but I think a better approach would be to piggyback off of ublock origin's lists. Hopefully less maintenance that way too.

Looks nice but I don't have/want a Mac so I can't really use it. Support for other platforms would be nice.
I'm a big fan of Swift (and SwiftUI), such a concise and elegant language. Beauty.

Also I appreciate how you made all backend calls just static functions which they always should be. People tend to overcomplicate these things and add a lot of boiler plate and unnecessary bureaucracy.

Going to try your app, thank you!

P.S. tried it, already miss the `threads` tab

I need to add this! Will work on that for the next release.
i would love keyboard-driven navigation! espeically for switching between the post and comments :)
If my work PC was a Mac I'd give it a try!

One thing: I really like the colors of Hacker News. It feels weird to me when Hacker News is presented in other colors. If I were to use your app I'd want to change the color pallet back to what it looks like on HN.

> Getting macOS code signing and notarization working in CI was honestly the hardest part of this project. If anyone is distributing a macOS app outside the App Store via GitHub Actions, I'm happy to answer questions — the workflow is fully open source.

Yes, in a past life I shipped a Mac application. This aspect is always a little bit of black magic. I will say that the Windows installer situation was a lot worse, IMO.

It is great! Very native feel and it's quick too. I don't have to keep a Safari window open all the time...the ram usage of this app is around 10% of a Safari window with a single tab.

A font size setting would be nice, I found the font is a bit small.

really nice, but if you have high res monitor the fonts are too small. would be nice to zoom the ui
100%! Will have this fixed in the next release.
Just pushed an update allowing users to adjust text size
This is really really nice! Great work!

My only nitpick is I wish I could force dark mode on web pages with a light background, but that’s minor.

Ah, this gives me 2002 vibes where coolest websites started to produce native clients for their websites so their users could read and comment offline.

This is sooo good.

Very nice. Commenting from it right now.

First feature request from me would be to adjust text size. I've start bumping up the default text size on all sites by one or two notches in the past year. Getting old, y'know. But also, as someone pointed out on a design blogpost a decade ago, why not make things easier to read. I didnt need it then, but I appreciate it now.

Really happy that I can run this on MacOS14 cause I've been locked out of some neat things people have built recently. Thanks for targetting older OSes. I'm not upgrading to the crap they've been putting out lately.

I'll be able to read details more later (getting ready for the job). Hope I didn't miss anything and comment about something that was already addressed. Congrats on shipping!

Hey thank you! I will make sure to tackle text size in the next release.
Just pushed an update allowing users to adjust text size
I was able to run the app on MacOS 14, but I can't update (Hacker News menu > Check for updates…) without MacOS 15. "Your macOS version is too old" message. I praised building for older versions of MacOS in my feedback and now I'm gated from using the latest version?

Please build for those of us who don't want the slop Apple is pushing. Pretty cool that you responded and added text sizing, would love to have it. Cheers!

Sorry about that, I just pushed an update that should fix that. May you please let me know if it works now?
After playing around with it for a bit, one request I would like to make is being able to open multiple tabs.
Hey there! Try clicking view in the mac os nav bar, then click show tab bar. Is that what you’re looking for?
This is really good and I can definitely see myself using it instead of visiting the website. One thing I think would make it even better is if the comments weren't a web-view/embed but used swiftUI to display them (similar to how some reddit clients look, for instance). Not sure how feasible that is, I can imagine it'd be more involved than the current implementation.
Congrats and building and releasing something. I guess for reading things like this, I'm just a browser kind-of guy. But I still appreciate youre building a NATIVE app that's using around 85MB of working memory (according to my Activity Monotor), and not some Electron thing.

I'm probably just a anti-app guy, but I tried it out.

First thing I went to do was CMD-F to search for some strings in the comments section.

Actually, the real first thing I did, was click on the left-side article preview on the text that said "1 hr ago | 63 comments" thinking it'd navigate me to the comments. See, I like my native hyper-links.

> But I still appreciate youre building a NATIVE app that's using around 85MB of working memory (according to my Activity Monotor), and not some Electron thing.

Well, assuming you have a browser open anyway, you're still using more memory than if HN is running in another browser tab.

In fact, if every website that you use frequently had its own native app, that would use more memory than you're using now.

> and not some Electron thing

Ironically, most of the app is a webview. The comments just have some additional CSS styling slapped on top of the hackernews website. So you still have an entire HackerNews site loaded at all times when reading comments anyway.

85mb is electron territory...
What does your CLAUDE.md look like?
I actually find it better not using one. I leave Claude.md blank.
I have been building a drop in replacement for SwiftUI that can render with different renderers (TUI for now and GTK/Adwaita very soon). This will be such an awesome demo use case for it.

Congratulations on getting this out!

Sounds really cool! I’d love to check it out.
This is super cool.

In other similar news, I've been working on enhancing the HN ux, but still in the browser as an extension. The current build up on the Chrome store is pretty stable.

https://oj-hn.com

Oh sweet! I’ll make sure to check it out!
crazy you built this thing in less than a week! did you use the claude code from CLI or via the macOS app to help with this? just kind of curious on your workflow!
Hahah yep. I prefer the claude code cli, it super charges the amount of work i’m able to do.