product update17分で読めます

Clip は、ウェブページを要約まで書き終えたノートにする。今日から、すべての Telli.sh アカウントに開きます

Clip は、ウェブページを保存するだけでなく、AI が書いたタイトルと一行要約が付いた Telli.sh のノートに変えます。この機能は管理者フラグの裏で出荷されたため、2 つの分析カウンターは一度も動きませんでした。そのゲートを取り払いました。無料アカウントでも 1 日あたり 30 件の保存と 10 件の AI 要約が使えます。ブラウザー拡張機能のバージョン 1.18 は、クリップの保存以外は何もできないトークンで認証する右クリックの Save to Telli.sh を追加します。

K
Ken Jo
#clip#web-clipper#browser-extension#product-update#api-tokens#privacy

どんなテストスイートにも捕まえられない種類のバグがあります。機能はちゃんと動いていて、誰もそこに辿り着けない、というバグです。

Clip は何週間も前から完成していました。モーダルは POST /v1/clip で保存し、ページの公開メタタグからリンクカードを埋め、一行の AI 要約を生成し、ノートのキャッシュを無効化し、「保存はできたが要約の割り当てを使い切った」と「これは失敗した」をすでに区別できます。そのすべてが動いています。それなのに PostHog では、この機能が報告する 2 つのイベント——clip_openedclip_created——が一度も発火していませんでした。まれにでもなく、ゼロです。

原因はフロントエンドの 3 行でした。サイドバーのボタンもモーダルも user.is_master でゲートされ、ボタンには琥珀色の Admin preview バッジが付いていました。バックエンドは is_master で何ひとつゲートしていません。バックエンドが課すのはプランごとの 1 日あたりの割り当てで、制限を置くべき場所はそちらです。この機能は使われていなかったのではありません。辿り着けなかったのです。

2026 年 9 月 5 日のコミット 64852ac をもって、条件は「サインインしているか」だけになりました。この記事はプロダクトのお知らせなので、意図して製品中心に書いています。Clip が何をするのか、あなたから何をどれだけ使うのか、ブラウザー拡張機能が何を送るのか、そして何を意図的に決して読まないのか。

TL;DR

  • Clip はサインイン済みのすべてのアカウントに開きました。 サイドバーのボタンは 2026 年 9 月 5 日に管理者バッジを外しました。
  • 制限はゲートではなく 1 日あたりの割り当てです。 無料は UTC の 1 日あたり保存 30 件と AI 要約 10 件。plus、pro、pro+ はそこから上がります。正確な数値は下の表にあります。
  • 要約の割り当てを使い切っても、クリップは失われません。 リンクとメタデータはそのまま保存され、スキップされるのは要約だけで、アプリがそう伝えます。
  • 拡張機能は、いま開いているページを保存できます。 「Save to Telli.sh」は http(s) のページならどこでも右クリックメニューに現れ、選択していたテキストがあれば一緒に運びます。バージョン 1.18 はこの記事の公開時点で Chrome ウェブストアの審査中で、まだインストールできません。
  • 拡張機能は、クリップの保存しかできないトークンで認証します。 そのトークンはノートを読むことも、アカウントを変えることも、請求に触れることも、別のトークンを発行することもできません。シークレットが表示されるのは一度きりで、いつでも失効させられます。
  • 拡張機能が読むのは、ページがすでにあなたに見せているものです。 タイトル、canonical リンク、公開されている og:/twitter: メタ、そしてあなたの選択範囲。本文は読みません。あなたのクリックなしに何もブラウザーの外へ出ませんし、トークンが保存されていなければメニュー項目は何もしません。

URL を 1 つ渡したとき、Clip が実際にすること

サイドバーから Clip を開いて URL を貼り付けると、モーダルは POST /v1/clip/metadata を呼びます。このエンドポイントはページの HTML を取得し、公開メタタグだけを読みます。og:titleog:descriptionog:imageog:site_namearticle:authorarticle:published_time、そして <link rel="canonical">。タイトル、説明、サイト名、画像が埋まって返ってきます。取得に失敗した場合はモーダルがそう伝え、サイト名の位置にホスト名を置いたままリンクだけでも保存させてくれます。

そして保存すると、Clip はノートになります。添付ファイルでもなく、別リストに溜まるブックマークでもありません。note_type="clip" を持つノートとして、ほかのすべてと並んですべてのノートに収まり、同じ仕組みで検索でき、フォルダーに入れられ、共有でき、書き出せます。元の URL とリンクカード全体はノートのコンテキストに保存されるので、出どころが要約の裏に消えることはありません。

