概要

Newsnowは、リアルタイムで最新ニュースを配信するオープンソースプロジェクト。クリーンで洗練されたUIデザインにより、快適なニュース読体験を提供する。プログラマティックなニュース配信取得が必要なアプリケーション開発者やメディア関係者に向けたツールで、GitHubで19,000以上のスターを獲得している。

[!NOTE] 現在のデモ版は中国語のみに対応している。より充実した機能とEnglishコンテンツ対応版は今後リリース予定。

flowchart LR A["各ニュースソース
(SNS・メディア・API)"] --> B["適応的スクレイピング
(最小2分間隔)"] B --> C["キャッシュレイヤー
(30分デフォルト)"] C --> D["Newsnow
バックエンド"] D --> E["統一Web UI
(フロントエンド)"] D --> F["MCP サーバー
(外部ツール連携)"] G["ログインユーザー"] -->|"キャッシュ強制更新"| C H["GitHub OAuth"] --> G D --> I["Cloudflare D1
データベース"]

主な機能

  • クリーンで洗練されたUIデザイン:快適な読体験を実現
  • リアルタイムなトレンドニュース更新:最新情報を随時配信
  • GitHub OAuthログイン:ログイン時のデータ同期に対応
  • 30分間のデフォルトキャッシュ:ログインユーザーはキャッシュ更新を強制実行可能
  • 適応的なスクレイピング間隔:ニュースソースの更新頻度に基づき(最小2分間隔)、リソース使用を最適化してIP制限を回避
  • MCPサーバー対応:他のツールとの連携をサポート
{
  "mcpServers": {
    "newsnow": {
      "command": "npx",
      "args": [
        "-y",
        "newsnow-mcp-server"
      ],
      "env": {
        "BASE_URL": "https://newsnow.busiyi.world"
      }
    }
  }
}

BASE_URL を独自ドメインに変更可能。

導入方法

基本的なデプロイ

ログインとキャッシング機能なしでのデプロイ:

  1. このリポジトリをフォーク
  2. Cloudflare Pages、Vercelなどのプラットフォームにインポート

Cloudflare Pages設定

  • ビルドコマンド:pnpm run build
  • 出力ディレクトリ:dist/output/public

GitHub OAuth設定

  1. GitHub Appを作成
  2. 特別な権限は不要
  3. コールバックURLを設定:https://your-domain.com/api/oauth/github(your-domainを実際のドメインに置き換え)
  4. Client IDおよびClient Secretを取得

環境変数

example.env.server を参照。ローカル開発では .env.server にリネームして以下を設定:

# Github Client ID
G_CLIENT_ID=
# Github Client Secret
G_CLIENT_SECRET=
# JWT Secret(通常はClient Secretと同一)
JWT_SECRET=
# データベース初期化(初回実行時はtrue、その後はオフ可能)
INIT_TABLE=true
# キャッシュ有効化
ENABLE_CACHE=true
NewsNow設定のポイント
  • Cloudflare D1を使う:データベースはCloudflare D1の使用が推奨されている。Cloudflare Pagesとの親和性が高く、無料枠で十分運用できる
  • INIT_TABLEは初回のみtrue:2回目以降の起動時は INIT_TABLE=false にしてテーブルの再初期化を避ける
  • JWT_SECRETの設定:セッション管理に使われるため、ランダムな文字列を設定する。デフォルトのままにしない
  • スクレイピング間隔の調整:各ソースの更新頻度が高い場合は最小間隔(2分)に近い設定を選択する。IP制限を受けやすいソースは間隔を広げる

データベース対応

複数のデータベースコネクタに対応しており、詳細はSupported database connectorsを参照。Cloudflare D1 Databaseの使用が推奨される。

ニュースソースの追加方法

ソースの追加はTypeScriptファイルを作成してエクスポートするだけで完結する:

// src/sources/my-source.ts
import type { NewsItem } from "../types"

export default {
  name: "My News Source",
  interval: 10 * 60 * 1000, // 10分間隔
  async fetchData(): Promise<NewsItem[]> {
    const res = await fetch("https://example.com/api/news")
    const data = await res.json()
    return data.items.map((item: any) => ({
      title: item.title,
      url: item.url,
      time: new Date(item.publishedAt).getTime(),
    }))
  },
}

スクレイピングを使ったソースの追加についてはCloudflare Bypass For Scrapingも参考になる。

NewsNowが特に活きるユースケース

  • 開発者向けニュースダッシュボードの自社構築:GitHub、Hacker News、技術ブログなど複数の情報源を一画面で確認できる社内ポータルを手軽に立ち上げられる
  • AIニュース特化アグリゲータの運営:特定ジャンルのニュースソースだけを集めたメディアサイトをセルフホストで運営する用途に適している
  • MCPサーバー経由でのAIエージェント連携:Claude等のAIツールからニュース情報をリアルタイム取得するバックエンドとして機能させられる
  • SNS自動投稿との連携:取得したニュースデータを[Postiz等のSNS管理ツール](/tool/postiz-app/)と連携させ、キュレーションから投稿までを自動化するパイプラインを構築できる

まとめ

Newsnowは、複数のニュースソースを統一インターフェースで管理するための軽量なOSSアグリゲータ。Cloudflare PagesやVercelへの簡単なデプロイ、MCPサーバー対応による外部ツール連携、適応的スクレイピングによるIP制限回避など、実運用を意識した機能が揃っている。

現時点では中国語コンテンツが中心だが、ソースコードをカスタマイズすることで任意の言語・ジャンルのニュースアグリゲータとして活用できる。自社メディアやAIエージェントのニュースバックエンドを検討しているチームに向いたプロジェクトだ。

参照ソース