世界を動かす技術を、日本語で。

Show HN: SwiftUIを使って構築されたHacker NewsのネイティブmacOSクライアント

概要

  • Hacker News のための macOSネイティブクライアント の紹介
  • SwiftUI で開発、 MITライセンス でオープンソース公開
  • 広告・ポップアップブロックアカウント管理ブックマーク 等の多機能搭載
  • 簡単インストール自動アップデート 対応
  • 開発者・ユーザー双方 に向けた詳細な技術情報と今後の展望

Hacker News: macOSネイティブクライアント 概要

  • SwiftUI で構築された macOS専用Hacker Newsクライアント
  • サイドバー によるストーリー閲覧、 統合リーダースレッド表示コメント を一画面で実現
  • 広告ブロック機能 :WKContentRuleListで主要14広告ネットワークを遮断、設定でON/OFF切替可能
  • ポップアップブロック :window.open()呼び出しを無効化、設定で切替可能
  • HNアカウント連携 :ログイン、アカウント作成、パスワードリセット対応
    • macOS Keychain でセッション管理、WebViewへのクッキー自動注入
    • 投票・コメント・ストーリー投稿 もアプリ内で完結
  • ブックマーク機能 :オフライン保存、検索・フィルタ対応
  • 検索・フィルタ :Algolia HN APIによる全文検索、日付範囲・種類・並び替え指定
  • 読了インジケーター :JavaScriptと連携し、画面上部に進捗バーを表示
  • 自動アップデート :SparkleによるEdDSA署名付き更新、GitHub Pages経由で配信
  • ダークモード :システム設定に連動し、CSSとmetaタグで外観自動調整

インストール方法

  • 最新DMGファイルReleasesページからダウンロード
  • DMGを開き、 アプリケーションフォルダへドラッグ&ドロップ で導入完了
  • macOS 14.0以降 対応、Xcodeや開発ツール不要

ソースビルド手順(開発者向け)

  • リポジトリをクローン
    • git clone https://github.com/IronsideXXVI/Hacker-News.git
  • Xcode 26以上でHacker News.xcodeprojを開く
  • Cmd+R でビルド&実行
  • Swiftパッケージ(Sparkle等)は自動解決

技術詳細

  • 約2,050行のSwiftコード、全16ファイル構成
  • @Observableマクロ 採用、従来のObservableObject/Publishedは未使用
  • async/await、withThrowingTaskGroupによる並列バッチ取得
  • SwiftUIのみ で設計、UIKit/AppKitはWKWebViewラッパー部分のみ利用
  • データ取得は HN公式Firebase API (個別アイテム/ユーザー)& Algolia Search API (フィード・検索・フィルタ)
    • Algolia APIで日付範囲・ページング・全文検索など柔軟に対応

CI/CD・配布フロー

  • GitHub Actions ワークフロー(467行)で全自動化
    • ビルド・アーカイブ、 Developer ID署名Appleノータライズ (最大5回リトライ)、 カスタムDMG生成(AppleScriptでアイコン配置)、DMG署名&ノータライズ、 EdDSA Sparkle署名生成、GitHubリリース作成、appcast.xml更新&GitHub Pages配信
  • macOSアプリ配布のCI/CD自動化 に関するノウハウも公開

今後の開発・フィードバック募集

  • キーボード操作 (j/kでストーリー移動)、 リーダーモード (記事をテキスト化)、 コメント返信通知 などの新機能を検討中
  • PR・Issue歓迎GitHubリポジトリ
  • フィードバック・要望 も積極受付

参考リンク

  • GitHub: https://github.com/IronsideXXVI/Hacker-News
  • ダウンロード: https://github.com/IronsideXXVI/Hacker-News/releases
  • スクリーンショット: https://github.com/IronsideXXVI/Hacker-News#screenshots
  • MITライセンス で完全公開

Hackerたちの意見

いいね!フォローやブロック機能があったら嬉しいな。こんな感じのChrome拡張があるんだけどね: https://chromewebstore.google.com/detail/hn-followblock/dkbn...

いいアイデアだね、ありがとう!

自分でコントロールできるコンテンツフィルターがあったら、体験がもっと良くなると思う。ユーザー名についてのメモや短い説明をアプリ内に表示できるといいな。ツールチップみたいにね。

