Ember, a native iOS Hacker News reader I built around accessibility
Summary
Ember is a native iOS Hacker News reader built with SwiftUI, emphasizing accessibility and a personalized onboarding experience. It features threaded comments, full-text search, offline saves, and is open-source under the MIT license.
View Cached Full Text
Cached at: 06/20/26, 05:16 PM
DatanoiseTV/ember-hackernews
Source: https://github.com/DatanoiseTV/ember-hackernews
Ember
A native Hacker News reader for iOS — calm, fast, and built for everyone.
Ember is a SwiftUI app that reads Hacker News the way a native iOS app should: threaded comments rendered natively, a personalized first-run setup, full dark mode, and accessibility treated as a feature rather than an afterthought.
Highlights
- Every feed — Top, New, Best, Ask HN, Show HN, and Jobs, switchable from a pinned filter bar.
- Native comment threads — Hacker News comment HTML is parsed into native text with tappable links, italics, block quotes, and code blocks. Threads are collapsible with depth indicators, and the whole tree loads in a single request.
- Smart onboarding — a short first-run flow that reads your device’s appearance and accessibility settings, pre-configures the app to match, and shows a live preview as you choose a theme, accent, and home feed.
- Search — full-text search across Hacker News by relevance or recency.
- Saved for later — bookmark any story; saved stories are stored on device and work offline.
- Read tracking — visited stories are dimmed so you can pick up where you left off.
- In-app reading — open links in an in-app Safari view with optional Reader mode, or hand off to your default browser.
- Profiles — view any user’s karma, join date, about, and recent submissions.
- Thoughtful design — a warm, hand-tuned color system, full light/dark support, six accent themes, haptics, and fluid animations.
Accessibility
Accessibility is a first-class part of Ember, with particular care for color vision.
- Never color alone. Status is always carried by an icon, shape, or text in addition to color — points and comment counts pair an SF Symbol with their value, read state shows a checkmark, and selection states use rings and checkmarks.
- Color-blind friendly cues. A dedicated setting (auto-enabled when the system “Differentiate Without Color” is on) adds explicit non-color indicators throughout.
- VoiceOver. Story rows, comments, and controls expose meaningful labels, hints, traits, and custom actions; each story reads as a single coherent element.
- Dynamic Type. Typography scales with the system text size, and layouts — including comment indentation — adapt at accessibility sizes.
- Reduce Motion. Animations and the loading shimmer are minimized when Reduce Motion is enabled.
- Underlined links. Links in comments can be underlined so they remain identifiable without relying on color.
- The onboarding adapts. On first launch Ember detects VoiceOver, Reduce Motion, Differentiate Without Color, Bold Text, and large text, turns on the matching options, and tells you exactly what it changed.
Screenshots
| Feed | Story & comments | Search |
|---|---|---|
![]() | ![]() | ![]() |
| Settings | Onboarding · welcome | Onboarding · accessibility |
|---|---|---|
![]() | ![]() | ![]() |
Architecture
Ember is pure SwiftUI with no third-party dependencies.
- UI: SwiftUI, targeting iOS 18.
- State: the Observation framework (
@Observable) for view models and stores. - Concurrency:
async/awaitnetworking; feed pages fetch concurrently withTaskGroupand tolerate individual missing items. - Persistence:
UserDefaultsfor settings and read state; a JSON file for saved stories. - Data sources:
- The official Hacker News Firebase API for feeds, items, and users.
- The Algolia HN Search API for full comment trees (one request per thread) and search.
Project layout
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
Resources/ Assets, app icon, Info.plist
Tools/ Icon generator, screenshot device-framer
Getting started
Requirements
- macOS with Xcode 16 or newer (built and tested against Xcode 26 / iOS 26 SDK).
- XcodeGen to generate the project:
brew install xcodegen.
Build and run
# 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
xcodebuild -project Ember.xcodeproj -scheme Ember \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' build
The generated Ember.xcodeproj is intentionally git-ignored — regenerate it with xcodegen generate after pulling.
Regenerating assets
swift Tools/GenerateIcon.swift # app icon
swift Tools/FrameScreenshot.swift in.png docs/screenshots/x.png # device-framed screenshot
Design notes
- The comment HTML renderer is a small purpose-built parser for the limited tag set Hacker News emits (
<p>,<i>,<b>,<a>,<pre><code>,<br>, and entities), producing nativeAttributedStringblocks rather than relying on a web view. - The full comment tree is fetched from Algolia in one request and flattened into a list with depth, so collapsing a thread is instant.
- Colors are appearance-adaptive tokens defined in code, so light and dark are both deliberately tuned rather than auto-derived.
Acknowledgements
- Hacker News and its public Firebase API.
- Algolia for Hacker News search and comment data.
Ember is an independent project and is not affiliated with Hacker News or Y Combinator.
License
Released under the MIT License.
Similar Articles
Native all the way, until you need text
A veteran macOS/iOS developer recounts the struggle of implementing a Markdown-supporting chat UI using Apple's native frameworks (SwiftUI, AppKit, TextKit) and ultimately finds that web-based technologies like Electron offer a more practical solution for rich text rendering.
Show HN: Hacker News on a train station-style flip board
A web app that displays the top 20 stories from Hacker News in a train station-style split-flap flip board.
Tolaria, Rust, and Questions About What Makes a Mac App Feel Good to Me
The author reviews Tolaria, a fast and lightweight macOS knowledge base app built with Rust and React via Tauri, praising its native-like feel and development speed compared to Electron alternatives.
@omarsar0: Hacker News → LLM Artifact I built the most personalized HN feed. It only tracks topics I do research around based on m…
A researcher built a personalized Hacker News feed powered by LLMs, memory, and proactive agents that tracks only topics relevant to their research interests, eliminating the need for bookmarks.
Using SwiftUI to Build a Mac-assed App in 2026
The article recounts the author's experience building a macOS app entirely in SwiftUI, discussing the challenges and limitations in achieving a native Mac feel, such as selection states and inactive window behavior, concluding that SwiftUI on the Mac is not yet fully mature for 'Mac-assed' apps.