要約する材料が何かあれば——説明文、選択したテキスト、貼り付けたメモ——一般要約が走り、一行の要約をノートに書き込みます。一覧でタイトルの下に見えるのが、その行です。

Telli.sh のすべてのノート一覧に並ぶ 3 件のウェブページのクリップ。要約行のない Hacker News、そしてそれぞれ下に一行要約が付いた Fetch API Overview and Practical Considerations と、AI を活用した開発プラットフォームとしての GitHub

2026 年 9 月 5 日に本番アカウントへ保存された 3 件のクリップが、通常のノートの隣ですべてのノートに収まっています。記事のクリップ 2 件には AI が書いたタイトルと一行要約が付いています。Hacker News のトップページは description メタを公開しておらず、選択テキストもなかったため、要約する材料が何もありませんでした。だから自分のタイトルをそのまま保ち、要約行はありません。Clip は扱う材料がないとき、でっち上げる代わりに何も言いません。

この最後の一点こそ、この機能全体を支える設計上の規則であり、独立して述べておく価値があります。AI の出力が原本を置き換えることはありません。 元の URL、サイト自身のメタデータ、あなたが与えたテキストは保持されます。要約はその上に重ねられた派生データです。要約が誤っていても役に立たなくても、あなたが実際に保存したものはそこに残っています。

制限は 1 日あたりの割り当てで、それが唯一の制限だ

Clip にプランのゲートはありません。あるのは量です。

プラン1 日の保存数1 日の AI 要約数
Free3010
Plus15050
Pro500150
Pro+2,000500

backend/config.py の既定値(CLIP_SCRAPE_DAILY_QUOTA_*CLIP_SUMMARY_DAILY_QUOTA_*)、2026 年 9 月 5 日に確認。

割り当ては 1 つではなく 2 つで、意図的に違う壊れ方をします。保存の割り当てを使い切ると保存は拒否されます。サーバーは構造化された clip_scrape_quota_exceeded コードとリセット日を添えて 403 を返します。要約 の割り当てを使い切った場合、クリップはそのまま保存され、スキップされるのは要約の工程だけで、アプリはまさにそう伝えます。「クリップを保存しました。本日の AI 要約の割り当ては使い切りました。」

この非対称は意図的です。リンクを保存するのは安く、そしてあなたが本当に欲しかったのはそれです。高くつくのは要約のほうです。言語モデルがレート制限に当たったという理由で、取っておきたかったページを失うのは馬鹿げた取引なので、私たちはその取引を作りません。

カウンターはただの UTC のカレンダー日付です。00:00 UTC にあなたの 1 日がリセットされます。誰にとっても同じ瞬間で、頭の中で計算しなければならない 24 時間のローリングウィンドウではありません。

「Save to Telli.sh」は右クリック 1 回の距離にある——1.18 が承認されれば

ウェブのモーダルは、URL がクリップボードにあることを前提にしています。たいていの場合、手元にあるのはそのページのほうです。

Telli.sh: Every Translator 1.18 は、コンテキストメニュー項目 Save to Telli.sh を追加します。http://*/*https://*/* において pageselection の両方のコンテキストに登録されるので、拡張機能が翻訳する 30 ほどのサイトだけでなく、あらゆるウェブページで使えます。記事のどこかで右クリックすれば保存されます。先に段落を 3 つ選んでおけば、それも最大 2,000 文字まで一緒に運ばれます。

フィードバックは、拡張機能がすでに持っているツールバーバッジに乗ります。保存中は 、成功は 、失敗は !。それぞれの説明はツールバーのツールチップに出ます。失敗メッセージが具体的なのは、サーバーのエラーが具体的だからです。401 はトークンが拒否されたという意味で、新しいトークンが必要です。403 は異なる 2 つのことを意味し、拡張機能はレスポンスボディの *_quota_exceeded コードを探して両者を見分けます。割り当ての使い切り(「また明日どうぞ」)か、クリップ権限のないトークン(「このトークンではそれができません」)か。同じステータスコードで、正反対の助言です。

バージョン 1.18 は 2026 年 9 月 5 日時点で Chrome ウェブストアに提出済み、審査中です。 まだインストールできません。承認されれば自動更新として届き、コンテキストメニューもそれと一緒に現れます。

書き込み専用の鍵——このトークンはクリップを保存でき、それ以外は何もできない

