{"id":50187800,"url":"https://github.com/kui/hn-ja-summary","last_synced_at":"2026-05-25T11:05:23.669Z","repository":{"id":358257172,"uuid":"1240681436","full_name":"kui/hn-ja-summary","owner":"kui","description":"Hacker News で短い時間で話題になったものを取り上げる","archived":false,"fork":false,"pushed_at":"2026-05-24T01:40:08.000Z","size":143,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"production","last_synced_at":"2026-05-24T03:20:14.649Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://hn-summary.k-ui.jp","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kui.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-16T12:40:58.000Z","updated_at":"2026-05-24T01:40:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kui/hn-ja-summary","commit_stats":null,"previous_names":["kui/hn-ja-summary"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kui/hn-ja-summary","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kui%2Fhn-ja-summary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kui%2Fhn-ja-summary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kui%2Fhn-ja-summary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kui%2Fhn-ja-summary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kui","download_url":"https://codeload.github.com/kui/hn-ja-summary/tar.gz/refs/heads/production","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kui%2Fhn-ja-summary/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33471535,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-25T06:32:55.349Z","status":"ssl_error","status_checked_at":"2026-05-25T06:32:35.322Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-25T11:05:19.163Z","updated_at":"2026-05-25T11:05:23.660Z","avatar_url":"https://github.com/kui.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# HN Summary Feed\n\nHN トレンド記事を自動検出し、元記事とコメントを Gemini で日本語要約して RSS\n配信するシステム。\n\n- フィード配信 \u003chttps://hn-summary.k-ui.jp\u003e\n- 管理 UI \u003chttps://hn-feed-admin.k-ui.workers.dev\u003e\n\n## アーキテクチャ\n\n詳しくは [architecture.mermaid](architecture.mermaid)\n\n```\nCron Trigger\n  └─→ backend-worker (scheduled)\n        ├─ Algolia HN API: 最近のストーリーを取得\n        ├─ velocity フィルタ\n        ├─ D1: processed_items で重複チェック\n        └─ CF Queue: 未処理を投入\n\nCF Queues (hn-processor)\n  └─→ backend-worker (queue)\n        ├─ Algolia HN API: コメントツリー取得\n        ├─ Jina + raw fetch: 元記事取得\n        ├─ Gemini: 日本語要約生成\n        └─ D1: feed_items / processed_items 更新\n\nfeed-worker (fetch handler)\n  ├─ GET /feed.xml    → RSS (Inoreader で購読)\n  └─ GET /items/{id} → 要約 HTML ページ\n\nadmin-worker (fetch handler, Cloudflare Access で保護)\n  └─ GET, POST /enqueue → 投稿を手動でキューに追加\n```\n\n## ディレクトリ構成\n\n```\nshared/      共通型定義・HN API クライアント・フィルタ\nbackend/     scheduled (poller) + queue (processor) を担う Worker\nfeed/        RSS 配信・要約 HTML ページ配信 Worker\nadmin/       手動キュー投入 UI Worker（Cloudflare Access で保護）\nmigrations/  D1 共通マイグレーション\nscripts/     GitHub Secrets 同期スクリプト\n```\n\n## 環境変数\n\n### feed-worker / admin-worker\n\nバインディングのみ。シークレット不要。\n\n### backend-worker (wrangler secret で投入)\n\n| 変数             | 説明            |\n| ---------------- | --------------- |\n| `GEMINI_API_KEY` | Gemini API キー |\n| `JINA_API_KEY`   | Jina API キー   |\n\n## セットアップ手順\n\n`.env.example` をコピーして値を埋める。\n\n```bash\ncp .env.example .env\n# .env を編集して各値を記入\n```\n\nGitHub Secrets への反映:\n\n```bash\nbash scripts/sync-github-env.sh\n```\n\n### 1. git フック有効化\n\n```bash\ngit config core.hooksPath .githooks\n```\n\n### 2. 依存パッケージインストール\n\n```bash\nnpm install\n```\n\n### 3. Cloudflare D1 データベース作成（初回のみ）\n\n```bash\ncd feed\nnpx wrangler d1 create hn-feed\n```\n\n出力された `database_id` を `feed/wrangler.toml` と `backend/wrangler.toml` の\n両方に記入し、`CLOUDFLARE_D1_DATABASE_ID` を env に設定する。\n\n```bash\nnpx wrangler d1 migrations apply hn-feed --remote\n```\n\n### 4. CF Queue 作成（初回のみ）\n\n```bash\ncd backend\nnpx wrangler queues create hn-processor\n```\n\n### 5. シークレット投入（backend-worker）\n\n```bash\ncd backend\nwrangler secret put GEMINI_API_KEY\nwrangler secret put JINA_API_KEY\n```\n\n### 6. Cloudflare Access の設定（admin-worker）\n\nCloudflare Zero Trust ダッシュボードで admin-worker の URL に対して Access Application を作成し、許可するメールアドレスを設定する。これにより admin-worker はアプリケーションコードに認証ロジックを持たずに保護される。\n\n### 7. デプロイ\n\n```bash\nnpm -w feed run deploy\nnpm -w backend run deploy\nnpm -w admin run deploy\n```\n\n### 8. Inoreader で RSS 購読\n\n`https://hn-feed.\u003cyour-subdomain\u003e.workers.dev/feed.xml` を Inoreader に登録。\n\n## ローカル実行\n\n```bash\n# feed-worker\nnpm -w feed run dev\n\n# backend-worker (scheduled を手動発火)\nnpm -w backend run dev:scheduled\n\n# admin-worker\nnpm -w admin run dev\n```\n\n`wrangler tail -e production` でリアルタイムログ確認。\n\n## 掲載条件\n\n[`shared/filter.ts`](shared/filter.ts)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkui%2Fhn-ja-summary","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkui%2Fhn-ja-summary","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkui%2Fhn-ja-summary/lists"}