朝まだき 頁の奥で 文字めざむ
mkdir feedlantern && cd $_
curl -fLO https://raw.githubusercontent.com/Jaaayden/feedlantern/main/docker-compose.yml
curl -fLO https://raw.githubusercontent.com/Jaaayden/feedlantern/main/seccomp_profile.json
docker compose up -d --wait
docker compose logs --tail=50 feedlantern
すべては、PolitePaulから届いた1通のメールから始まった。
はじめに
メールによると、2026年8月29日から無料アカウントで利用できるアクティブなフィードは最大3件となり、無料フィードの更新間隔は1.5時間に変更される。上限を超えたフィードは削除されないものの、凍結され、別の枠を空けるか有料プランにアップグレードするまで更新されなくなる。
PolitePaulのようなサービスは、RSSに標準対応していないWebページや、RSSHubに対応ルートがないページ、既存ルートが使えなくなったページに役立つ。そうしたページはそれほど多くないとはいえ、フィードが3件までとなると、使い勝手はかなり限られてしまう。当時、アカウントにはすでに13件のフィードがあり、その多くは更新頻度が低かった。毎日更新されるページも、数週間、あるいは数か月に一度しか更新されないページも、同じ1枠を使う。実際の更新頻度に応じて枠が割り当てられるわけではない。
当時の月額プランは、フィード20件で5.54ドル、50件で11.77ドルだった。長く使ってきたフィードを考えると20件では足りず、50件にすると毎月の固定費が大きくなる。PolitePaulがWebページの取得や保存、サービスの保守に費用をかけているのは当然で、無料枠の変更も理解できる。ただ、私の用途にはコストが高すぎた。
その後、似たサービスをいくつか調べてみたが、ほとんどがそれなりの料金を必要とし、使えるオープンソースの代替も見つからなかった。
そこで、自分で作ってみてはどうだろうと思った。GPT-6 astraが公開されたばかりで、Codexのおかげでコーディングもずっと手軽になっていた。サーバーやドメインもすでに用意できていた。
要件
まず、必要な機能を整理した。
WebページをRSSに変換する基本的な流れはシンプルだ。ページを読み込み、記事一覧を見つけ、タイトルとリンクを取り出し、定期的に更新して標準的なRSSとして出力する。サーバーとドメインはすでにあり、開発ツールもこうしたアプリを作るには十分だった。そこで、プロジェクトをFeedLantern(フィードランタン)と名付けた。
FeedLanternは個人でのセルフホストを想定しており、サービスとして一般公開することを目的としていない。有料プランはなく、外部のAIサービスとの連携も不要だ。利用量やアクセス頻度が増えると、IPアドレスがアクセス制限の対象になる可能性もあるため、自分の用途に合わせてデプロイするのがおすすめだ。
開発とテストにはCodexとGPT-6 astraを活用し、日常的なWebページの取得にはローカルルールとブラウザーサービスを使っている。
自動認識とCookie対応
この点では、FeedLanternはPolitePaulをさらに一歩上回っている。
標準の流れでは、フィードを作成するとバックグラウンドのChromiumが実際のWebページを読み込み、動的コンテンツが表示されるのを待ってから、レンダリング後のDOMから記事やカードの繰り返し構造を探す。続いて、タイトル、リンク、画像、概要、日付を特定し、サンプルと信頼度を表示する。
候補となる一覧が複数見つかった場合は、選択肢を表示する。認識結果が正確でないときは、ビジュアルエディターに切り替えて項目を選び直したり、ルールを修正したりできる。
ページをたくさん追加する場合も、要素を一つずつクリックする必要はなく、ほぼワンクリックで済む。
ログインしないと正しく表示されないページもあるため、Cookieを設定する機能も用意した。Cookie文字列とOpenCookie JSONに対応しており、認証情報はローカルに暗号化して保存され、ログや通常のクエリ応答には記録されない。自動認識に外部モデルは使わず、ブラウザーによる取得とルールに基づく抽出はサーバー上で継続して実行できる。
使いやすさから、長く使える仕組みへ
ページの自動認識だけでなく、長く使うにはフィードの管理機能も必要だ。FeedLanternではリスト表示とカード表示を切り替えられ、URLの一括追加やRSSアドレスの一括コピー、停止、再開、更新、削除ができる。暗号化バックアップや設定のインポート、別サーバーへの復元にも対応している。
フィード一覧の名前はRSSチャンネル名と連動している。名前を変更しても、フィードのURL、キー、履歴、更新スケジュールは変わらない。ログインできるのは管理者1人のみで、公開登録や複数ユーザー、有料プランの仕組みは設けていない。
かんたんなデプロイ手順
Docker Composeはサーバー内のポート4321だけで待ち受け、外部からのアクセスはNginxに任せる。標準ではlatestイメージを使い、mainブランチのCIがすべて通るとイメージが自動更新される。ディレクトリを作成し、ファイルを2つダウンロードすれば起動できる。
次に、http://127.0.0.1:4321にアクセスして、管理者の初期設定を行う。ドメインを使う場合は、リポジトリにあるNginx設定テンプレートをサイト設定に配置し、ドメイン名と既存の証明書のパスを書き換えて、リクエストをhttp://127.0.0.1:4321に転送する。詳しい設定やバックアップ、トラブルシューティングについては、リポジトリのdocディレクトリを参照してほしい。
おわりに
これはあくまで個人のニーズに合わせた試みだが、RSSをよく使う人にはきっと役立つはずだ。数ある有料サービスの中で、これが唯一のオープンソースの代替手段のようだから。
FeedLanternは現在v0.2.2を公開しており、MITライセンスでオープンソース化されている。プロジェクトのコードとデプロイ用ファイルはGitHubリポジトリにある。役に立てばうれしい。