https://oj-hn.com の機能リストにも入ってるよ。

内蔵の広告ブロック — プリコンパイルされたWKContentRuleListが14の主要な広告ネットワーク(DoubleClick、Google Syndication、Criteo、Taboola、Outbrain、Amazon広告など)をWebKitレイヤーで直接ブロックします。拡張機能は不要。設定で切り替え可能。これは良いスタートだけど、uBlock Originのリストを利用する方がいいと思う。そうすればメンテナンスも少なくて済むはず。

いいね、ちょっと見てみるよ。ありがとう。

より良いアプローチはuBlock Originのリストを利用することだと思う それは無理だよ。uBlock OriginはGPLv3ライセンス(https://github.com/gorhill/uBlock)だけど、このコードはMITライセンス(https://github.com/IronsideXXVI/Hacker-News)だから。

とても良いね。今コメントしてるところだよ。最初の要望はテキストサイズを調整できるようにしてほしいな。去年から、すべてのサイトでデフォルトのテキストサイズを一段階か二段階上げるようにしてるんだ。年を取るとね。でも、10年前にデザインブログで誰かが指摘してたように、読みやすくするのはいいことだよね。その時は必要なかったけど、今はありがたい。MacOS14でこれが使えるのが本当に嬉しい。最近作られた面白いものにアクセスできなくなってたから。古いOSに対応してくれてありがとう。最近のクソみたいなアップグレードにはしたくないしね。後で詳細をもっと読めるようになると思う(仕事の準備中)。何か見逃してなければいいけど、すでに解決されたことについてコメントしちゃってたらごめん。リリースおめでとう!

過去1年で、すべてのサイトのデフォルトの文字サイズを1つか2つ上げるようにしてるんだ。いつかはデスクトップ全体のスケーリングを変えた方がいいかも。でも、高解像度で複数のウィンドウを使うレイアウトが好きだから、まだやってないんだよね!

ありがとう!次のリリースでテキストサイズに取り組むようにするよ。

ユーザーがテキストサイズを調整できるようにアップデートをプッシュしたよ。

これは本当に良いね。ウェブサイトを訪れる代わりにこれを使う自分が想像できる。さらに良くするために、コメントがウェブビューや埋め込みではなく、SwiftUIで表示されるといいな(例えば、いくつかのRedditクライアントみたいに)。どれくらい実現可能かわからないけど、今の実装よりも手間がかかるだろうな。

おめでとう!何かを作ってリリースするのはすごいよね。こういうのを読むと、俺はただのブラウザ派かなって思うけど。でも、85MBの作業メモリを使ってるネイティブアプリを作ってるのは評価するよ(アクティビティモニタによるとね)。エレクトロン系のものじゃないのもいいし。多分、俺はアプリ反対派なんだけど、試してみたよ。最初にやったのは、コメントセクションで文字列を検索するためにCMD-Fを押すことだった。実際、最初にやったのは「1時間前 | 63件のコメント」って書いてある左側の記事プレビューをクリックしたことなんだけど、コメントに飛べると思ったんだ。やっぱり、ネイティブなハイパーリンクが好きなんだよね。

もしウェブ上で代替フロントエンド(+PWA)を探してるなら、https://hcker.news をチェックしてみて。ユーザーアクション(アップボート、コメント、お気に入り、フラグ付けなど)ができるようになるから。

リンクアグリゲーター(HNやredditなど)のためのアプリラッパーの概念が理解できないんだよね。外部ソースへのリンクを提供するのが目的なのに、今は拡張機能なしの限られたウェブブラウザでブラウジングしてる。ここで何か核心的な概念を見落としてるのかな?なんでこのアプリでウェブをブラウジングしたいのか、普通のウェブブラウザじゃダメなの?

でも、約85MBの作業メモリを使ってるネイティブアプリを作ってくれてるのは感謝してるよ(俺のアクティビティモニターによると)、エレクトロンのやつじゃなくて。まあ、ブラウザを開いてる前提だけど、HNが別のブラウザタブで動いてるときよりもメモリを使ってることになるよ。実際、頻繁に使うウェブサイトがそれぞれネイティブアプリを持ってたら、今使ってるよりももっとメモリを使うことになるだろうね。

そしてエレクトロンのやつじゃなくて 皮肉なことに、このアプリのほとんどはウェブビューなんだ。コメントにはハッカーニュースのウェブサイトに追加のCSSスタイルが乗っかってるだけ。だから、コメントを読むときは常にハッカーニュースのサイト全体が読み込まれてることになるよ。

ちょっと脱線するけど、CLIが好きなら、ターミナル用の無料でオープンソースのHNブラウザがあるよ: https://github.com/Aperocky/hnterminal インストールは pipx install hnterminal で。

これがあると、遊びながらも大体タスクに集中できるから好きなんだ。

リリースおめでとう!2つ聞きたいことがあるんだけど、他の人も2017年が9年前じゃなくて、まるで昨日のことみたいに感じる?俺は2017年のiMacを使ってて、MacOS 13.7.8が動いてるんだけど、どうやらハードウェアが新しいMacOSのバージョンをサポートしてないみたい。大体、これにはあまり落ち込んでないけど、古いMacOSのデザインの方が新しいのより好きだから。ただ、これで2日連続でAppleエコシステムの壁にぶつかってるのは初めてだ。昨晩、Ghosttyをビルドしようとしたら、Xcode SDK 26が必要で、最新のXcode 14ではサポートされてないんだ。今日はこのアプリを試そうとしたら、古いOSのせいで起動できない。2017年のiMacはかなり優秀なマシンなのに、アップグレードする理由が全くないよ(ハードウェアやパフォーマンスの観点から)。

こんにちは!どのOSバージョンを使ってるの?このアプリはmacOS 14以降で動くはずだよ。

知らなかったらだけど、これ見てみて: https://github.com/dortania/OpenCore-Legacy-Patcher 2007年製の古いマシンでも、macOS Big Sur以降が使えるんだよ。Big Sur、Monterey、Ventura、Sonoma、Sequoiaが対応してる。個人的には、古いmacOSに満足してるよ。これも https://www.macports.org のおかげかな。

CIでmacOSのコード署名とノータリゼーションを動かすのが、このプロジェクトで一番難しかった部分だよ。もし誰かがGitHub Actionsを使ってApp Storeの外でmacOSアプリを配布してるなら、質問に答えるよ — ワークフローは完全にオープンソースだから。 ほんとそれ!実は君のGitHubリポジトリで最初に見たのがそれだったんだ。ちょっとイライラしたのは、neovimのGUIを作ってGHからダウンロードしたのに、設定アプリの隠れたところを掘り下げるまで自分のアプリが動かなかったこと。どうやってやってるのか見るのはめっちゃ助かるよ。アプリも気に入ってる!他のコメント者が言ってたように、コメントがネイティブのSwiftUI要素として表示されるのもいいかもね。 :)