ここが私たちのいちばん気にかけた部分です。この種の連携が普通おかしくなるのは、まさにここだからです。

「拡張機能をアカウントにつなぐ」の怠惰なやり方は、セッショントークンを拡張機能に貼り付けさせることです。そのトークンはすべてを開きます。ノートを削除し、データを書き出し、請求に触れます。ブックマークボタン 1 つと引き換えにアカウントの資格情報を丸ごと渡すことになり、それが拡張機能のストレージに永久に居座ります。

だから Clip はそのトークンを使いません。Telli.sh は Cloudflare の方式にならった スコープ付き API トークン を発行します。トークンはあなたの代わりを務めるのではなく、ポリシーのリストを持ちます。各ポリシーは effectallowdeny、競合したら deny が勝ちます)、resources の集合、そして権限グループの集合からなります。今日存在するグループはちょうど 1 つ、clip_write で、clip:writeclip:metadata の権限に展開されます。リソースの形もちょうど 1 つ、{"user": "self"} ——あなた自身のデータ、それ以外はありません。

私たちはこれを 書き込み専用の鍵 と呼んでいます。形がまさにそうだからです。アカウントの中へものを入れることはできて、外へ持ち出すものは何もありません。

これを本当に成り立たせている安全上の不変条件は、設計文書の一文です。API トークンがセッション認証の経路を通ることは決してない。 セッションクッキーとアクセス JWT は get_current_user_optional を通って解決され、その経路は製品のあらゆるエンドポイントに届きます。API トークンは require_permission(...) の依存関係を通してのみ解決され、その依存関係が求める権限がトークンになければ答えは 403 です。この分離が壊れれば、スコープ付きトークンは静かにまたフルアカウントのトークンに戻ります。だからこそ設計上もっとも重要な規則として明記されています。ありがたい二次効果もあります。API トークンは不透明な文字列なので、JWT のデコードは必ず失敗します。万が一セッションのコード経路に紛れ込んでも、誰でもない者として認証されるだけです。

トークンの API 自体は、トークンに対して閉じています。トークンの作成、一覧、失効には本物のサインイン済みセッションが必要です。トークンが別のトークンを発行することはできません。

作るのに 15 秒ほど

設定 → API トークンへ進みます。まだ 1 つも持っていない段階で、このページは、これから作ろうとしているものに何ができるのかを正直に述べます。

トークンがまだ 1 つもない Telli.sh の API トークン設定ページ。トークン名の入力欄と Save clips の権限チェックボックス 1 つだけを持つ作成フォーム、そして No tokens yet と書かれた空の状態

トークンが 1 つも存在しない状態の /settings/tokens の API トークンページ、2026 年 9 月 5 日に撮影。スコープを述べる一文はヘルプ記事に埋もれず、フォームの上に置かれています。「トークンにできるのはクリップの保存だけです。ノートを読むことも、アカウントを変えることも、請求情報に触れることもできません。」提示される権限が 1 つなのは、存在する権限が 1 つだけだからです。

名前を付け、Save clips にチェックを入れ、作成します。完全なシークレットが一度だけ表示され、そのパネルが赤字でそう伝えます。

今すぐトークンをコピーするよう促す一度きりのトークンパネル。トークンが表示されるのはこの一度だけという警告、一部が伏せられた tsh_ トークン、そして Copy token と I saved it のボタン

一度きりのシークレットパネル。このスクリーンショットのトークンは伏せてあり、それが属していたアカウントは削除済みです。トークンの形は tsh_<12-character prefix>_<43-character secret> で、256 ビットの base64url 乱数です。平文で保存されるのは検索キーとしてのプレフィックスだけで、シークレットは bcrypt ハッシュとして保存され、私たちにもあなたにも復元できません。このパネルを閉じれば、永久に消えます。

その後、一覧に残るのはプレフィックスだけです。2 つのトークンを見分けるには十分で、スクリーンショットを盗んだ人には役に立ちません。

My browser extension という名前のトークンが 1 つ、Active バッジ、tsh_ プレフィックス、Save clips のスコープ、作成時刻、Last used: Never used、そして赤い Revoke の操作とともに並ぶトークン一覧

シークレットパネルを閉じたあとの同じトークン。プレフィックス、スコープ、作成時刻、最終使用時刻、そして失効。last_used_at はリクエストごとではなく多くても 1 時間に 1 回書き込まれるので、クリップのたびにデータベース書き込みを増やすことなく、そのトークンが最後におおよそいつ動いていたかが分かります。失効させると revoked_at が記録されます。即時で、恒久的で、ハード削除ではないので、何が存在したかの記録は残ります。

