harrisonpage/firehose-ios

Dedicated iOS app for viewing Hacker News by /newest

Swift

0

11 commits

updated Sep 18, 2026

See the code
hacker-news
ios-app
ios-swift
vibe-coded

See what people are saying (1)

SourceMessageScoreDate

Hacker News Firehose for iOS

Claude and I vibe-coded an app for browsing Hacker News by /newest, source code here: https://github.com/harrisonpage/firehose-ios

0

Sep 18, 2026

README

Firehose

Blog post: Hacker News Firehose for iOS

Saturday Morning Project

Ask Claude Fable to create a custom app for browsing Hacker News by /new

Claude was able to one-shot this given a spec and screenshots.

Source here: github.com/harrisonpage/firehose-ios

Reading model is simple:

  • Open the app
  • Scroll from newest to oldest
  • Stop when bored

Content is ephemeral. There's value in the unfiltered firehose of submissions, most are low quality but occasional gems surface.

The app talks to one external service: the Algolia HN Search API (hn.algolia.com/api/v1)

Platform

  • SwiftUI, Swift concurrency (async/await), @Observable
  • iPhone only, portrait only
  • Frameworks: SwiftUI, LinkPresentation, SafariServices

Features

  • Drop any headline where url is nil effectively removing Ask HN and text-only posts
  • Killfile support by word or hostname (currently hardcoded)
  • Link previews formed with available Open Graph metadata on long-press
  • Menu items: Add to Reading List, Share, Open in Safari

Building

Open Firehose.xcodeproj in Xcode, or:

./build.sh              # iOS simulator
./build.sh device       # generic iOS device build

Building over SSH

A device build has to sign the app, and the signing key lives in your login keychain. In a desktop session that keychain is already unlocked; over SSH it is locked, and there is no window server to draw the unlock prompt on. The certificate is still readable — security find-identity lists it — so the setup looks fine right up until the build fails on:

<app>/Firehose.debug.dylib: errSecInternalComponent
Command CodeSign failed with a nonzero exit code

./build.sh device notices the locked keychain and asks for your macOS password before starting the build. To unlock ahead of time, or from a shell that cannot prompt:

security unlock-keychain ~/Library/Keychains/login.keychain-db

The unlock holds until the keychain relocks — idle timeout, sleep, or logout — not just for one build. Set KEYCHAIN_PASSWORD if nothing is around to type it. If signing still fails the same way, the key is asking for a confirmation nobody can click; grant the codesign tools standing access once:

security set-key-partition-list -S apple-tool:,apple: -s \
    -k <password> ~/Library/Keychains/login.keychain-db

Tests (killfile matching logic):

xcodebuild -project Firehose.xcodeproj -scheme Firehose \
    -destination 'platform=iOS Simulator,name=iPhone 17 Pro' test

Killfile

There is no filter UI. Rules live in Sources/Firehose/Services/Killfile.swift as a compile-time constant — edit and rebuild. Phrase rules match on token boundaries (an AI rule will not kill "Ukraine"); domain rules match label suffixes (wikipedia.org kills en.wikipedia.org but not notwikipedia.org).

License

MIT. Bundled Archivo is under the SIL Open Font License.

Thank Yous

Contributors

harrisonpage

11 commits

harrisonpage/firehose-ios

Dedicated iOS app for viewing Hacker News by /newest

Swift

0

11 commits

updated Sep 18, 2026

See the code
hacker-news
ios-app
ios-swift
vibe-coded

See what people are saying (1)

SourceMessageScoreDate

Hacker News Firehose for iOS

Claude and I vibe-coded an app for browsing Hacker News by /newest, source code here: https://github.com/harrisonpage/firehose-ios

0

Sep 18, 2026

README

Firehose

Blog post: Hacker News Firehose for iOS

Saturday Morning Project

Ask Claude Fable to create a custom app for browsing Hacker News by /new

Claude was able to one-shot this given a spec and screenshots.

Source here: github.com/harrisonpage/firehose-ios

Reading model is simple:

  • Open the app
  • Scroll from newest to oldest
  • Stop when bored

Content is ephemeral. There's value in the unfiltered firehose of submissions, most are low quality but occasional gems surface.

The app talks to one external service: the Algolia HN Search API (hn.algolia.com/api/v1)

Platform

  • SwiftUI, Swift concurrency (async/await), @Observable
  • iPhone only, portrait only
  • Frameworks: SwiftUI, LinkPresentation, SafariServices

Features

  • Drop any headline where url is nil effectively removing Ask HN and text-only posts
  • Killfile support by word or hostname (currently hardcoded)
  • Link previews formed with available Open Graph metadata on long-press
  • Menu items: Add to Reading List, Share, Open in Safari

Building

Open Firehose.xcodeproj in Xcode, or:

./build.sh              # iOS simulator
./build.sh device       # generic iOS device build

Building over SSH

A device build has to sign the app, and the signing key lives in your login keychain. In a desktop session that keychain is already unlocked; over SSH it is locked, and there is no window server to draw the unlock prompt on. The certificate is still readable — security find-identity lists it — so the setup looks fine right up until the build fails on:

<app>/Firehose.debug.dylib: errSecInternalComponent
Command CodeSign failed with a nonzero exit code

./build.sh device notices the locked keychain and asks for your macOS password before starting the build. To unlock ahead of time, or from a shell that cannot prompt:

security unlock-keychain ~/Library/Keychains/login.keychain-db

The unlock holds until the keychain relocks — idle timeout, sleep, or logout — not just for one build. Set KEYCHAIN_PASSWORD if nothing is around to type it. If signing still fails the same way, the key is asking for a confirmation nobody can click; grant the codesign tools standing access once:

security set-key-partition-list -S apple-tool:,apple: -s \
    -k <password> ~/Library/Keychains/login.keychain-db

Tests (killfile matching logic):

xcodebuild -project Firehose.xcodeproj -scheme Firehose \
    -destination 'platform=iOS Simulator,name=iPhone 17 Pro' test

Killfile

There is no filter UI. Rules live in Sources/Firehose/Services/Killfile.swift as a compile-time constant — edit and rebuild. Phrase rules match on token boundaries (an AI rule will not kill "Ukraine"); domain rules match label suffixes (wikipedia.org kills en.wikipedia.org but not notwikipedia.org).

License

MIT. Bundled Archivo is under the SIL Open Font License.

Thank Yous

Contributors

harrisonpage

11 commits

Languages

Swift

87.5%

Shell

12.5%