Got to give you kudos for the Accessibility enablement though - while some of it is baked-in support, itβs worth appreciating your work in whittling down whatever else can be supported.
Here is a comparison for the two on Mac, if you're interested. https://gq6o9uxicyzuw8es6qxe78bnml9wc3re.pastehtml.dev/#core
Iβve been using [Octal](https://apps.apple.com/us/app/octal-for-hacker-news/id130888...) for a while now but itβs not open source.
Would you be opposed to a pull request adding login/posting support? I think the way it works in Octal is webview for login, snatching the cookies out of the webview, then using the same posting endpoints as the website with the cookie.
It's plain SwiftUI with no third-party dependencies. A few things I spent the most time on:
Comments are parsed and drawn as native text instead of being dumped into a web view. Links, italics, quotes and code blocks behave like the rest of the OS, text selection works, and threads collapse instantly. The whole comment tree comes back from the Algolia API in a single request, which felt a lot nicer than walking the Firebase API node by node.
Accessibility. Nothing depends on color on its own, so points, read state and selection all carry a shape or an icon too. VoiceOver reads each story as one coherent element with proper actions, Dynamic Type and Reduce Motion are respected, and there's a color-blind mode. The first-run setup actually looks at your device's accessibility settings, switches on the matching options, and tells you what it changed instead of making you hunt for them.
Then the usual things you'd expect: Top/New/Best/Ask/Show/Jobs, search, saved stories, read tracking, an in-app reader, light and dark, and a handful of accent colors.
It only talks to the public HN APIs, there's no account and nothing is tracked. Source and screenshots are in the repo.
I'd most like feedback on the comment rendering and the accessibility choices, since those were the parts I cared about getting right. Happy to answer anything about how it's put together.
Doesn't mean others can't find it useful. e.g. I bet some portion of users would appreciate Dark mode without resorting to CSS tweaks. /rant
> Don't post generated text or AI-edited text. HN is for conversation between humans.
A native Hacker News reader for iPhone, iPad, and Mac β calm, fast, and built for everyone.
Ember is a SwiftUI app that reads Hacker News the way a native app should: threaded comments rendered natively, clean reading typography, a personalized first-run setup, full dark mode, offline reading, and accessibility treated as a feature rather than an afterthought. One codebase adapts from a tab bar on iPhone to a three-pane layout on Mac and iPad.
Accessibility is a first-class part of Ember, with particular care for color vision.
| Feed | Story & comments | Search |
|---|---|---|
![]() |
![]() |
![]() |
| Settings | Onboarding Β· welcome | Onboarding Β· accessibility |
|---|---|---|
![]() |
![]() |
![]() |
Ember is pure SwiftUI with no third-party dependencies.
TabView on iPhone, a three-column NavigationSplitView on Mac and regular-width iPad.@Observable) for view models and stores.async/await networking; feed pages fetch concurrently with TaskGroup and tolerate individual missing items.UserDefaults for settings and read state; a JSON file for saved stories; a bounded JSON disk cache (DiskCache, an actor) that stores feed lists, items, and comment trees and is served as a fallback when the network is unavailable.Sources/
App/ App entry, root tab view, environment wiring, in-app Safari
Models/ HNItem, HNUser, Feed, Algolia models
Networking/ HNService protocol, live client, mock for previews
Stores/ Settings, bookmarks, read state
DesignSystem/ Theme, typography, haptics, reusable components
Utilities/ HTML comment renderer, relative time
Features/
Feed/ Feed list, filter bar, view model
StoryDetail/ Story header + threaded collapsible comments
Search/ Search with relevance/recency
Saved/ Bookmarks
Settings/ Appearance, reading, accessibility, data, about
User/ Profiles
Onboarding/ Smart first-run personalization
Desktop/ NavigationSplitView layout for Mac / large iPad
Resources/ Assets, app icon, Info.plist, bundled Inter font
Tools/ Icon generator, screenshot device-framer
brew install xcodegen.# 1. Generate the Xcode project from project.yml
xcodegen generate
# 2. Open it
open Ember.xcodeproj
# 3. Select the Ember scheme and an iPhone simulator, then Run.
Or build from the command line:
xcodegen generate
# iPhone / iPad simulator
xcodebuild -project Ember.xcodeproj -scheme Ember \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' build
# Mac (Mac Catalyst)
xcodebuild -project Ember.xcodeproj -scheme Ember \
-destination 'platform=macOS,variant=Mac Catalyst' build
The generated Ember.xcodeproj is intentionally git-ignored β regenerate it with xcodegen generate after pulling.
swift Tools/GenerateIcon.swift # app icon
swift Tools/FrameScreenshot.swift in.png docs/screenshots/x.png # device-framed screenshot
<p>, <i>, <b>, <a>, <pre><code>, <br>, and entities), producing native AttributedString blocks rather than relying on a web view.Ember is an independent project and is not affiliated with Hacker News or Y Combinator.
Released under the MIT License.