拡張機能をつなぐ——5 ステップ

  1. telli.sh にサインインし、設定 → API トークン/settings/tokens)を開きます。
  2. あとで自分が分かる名前を入れ——「Browser extension」がプレースホルダーになっているのには理由があります——Save clips にチェックを入れて Create token を押します。
  3. 一度きりのパネルが開いているあいだに Copy token を押します。二度目はありません。なくしたら、そのトークンを失効させて作り直してください。
  4. 拡張機能の設定ページを開き、Telli.sh Clip のセクションを見つけ、Telli.sh Clip token にトークンを貼り付けて Connect を押します。
  5. 任意のウェブページを右クリックし、Save to Telli.sh を選びます。ツールバーバッジに が光り、クリップはすべてのノートの中にあります。

拡張機能の設定にある Telli.sh Clip のセクション。Clip トークンの入力欄、Connect と Disconnect のボタン、Connected as tsh_0wjkFr24mTcX という状態表示、そしてトークンの入手先へのリンク

ステップ 4 のあとの拡張機能、2026 年 9 月 5 日に撮影。状態行にはプレフィックスしか出ません。拡張機能は、トークン一覧が表示するものと同じものを表示します。補助テキストは保存の仕組みを率直に述べます。「この端末にのみ保存され、トークンを追加するまでクリップの保存は無効のままです。」トークンがなければクリップもありません。メニュー項目は存在しますが、何もしません。

拡張機能が読むもの、正確に

プライバシーの主張は安上がりです。ここに書くのはコードの挙動で、意味があるのはその版だけです。

Save to Telli.sh をクリックすると、拡張機能はページに関数を 1 つ注入し、8 つのフィールドを読みます。og:title または twitter:title、なければ document.titleog:descriptiontwitter:description または description。canonical リンク。og:image または twitter:imageog:site_name または application-namearticle:author または authorarticle:published_time。そして window.getSelection()

この一覧を、今度は欠けているもののほうから読み直してください。document.body がありません。本文抽出も、readability の処理も、DOM の走査もありません。8 つのうち 7 つは、ページが Google とソーシャルメディアのプレビューのために公開しているメタデータです。見知らぬ相手に読まれるために書かれたデータです。8 つめは、あなた自身がハイライトしたテキストです。

コードの上で成り立つ性質があと 4 つあります。

クリックなしに何も送られません。 メタデータの関数はコンテキストメニューのハンドラーの中で実行されます。バックグラウンドのアラームも、ページ読み込みのフックも、「閲覧しながら収集」モードもありません。

トークンがなければ、何も起こりません。 ハンドラーはまず保存済みの Telli.sh トークンを確認し、なければそこで止まって、トークンをつなぐよう促すバッジを出します。入れたてのインストールでは、メニュー項目は不活性です。

あなたのセッションクッキーを借りることはできません。 拡張機能は telli.sh に対するホスト権限を持っており、通常それは fetch の呼び出しにログイン済みのクッキーが自動的に乗ることを意味します。そしてそのクッキーはトークンより先に認証され、私たちが設計したクリップ限定のスコープではなくアカウント全体へのアクセスを与えてしまいます。だからリクエストは credentials: 'omit' で送ります。場に出ている資格情報はトークンだけで、あなたが選んだスコープがそのまま適用されるスコープです。書き込み専用の鍵を本当に書き込み専用にしているのは、そのオプション 1 つです。

ページへのアクセス権がない場所では、多くではなく少なく送ります。 スクリプトの注入にはホストへのアクセスが必要で、拡張機能はマニフェストに宣言したサイトについてのみそれを持ちます。それ以外の場所では注入は単に失敗し、クリップは URL だけを携えて進みます。そのあとサーバーがページの公開メタタグからカードを埋めます。失敗の形は常に「データが少ない」であって、「より広い権限を要求する」ではありません。

そしてサーバーが URL を取得するとき、クローラーとしてではなく訪問者として取得します。localhost、あらゆる .local ホスト、そしてプライベート、ループバック、リンクローカル、マルチキャスト、予約済み、未指定の IP アドレスに解決されるホスト名を拒否します。パターン照合ではなく実際に解決して確認するので、10.0.0.1 を指す公開 DNS 名も拒否されます。リダイレクトは最大 3 回まで追い、HTML は最大 256 KB まで読みます。ログインはせず、あなたのクッキーは運ばず、サインアウトした訪問者が取得できないものは試みません。有料の壁の向こうのページも非公開ページも、有料のまま、非公開のままです。そういうページからは、代わりにあなた自身が選択したテキストを保存してください。

