x.com のポスト本文を Shift+Alt クリック、または右クリックメニューから選ぶと、そのポストをシークレットウィンドウで開く Chrome 拡張です。
Chrome の「シークレット ウィンドウで開く」はリンクの右クリックメニューの項目です。カーソルの下に <a> 要素があるときにしか出ません。
x.com のタイムラインでは、ポスト本文は <a> ではなく <div> にクリック処理が付いているだけです。だからポスト本文を右クリックしても、その選択肢は出てきません。<a> なのはタイムスタンプなど一部だけです。
この拡張は、そのリンクになっていない場所からポストのURLを割り出して開きます。
| 操作 | 結果 |
|---|---|
| ポストのどこかを Shift+Alt クリック | そのポストをシークレットウィンドウで開く |
| ポストのどこかを右クリック →「このポストをシークレットウィンドウで開く」 | 同上 |
ポストの外(サイドバー、余白)での動きは、2つの操作で違います。
| ポストの外での操作 | 結果 |
|---|---|
| 右クリック → メニューの項目を選ぶ | シークレットウィンドウは開かず、画面下に短い案内が出ます |
| Shift+Alt クリック | 何も起きません(案内も出しません)。普通のクリックとして扱われます |
リンクの上で Shift+Alt クリックしたときの扱いは、リンクの行き先で変わります。
| リンクの種類 | Shift+Alt クリックの結果 |
|---|---|
| ポストのパーマリンク(タイムスタンプなど)、ポストの画像へのリンク | そのポストをシークレットウィンドウで開きます(画像などの派生リンクはポスト本体に戻してから開きます) |
| プロフィール、外部記事、ハッシュタグなど、ポストのURLでないリンク | 何もしません。 拡張は介入せず、Chrome とページ本来の動作に任せます |
右クリックメニューはこの制限を受けません。メニューの文言どおり、そのリンクが載っているポストを開きます。
Windows の一部の構成では、Left Alt+Shift が入力言語またはキーボードレイアウトの切替に割り当てられていることがあります。 その構成で Shift+Alt クリックすると、ポストを開く操作と同時に入力言語が切り替わる場合があります。この割り当ては Windows 側の設定によるもので、この拡張が原因ではありません。
- 右クリックメニューはこのショートカット競合の影響を受けません。 確実に使えるのはこちらです
- 割り当ては Windows 側の設定で変えられますが、設定画面の名称と場所は Windows の版・表示言語によって異なります。「入力言語のホットキー」にあたる項目を探してください
- AltGr キーを押しながらのクリックには反応しません。 多くの Windows 配列(US-International など)では AltGr が Ctrl+Alt として届きます。加えて修飾キーの状態(AltGraph)も直接見ているので、AltGr が Ctrl+Alt として届かない構成でも、記号を打ちながらのクリックで誤って動くことはありません
x.com/www.x.com/twitter.com/www.twitter.comのページ上でのみ動きます- 第三者のサイトに埋め込まれたポスト(
platform.twitter.comの iframe)では動きません。メニュー項目も出しません pro.x.com(X Pro)は画面の作りが別で、対象外です
| 要求する権限 | contextMenus と scripting の2つ |
| 端末内で取り扱うもの | 右クリック/Shift+Alt クリックした場所の周辺のハイパーリンクと、そこから取り出したポストのURL1件(投稿者のユーザー名にあたる部分を含みます) |
| 開発者側への送信 | なし(開発者が管理するバックエンド・解析サービス・広告サービス・外部APIのいずれも使いません) |
| Chrome による通常のページ読み込み | あり。 ポストを開けば、Chrome がそのURLへ通常どおりページを読み込み、X がその通常の要求を受け取ります(拡張が情報を付け足すことはありません) |
| 一時的な保持 | 右クリック経路のURL1件を、そのタブのメモリに置きます。60秒を超えた値は使いません。 置いたときのタイマーが60秒後以降の最初の機会に参照を消し、それより前でも一度使う・別の場所を右クリックする・ページを離れると捨てられます。リンクを直接開いた回では、そのリンク上の右クリックで控えた同じポストの値なら、消すよう試みます(依頼が届かない・応答が返らない場合でも開く動作は待ちません。60秒の期限・タイマー・次の右クリック・ページ移動・タブを閉じることが受け皿になります) |
| 永続的な保存 | なし(ディスクにも chrome.storage にも書きません) |
scripting を使うのは1箇所だけです。拡張のインストール・更新より前から開いていたタブに、content script を入れ直すときにだけ呼びます(Chrome は既に開いているタブへ遡って content script を入れないため、これが無いとインストール直後の右クリックが必ず空振りします)。ホスト権限も上記4つのドメインに限っています。
詳細は PRIVACY.md。
- 毎回あたらしいウィンドウが開きます。 既にあるシークレットウィンドウにタブを足す機能は持っていません。
chrome://extensionsの「シークレット モードでの実行を許可」をオンにしても、この動きは変わりません。オンにして増えるのは拡張に与える権限だけなので、この拡張のためにオンにする必要はありません - シークレットウィンドウは何枚開いても中身を共有します。最後の1枚を閉じるまでセッションが残ります
- ログインしていない状態でも、個別のポストは読めます。 6件を続けて開いて確かめたところ、全件で本文・引用・返信が表示され、ログイン画面へ飛ばされたものはありませんでした(2026-08-04 実測)。返信は最初の数件が出て、その先は「すべての返信を見る」という導線になります
- ただし年齢制限つきのメディアは表示されません(「このメディアを表示するには、X にログインしてください」と出ます)。本文とスレッドは読めます
Chrome ウェブストアで公開しています(2026-08-04 公開・v1.6.0)。
ソースから手動で読み込む場合
- このリポジトリを clone するか、ZIP でダウンロードして展開する
- Chrome で
chrome://extensions/を開き、右上の デベロッパー モード を ON にする - 「パッケージ化されていない拡張機能を読み込む」 から展開したフォルダを選ぶ
- すでに開いている x.com のタブがあれば再読み込みする
npm test # 自動テスト(すべて)
npm run check # JavaScript と JSON の構文検査
npm run package # ストア提出用の ZIP を dist/ に作るテストは test/ にあり、clone した直後に走ります(npm install は要りません)。同じものを GitHub Actions でも走らせています。
| 用途 | 必要なもの |
|---|---|
| 拡張そのもの | なし。外部の npm パッケージにも JavaScript ライブラリにも依存していません |
| 開発と、拡張のテスト | Node.js 22 以降 |
npm test の全体と npm run package |
Node.js 22 以降に加えて Git・Bash・zip・unzip・cmp・mkfifo、shasum か sha256sum のどちらか、およびシンボリックリンクを扱える POSIX 環境 |
npm run test:unit |
Node.js 22 以降だけ。提出物を作る手順のテストを除いたもので、Windows でも走ります |
npm test には、提出用 ZIP を作る手順そのものを実際に起動して確かめるテストが含まれます。そのため、拡張のコードだけを見る場合より必要なものが多くなります。Node.js だけを入れた素の Windows では全体は走りません。 WSL か、必要な道具の揃った Git Bash などを使ってください。足りない道具があるときは、テストの冒頭で名前を挙げて止まります。
個人が開発している非公式ツールです。導入を判断する材料として、自動で確かめられること・実機で1度確かめたこと・まだ確かめていないことを分けて書きます。
npm test で誰でも再現できます。
- URL の判定 — 許可するホストとパスの形、派生ページ(
/photo/1・/analyticsなど)のポスト本体への正規化、クエリとフラグメントの除去、ホスト偽装・非標準ポート・URL に埋め込まれた資格情報・余分なセグメントの拒否 - content script の組み立て — 同じ版を2回読み込んでも listener が二重に登録されないこと、ポストの内側と外側での右クリックと Shift+Alt クリックの結果、通知の帯に読み上げ用の属性が付いていること
- manifest と翻訳ファイルの整合 —
__MSG_*__が日英どちらにも存在すること、manifest が挙げているファイルが実在すること、ウェブストアの文字数上限に収まっていること、効かせるオリジンが4つの完全一致のままであること(<all_urls>やワイルドカードへの置き換えを拒む) - background service worker — メニューの作り方、右クリックしたリンクがポストのときの経路、content script から返ったURLの再検証、content script がいないタブでの入れ直し
- 提出物の作られ方(
integration/package-script.js)— 配布一覧と manifest の突き合わせに加えて、実際にtools/package.shを起動して、未コミットの変更・index の印・HEAD との中身の食い違い・出力先の差し替え・途中のコマンド失敗で必ず止まること。npm testでは走り、npm run test:unitでは走りません
macOS の Chrome で1度ずつ確認した記録です。自動では再現しません(手順は SMOKE.md)。
| いつ | 何を |
|---|---|
| 2026-08-03 | 右クリックメニューが x.com で出て example.com では出ない。Shift+Alt クリックで期待どおりのポストがシークレットウィンドウで開く |
| 2026-08-03 | 「シークレット モードでの実行を許可」がオフのままでもシークレットウィンドウが開く |
| 2026-08-04 | ログインしていない状態でポスト6件を続けて開き、全件で本文・引用・返信が表示された。ログイン画面へ飛ばされたものは0件(年齢制限つきメディアだけは表示されない) |
| 2026-08-05 | URL の判定を post-url.js へ移したあとの版で、拡張の読み込み・右クリック・Shift+Alt クリック・引用つきポスト・拡張の再読み込み後の動作を確認(SMOKE.md の #1・#4・#5・#10・#11・#18)。6項目すべて期待どおりで、拡張を再読み込みしてもシークレットウィンドウは1枚だけ開いた |
| 2026-08-05 | 提出用の ZIP を展開して読み込んだ状態で、#1・#4・#5・#7b・#7c・#8b・#18 を確認。7項目すべて期待どおり。 リンクの扱い(パーマリンクは開く/画像はポスト本体へ戻す)と、ポスト外での右クリックと Shift+Alt の違いも実測した。対象は base commit 026f5d1(版は同じ v1.6.1 ですが、その後の未コミット差分を当てる前の状態です。60秒タイマーの handle・isTrusted・AltGr の変更はこの記録の対象外) |
- 上の記録はすべて base commit
026f5d1に対するものです。 その後の差分(60秒タイマーの handle・isTrusted・AltGraph/AltGr・Windows 向けの文書・リンクを直接開いた回の値の消去・提出物の作られ方の検査)は、自動テストでは通っていますがブラウザ実機では確かめていません。版の番号は同じ v1.6.1 のままなので、版だけでは中身を判別できません(詳細は SMOKE.md の「まだ確かめていないこと」) - Windows 実機での W1〜W5
- Windows / Linux での表示
- 「シークレット モードでの実行を許可」がオフであることの画面での目視。既定はオフで、読み込み後にオンにしていなければオフのままですが、
chrome://extensionsは自動で開けないため確認していません
開発中に手元で測ったもので、記録として残します。上の自動テストとは別物です。
- ログイン状態の x.com(ホーム/プロフィール)で固有ポスト14件。本文・引用ボックス・ユーザー名リンク・タイムスタンプの各起点で誤り0(2026-08-03)
- 同じ判定の前の版で、固有ポスト52件と引用ポスト5件でも誤り0(2026-08-03)
継続的な保守を約束できる体制ではありません。不具合は Issue でお知らせください。
着想は francoischalifour/incognito-link から得ています(同リポジトリは 2017年6月で更新が止まっています)。初期版は ChatGPT との対話で書きました。
本拡張は X Corp. とは無関係の独立したツールで、同社による承認・後援を受けていません。X および Twitter は X Corp. の商標です。