ありがとう!何ができるか見てみるね。

CIでmacOSのコード署名とノータリゼーションを動かすのが、このプロジェクトで一番難しかった部分だよ。もし誰かがGitHub Actionsを使ってApp Storeの外でmacOSアプリを配布してるなら、質問に答えるよ — ワークフローは完全にオープンソースだから。もし他のリポジトリを見たいなら、Slippi用に設定してあるよ(ランチャーみたいなサブプロジェクトも含めて):https://github.com/project-slippi/Ishiiruka ほとんどの場合、「一度動けば、あまり壊れない」っていうのがありがたいね。もし壊れたら、だいたい開発者ポータルにサインインしてどこかで契約を受け入れなきゃいけないから。CIのエラーメッセージは、残念ながらこれが原因だとはあまり示してくれないんだよね。

コメントのナビゲーション機能を追加してもらえないかな?まずはトップレベルのコメントを全部読みたいし、下矢印でスクロールして、右矢印で一段階展開できるようにしたいんだ。

もちろん!次のリリースに向けて、コメントの表示方法を改善することを考えてるよ。

ブラウザで気に入ってることの一つは、この拡張機能なんだ: https://github.com/timkuijsten/BoundedBikeshed トップレベルのコメントがスレッドの深さを示す形で見えるようになるんだ。これで投稿のスキャンが全然変わったよ。