X (x.com / twitter.com) で実際に表示されたツイートやメディアを記録し、サイドパネルのフィードとして表示する Chrome 拡張 (Manifest V3) です。データは chrome.storage.local にのみ保存されます。
- IntersectionObserver による表示判定 + 短時間の視認ゲート
- 短期履歴: TTL 10 分 / 最大 500 件
- フィルタ: All / Tweets / Media
- ローカル保存のみ (外部送信なし)
- サイドパネル UI で素早く確認
- コンテンツスクリプトが新しいツイート要素を監視し、表示されたら抽出します。
- ツイート本文、投稿者、時間、画像、動画の有無を取得します。
- 取得結果をバッチ化してバックグラウンドに送信します。
- バックグラウンドでマージ/重複排除し、TTL と上限件数を適用します。
- サイドパネルが
feed_logを読み込み、カード表示します。
chrome://extensionsを開きます。- Developer mode を有効にします。
- "Load unpacked" をクリックし、本リポジトリを選択します。
https://x.comまたはhttps://twitter.comを開きます。- タイムラインをスクロールします。
- 拡張機能のアクションからサイドパネルを開きます。
- フィルタで All / Tweets / Media を切り替えます。
src/background.jsTTL_MS(10 分)MAX_ITEMS(500)STORAGE_KEY(feed_log)
src/content.jsIO_THRESHOLDMIN_VISIBLE_MSFLUSH_INTERVAL_MSFLUSH_MAX_ITEMSKEY_COOLDOWN_MS
test/test_runner.html をブラウザで開くと、モックのツイート DOM に対して content script が動作します。chrome.runtime.sendMessage をモックし、送信バッチを画面に表示します。
chrome.storage.local の feed_log に保存されます:
type LogItem = {
key: string;
type: "tweet" | "image" | "video";
url: string;
tweetUrl?: string;
text?: string;
author?: string;
timeISO?: string;
seenAt: number;
source?: { pageUrl?: string };
};- 動画はプレースホルダーで、実体 URL は取得しません。
- X の
data-testid依存のため、DOM 変更で取得できなくなる可能性があります。 manifest.jsonが参照するicon16.png,icon48.png,icon128.pngは未同梱です。
.
├─ manifest.json
├─ src/ # content/background scripts
├─ feed/ # Side Panel UI
└─ test/ # test runner
MIT License. 詳細は LICENSE を参照してください。