iArt.ai
AI motion graphics software — the After Effects alternative anyone can use. Create animations and explainer videos from a text prompt in minutes.
公式アプデ、長くて読む気にならない。それでも正確さは欲しい。だから要約して、『ようやくわかる』。
Translation pending
MediaGitHub @osanai1004OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
AI公式アプデをRSSで集め、日本語の「結論+使える場面」で読める更新リーダー『ようやくわかる』
Translation pending
Loading the full README.
Read the full README ↗公式アプデは正しい。でも長くて、読む気にならない——それでも正確さは欲しい人向けに、RSS で集めた公式更新を日本語の「結論+使える場面」だけで読める更新リーダーです。
Demo: https://yoyaku-wakaru.vercel.app
ChatGPT / Claude / Gemini などの更新を追いながら、「何が変わったか」「自分の仕事にどう効くか」だけ先に把握できます。
/library(JSON エクスポート / インポート / 全削除)保存・既読・ウォッチは localStorage(端末内だけに保存する領域)を使うため、認証・追加インフラなしで動きます。端末間の同期はありません。
| 役割 | 技術 |
|---|---|
| 画面・取り込み API | Next.js(Vercel) |
| RSS 取得 → 要約 → 送信 | Google Apps Script + Gemini |
| 記事の保存(任意) | Neon(Postgres)。未設定時はローカル JSON / サンプル表示 |
詳細ページでは読者タブと、要約の深さ(30秒で読む / 詳しく読む)を切り替えます。各ボイス共通で次の構成です。
terms データと Markdown コピーには残る)既存記事に詳細内容が無い場合は、そのセクションだけ非表示になります。GAS の backfillDualVoiceArticles で再要約すると埋まります。
| 名前 | どこに置くか | 用途 |
|---|---|---|
GOOGLE_API_KEY | GAS スクリプトプロパティ | Gemini 要約 |
INGEST_SECRET | Vercel 環境変数 と GAS(同じ値) | /api/ingest の認証 |
DATABASE_URL | Vercel 環境変数(推奨) | 本番の永続化(Neon) |
SLACK_WEBHOOK_URL | GAS(任意) | 新着の Slack 通知 |
画面を見るだけなら、キーなしでローカル起動できます(サンプル表示)。
npm install
cp .env.example .env.local
# 画面閲覧だけなら空のままでOK
# 取り込みや本番DB接続をするなら INGEST_SECRET / DATABASE_URL を埋める
npm run dev
ワンクリック Import(Vercel / GitHub にログイン済みの状態で開く):
https://vercel.com/new/import?s=https://github.com/osanai1004/ai-feed-digest
INGEST_SECRET = 長いランダム文字列DATABASE_URL を入れるCLI 例:
npx vercel link --yes
npx vercel env add INGEST_SECRET production
npx vercel --prod --yes
詳細は gas/README.md。
gas/Code.gs を貼り付けGOOGLE_API_KEY = Gemini API キーINGEST_URL = https://<your-app>.vercel.app/api/ingestINGEST_SECRET = Vercel と同じ値SLACK_WEBHOOK_URL = (任意)Slack Incoming WebhookAPP_BASE_URL = (任意)アプリのベース URLrunOnce を手動実行(初回は権限承認)… 新着のみ取り込みbackfillDualVoiceArticles(必要なら複数回)createDailyTrigger を実行createXSignalTrigger を実行(毎日 9 時台と 22 時台。平日 8:45 / 21:45 の投入の直後)監視対象(初期設定): OpenAI / Claude / Claude Code / Anthropic News / Google DeepMind / Google AI / Gemini / Cursor / Laravel / Vercel / Next.js / GitHub Changelog / Cloudflare / Supabase / AWS(Machine Learning)
Slack 通知は Webhook 未設定ならスキップされます(後から有効化可)。
POST /api/ingestAuthorization: Bearer <INGEST_SECRET>
Content-Type: application/json
{
"source": "OpenAI",
"title": "記事タイトル",
"url": "https://example.com/post",
"publishedAt": "2026-08-02T00:00:00.000Z",
"summary": {
"general": {
"conclusion": "非エンジニア向け結論1行目\\n2行目\\n3行目",
"detail": "詳細の補足1\\n詳細の補足2\\n詳細の補足3",
"situations": ["場面1", "場面2", "場面3"],
"terms": [{ "term": "API", "plain": "アプリ同士の接続口" }]
},
"engineer": {
"conclusion": "エンジニア向け結論1行目\\n2行目\\n3行目",
"detail": "詳細の補足1\\n詳細の補足2\\n詳細の補足3",
"situations": ["場面1", "場面2", "場面3"],
"terms": [{ "term": "API", "plain": "外部から機能を呼ぶインターフェース" }]
}
}
}
旧形式(summary.conclusion + summary.situations)も受け付け、両ボイスへ展開します。
X 由来の記事は、同じエンドポイントに次を足します。url は公式ページ、公式URLが無ければ xPostUrl と同じ投稿URLです。signalId は必須で、ready の候補だけを ingested にします。公式ページの本文を根拠にしたときだけ officialNote を付けます。結論はタイトルの転記では受け付けません。
{
"origin": "x",
"xPostUrl": "https://x.com/someone/status/123",
"officialNote": "公式もこう言っている",
"signalId": "s_0123456789abcdef"
}
origin を付けない既存の RSS 取り込みはそのまま動きます。同じ公式URLが既にあれば1件にまとまり、後から付いた X のリンクは RSS の再取り込みでは消えません。
POST /api/intake浅子がブラウザで拾った X の候補を渡す入口です。X の API は使いません。Authorization: Bearer <INGEST_SECRET> が必要です。
{
"items": [
{
"xPostUrl": "https://x.com/someone/status/123",
"text": "Claude の新しいモデルが公開された、という投稿本文",
"source": "Claude",
"author": "@someone",
"publishedAt": "2026-10-01T00:00:00.000Z",
"impressions": 12000,
"reposts": 80,
"likes": 340
}
]
}
1件だけなら items なしで同じフィールドを直に渡せます。サーバーが粗い仕分けをします。impressions(表示回数)・reposts(リポスト数)・likes(いいね数)は任意です。X の public_metrics でも同じ数値を読めます。無い項目は 0 として保存しません。
| 結果 | 意味 |
|---|---|
pending_review | 浅子の確認待ち |
filtered | 短すぎる、または監視製品名が無い。restore で確認待ちに戻せる |
| 同じ URL の再送 | 確認待ち以降は本文を上書きしない(duplicate: true)。数値が付いていれば、公開から14日以内の既存X記事の表示回数だけ更新する(1回あたり最大20件)。その1回だけ広げるときは、items と同じ階層に metricsRefreshWindowDays(1以上30以下の整数。例: 17)を付ける。省略すると14日のまま |
GET /api/intake同じ秘密文字列が必要です。status を省略すると作業列(pending_review / needs_factcheck / ready)です。memo や filtered、all も指定できます。
POST /api/intake/:id浅子と龍馬の判断です。actor は記録用です(認証の分けはまだありません)。
| action | 誰 | 結果 |
|---|---|---|
approve + officialUrl | 浅子 | ready。GAS が公式ページを読んで2ボイス要約する |
approve(投稿URLあり・公式URLなし) | 浅子 | ready。GAS が投稿本文から2ボイス要約し、記事URLは投稿URL |
approve(memo。投稿URLあり、公式URLは任意) | 浅子 | ready。確認待ちと同じ条件。メモは自動では動かさない |
flag_factcheck | 浅子 | needs_factcheck。裏取りが曖昧なとき龍馬へ |
resolve_factcheck + officialUrl | 龍馬 | ready |
resolve_factcheck(投稿URLあり・公式URLなし) | 龍馬 | ready。要約の根拠は投稿本文 |
reject | どちらでも | rejected |
restore | 浅子 | filtered を確認待ちに戻す |
公式URLも投稿URLも無い承認は受け付けません。公式本文が取れた X 記事には「公式もこう言っている」を出します。投稿だけが根拠の記事は「投稿から要約」と出します。以前のルールで残ったメモは /memos に残ります。記事にするには POST /api/intake/:id で action を approve にします。投稿URLがあれば公式URLは空のままでよく、一括では ready にしません。
期間は「直近3日」(window 省略時。公開日時が今から72時間以内)と「すべて」(window=all)の2つです。期間側に並び順 order=new(新しい順・既定)/order=old(古い順)を持ちます。
Xチャネル(/?channel=x)だけ、並び替え sort=latest(指定なし)、sort=impressions(インプレッション数)、sort=reposts(リポスト数)、sort=likes(いいね数)を選べます。数値を選ぶとその数値の多い順を一番目にし、数値が無い記事は後ろに並べ、同じ値(と数値が無い記事どうし)の中は期間側の新しい順・古い順です。「指定なし」は期間側の並び順だけで並べます。期間・チャネル・並びは SQL(src/lib/articleQueries.ts)で行います。All と公式サイトには並び替えを出しません。カードには取得できたインプレッションとリポスト数を出します。いいね数があればそれも出します。
GET /api/articles保存済み記事一覧(全件。GAS の手動メンテ用)。?id= を付けると1件だけ返します。
VoltAgent/awesome-design-md の Clay / Framer 系を参考にしたカード UI です。