計測についての最後の注記をひとつ。この記事を分析の話から始めたので触れておきます。拡張機能が作ったクリップはウェブアプリを一切通らないため、フロントエンドからは見えません。そうしたクリップについては、代わりにサーバーが clip_created を報告します。このイベントが運ぶのは、送信元アプリ、送信元の種類、選択範囲を含めたかどうか、要約が生成されたかどうか、そしてプランです。URL もタイトルも選択テキストも運びません。クリップがいくつ、どの経路で作られたかは分かり、その中身が何だったかは決して分かりません。

結論——あなたが話したことしか持たないノートアプリは、記憶の半分でしかない

Telli.sh は、話された仕事のための場所として始まりました。会議を録音し、実際に話された言語のまま文字起こしし、翻訳し、要約し、4 つの層をひとつのノートに収める。ここまでが、あなたが 話した ことをカバーします。

カバーしていないのは、あなたが 読んだ ことです。そして、あなたが知っていることの大半は読んだことです。3 日間閉じられずにいるタブ。1 か月後にまた必要になるドキュメントのページ。本当の答えが書かれていたコメントスレッド。それらは、あなたが決して検索しないブラウザー履歴と、2019 年から開いていないブックマークバーに住んでいます。

Clip は、その残り半分が届いたということです。同じノート、同じ検索、同じフォルダー、同じ書き出し——マイクの代わりに右クリックで届くだけです。目指しているのは、あなたの言葉とあなたの出典が隣り合って収まる 1 つの個人データベースであり、これがウェブに向けられた最初の収集面です。

ゲートは消えました。カウンターにも、ようやく行き先ができました。


試してみてください: サインインし、サイドバーで Clip を開いて、ずっと取っておこうと思っていたものの URL を貼り付けてみてください。無料アカウントは 1 日あたり保存 30 件と AI 要約 10 件を使えます。拡張機能 1.18 が Chrome ウェブストアの審査を通れば、同じことが、いま読んでいるページ上での右クリック 1 回になります。

Telli.sh を開いて最初のクリップを保存する

出典

  • Telli.sh リポジトリ、コミット 64852ac、2026 年 9 月 5 日——「feat(clip): open Clip to every signed-in user」。is_master のゲートと Admin preview バッジを取り除き、clip_createdclip_opened が PostHog で一度も発火していなかったことを記録しています。
  • Telli.sh リポジトリ、backend/config.py——CLIP_SCRAPE_DAILY_QUOTA_*CLIP_SUMMARY_DAILY_QUOTA_* の既定値、2026 年 9 月 5 日に確認。
  • Telli.sh リポジトリ、docs/SUPERAPP_BASELINE.md——Clip のベースラインと安全上の規則。ログインや有料の壁の回避をしないこと、大量スクレイピングをしないこと、要約はユーザーが与えたテキストと公開メタデータに限ること、そして AI の出力が原本を置き換えないという規則。
  • Telli.sh リポジトリ、docs/design/API_TOKEN_RBAC_DESIGN.md——スコープ付きトークンの設計。ポリシー構造、tsh_<prefix>_<secret> の形式、bcrypt での保存、そして API トークンがセッション認証の経路を通って解決されることはないという不変条件。
  • Telli.sh リポジトリ、extension/extension/background.js——readClipMetadataFromPagecollectClipMetadatasaveClip、2026 年 9 月 5 日。8 つのメタデータフィールド、クリックのときだけ動くトリガー、トークンがない場合の早期リターン、そして credentials: 'omit'
  • Chrome ウェブストアの Telli.sh: Every Translator——バージョン 1.18 を提出した登録ページ。2026 年 9 月 5 日時点で審査中。
  • Telli.sh: Every Translator 製品ページ — 対応サイト、表示方法、プロバイダ、プライバシー上の約束を一か所にまとめたページ。
  • 拡張機能のポップアップは間違った問いに答えていた。1.16は代わりに、いま開いているページを描く、2026 年 9 月 4 日——Clip トークンの入力欄が置かれている設定ページについての、ひとつ前の拡張機能リリース記事。

ブログに戻る