コンテンツにスキップ
Zanei
日本語
Esc
↑↓移動↵開く⌘Jプレビュー
このページの内容

プライバシーモデル

何が記録され、何が記録されないか。機微なデータをストアに入れないための各層。

Zanei は PC 上での操作を記録します。機微なデータなので既定値は保守的にしてあり、以下の各層は設定なしで効きます。

既定の振る舞い

  1. 外部送信なし。 データをどこかへ送る機能がありません。すべてローカルの SQLite ファイルに留まります。
  2. 画面録画なし。 スクリーンショットも画面収録 API も使いません。読むのは OS のアクセシビリティ/イベントのメタデータです。
  3. 内容は既定で記録しない。 記録されるのは「この種類のフィールドで入力があった」という事実で、何を打ったかは記録しません。ウィンドウに表示されたテキストも記録しません。入力内容と content snapshot は別々の opt-in です。
  4. capture-time フィルタ。 除外アプリに帰属できたイベントはストアに書き込まれる前に破棄されます。帰属不能な clipboard 変化は除外アプリと照合できないため、app.name: "Unknown" として保存されることがあります。除外した Chrome サイトは URL イベントを生成せず、本文も記録しません。
  5. read-only な MCP 公開。 MCP サーバは読み取り専用のビューです。MCP 経由だけで接続した agent はタイムラインを読めますが、記録対象やフィルタは変更できません。
  6. 保存時に暗号化。 ストアファイルは暗号化されています。鍵は recorder の初回起動時に生成してログインキーチェーンに保存し、iCloud キーチェーンには同期しません。バックアップ・同期フォルダ・別のマシンにあるファイルのコピーは鍵なしでは読めず、鍵を削除すればすべてのコピーが読めなくなります。

既定構成で記録されるもの・されないもの

記録される 記録されない
どのアプリが前面か、いつ切り替わったか スクリーンショット・画面録画
ウィンドウタイトルとフォーカスの変化 キー入力の内容(事実とフィールド種別のみ)
UI 操作(クリック・フォーカス移動)の要素メタデータ パスワード欄(AXSecureTextField)の値。捕捉段階で除外
入力・スクロール・クリップボード操作の事実 Chrome シークレットウィンドウの URL・タブ情報・本文
Chrome の URL とタブタイトル(通常ウィンドウのみ) 除外アプリに帰属できたイベント(既定でパスワードマネージャ等)
アプリのウィンドウに表示されたテキスト(content.snapshot)

入力内容の記録は opt-in

設定で capture.text_content = true にすると、認可された打鍵文字(input.key)、フィールドに入力された差分(ui.value.data.text)、クリップボードの中身の記録が有効になります。自由入力フィールドで捕捉するのは、同じアプリ・同じフォーカス要素への打鍵またはペーストから 3 秒以内に増えた差分だけで、表示されている文書やフィールドの全体値ではありません。連続して入力している間は変更をまとめ、1 秒の間が空いたとき、または最長 5 秒ごとに記録します。コピー本文には、同じプロセスの Command-C と 500 ミリ秒以内に対応することも必要です。element.value は自由入力および不明な要素では null のままで、値を持つのは安全と分類した非テキスト要素(ボタン・チェックボックス・スライダー等)だけです。初回セットアップでは、capture.text_content が config.toml に明示されていなければ、対話式のバックグラウンド start が記録するかどうかを一度だけ確認します(既定は記録しない。正確な条件は CLI リファレンス)。後から zanei config set capture.text_content <true|false> で変更できます。

Zanei はアプリに observer を attach するたび、そのアプリ要素の role を読みます。これは支援クライアントが行うのと同じ読み取りです。Electron を含む Chromium 系アプリはこの読み取りをアクセシビリティツリー構築の合図として扱い、その結果として macOS Accessibility が入力欄を分類できるようになります。それ以外の native アプリは影響を受けません。内容記録の opt-in が有効な間は、Electron に限らず、その opt-in のフィルタが許可するすべてのアプリに対して AXManualAccessibility の設定も試みます。Electron アプリはこれに応じてツリーを構築し、この属性に対応しないアプリは unsupported を返すだけで影響を受けません。該当するアプリでは、ツリー構築によりわずかな性能低下が生じる可能性があります。

opt-in を有効にした場合の挙動は次のとおりです。

  • パスワード欄は引き続き除外されます(secure field は捕捉段階で破棄)。
  • Accessibility が既知の非 secure 入力欄を確認できない場合、input.key.text とペースト本文は null のままです。
  • confirmed な打鍵またはペーストが開く 3 秒の認可窓外にある値変化は、テキストを記録しません。rejected な入力は窓を開きません。
  • Chrome の incognito・サイト除外中は本文が null のままです。ウィンドウタイトルと操作メタデータは残り得ます。
  • Chrome のテキストと snapshot 本文は、入力後の観測によってそのウィンドウが引き続き許可サイトを表示していると Zanei が確認した場合にだけ書き込まれます。除外サイトまたは incognito のタブへ切り替える直前に入力または表示されたテキストは省かれます。
  • 不明な UI 要素は element.value を記録しません。
  • IME 使用中、および入力ソース種別が不明なときの input.key.text は null です。確定文字列は認可された ui.value.data.text の差分としてのみ捕捉されます。
  • 音声入力自体は、記録済みの打鍵またはペーストのトリガーを伴わないため認可窓を開きません。ただし、同じアプリ・同じフォーカス要素世代への直前の打鍵またはペーストが開いた 3 秒の窓が有効な間に音声テキストが挿入されると、そのテキストが認可された ui.value.data.text の差分に含まれ得ます。
  • redactor は、有効なルールに一致する検出可能な値を置換します。捕捉したテキストを匿名化するものではありません。

0.3.0 では、private window を確実に判定できないため、既定の [filter.text_content] scope が Safari・Firefox・Brave・Edge・Vivaldi・Arc を除外します。capture.text_content = true のまま upgrade した利用者にも適用され、これらの browser では入力・clipboard 本文が既定で null になります。event と内容以外の事実は残ります。zanei filter の warning を確認したうえで、編集可能な既定値を変更できます。

Content snapshot は opt-in

capture.content_snapshot = true は、前面ウィンドウの可視範囲で macOS Accessibility が公開するテキストを記録します。スクリーンショット・OCR・画面収録 API は使いません。ウィンドウの内容が静止した後、同じウィンドウで操作を続けている間の定期取得、ウィンドウを離れるときに snapshot の候補を作ります。1 event の UTF-8 本文は最大 32 KiB です。走査を途中で打ち切った場合は data.cutoff に time / nodes / bytes / stopped が入り、完了時は null になります。

Content snapshot は入力内容の捕捉とも capture.sources とも独立しています。secure field の subtree と単行入力欄の値は読みません。Secure Input 中は snapshot を取りません。ただし、入力したテキストがウィンドウ内の別の場所や複数行のテキスト領域に表示されると含まれ得ます。他人が書いた message・document・その他の表示テキストも含み得ます。

有効化する前に scope を決めます。

zanei apps
zanei filter content-snapshot only-app add Terminal
zanei config set capture.content_snapshot true
zanei stop && zanei start

ストアは暗号化され、通常の保持期間が適用されます。plain SQLite export は --types で除外しない限り snapshot 本文を含むため、他の機微な export と同様に保護してください。画面共有中に表示テキストを記録したくない場合は、先に zanei pause を実行します。会社管理の端末では、第三者の message・document に関する所属組織の規則に従ってください。

recorder は 1 日の snapshot 本文が 128 MiB に達すると新しい snapshot の生成を止めます。これはメモリ内の backstop で、daemon の再起動時にリセットされます。daemon が動き続ける場合、既定の 48 時間保持では database overhead を除いて約 256 MiB が上限の目安です。同じ本文は重複保存しないため、通常利用はこれより大幅に少ない想定です。

自動除外

  • パスワード欄 — macOS が secure text field と見なすものは捕捉段階で破棄されます。
  • Chrome シークレットウィンドウ — Chromium は AppleScript でウィンドウモードを返します。incognito は URL イベントを生成せず、本文も記録しません。設定項目はありません。
  • 組み込みの除外アプリ — パスワードマネージャ・資格情報ストア(1Password・Keychain Access 等)は固定の層で除外され、include_only_apps でも解除できません。config.toml の exclude_apps に見える編集可能な既定値とは別の層です。

組み込みアプリの capture policy

recorder を組み込むアプリケーションは、自身の設定に [filter.capture_policy] テーブルを追加できます。これが絞り込むのは、どの browser URL を捕捉してよいか、そして window title から判定した IDE の .env ファイルを拒否するかどうかです。

どのアプリケーションを記録するかはこのテーブルの担当ではありません。standalone でも組み込みでも、決めるのは filter.exclude_apps と filter.include_only_apps、つまり zanei filter が管理するのと同じ list です。したがって zanei filter exclude-app add Slack はどちらの場合も Slack をストアから排除し、only-app を 1 つ追加すればその list のアプリだけを記録する形に切り替わります。

policy が独自の allowed_apps を固定することもできますが、それは上の 2 つの list の代わりではなく、後段に追加で適用されます。いずれの場合も上記の組み込み除外は解除できず、このページのフィルタ・redactor・保持期間のルールはそのまま適用されます。

Redaction

捕捉された値について、redactor は有効なルールに一致する検出可能な値を置換します。既定はクレジットカード番号とトークンです(redactors = ["credit_card", "token"])。filter.redactors 配列に "email" を追加すれば、メールアドレスの redaction は従来どおり利用できます。ただし、メールアドレスは秘密ではなく宛先を識別する値であるため、既定では有効にしません。

redactor は氏名・電話番号・FAX 番号・住所を削除しません。不要なデータをストアに入れないための capture-time フィルタと、捕捉データが残る時間を短くする保持期間を使って露出を制限してください。redaction は露出を制限する仕組みではありません。各イベントには redaction フィールドがあり、ルールが適用されたかを判別できます。

制限

  • Chrome 以外の private window。 Safari・Firefox・Brave・Edge・Vivaldi・Arc には、Zanei が利用できる信頼できる private-window signal がありません。そのため [filter.text_content] と [filter.content_snapshot] の両方で既定除外します。この既定値は編集できますが、外すと private window の本文を記録し得ます。ウィンドウタイトルは全 event の [filter] scope で別に扱うため、タイトルも抑止するにはそこで browser を除外します。Safari の例:zanei filter exclude-app add com.apple.Safari。
  • サイトscope。 サイトルールはChromeとSafariに適用します。SafariのURLフィルタはプライベート閲覧の識別を意味しません。他のbrowserはapp scopeで制御します。
  • Chrome incognito・除外サイトのウィンドウタイトル。 本文は null のままですが、Accessibility はタイトルを window.title イベントとして記録し得ます。タイトルも抑止するには Chrome 自体を除外してください:zanei filter exclude-app add com.google.Chrome。
  • シェルを持つ agent。 シェルアクセスを持つ agent は、host の承認ポリシーに従い、CLI 経由で記録設定・フィルタ・保存済み記録を変更できます。同梱の skill は、ユーザーの明示的な依頼なしにこれらを変更しないよう指示しています。
  • あなたとして zanei を実行できるプロセス。 暗号化が守るのはファイルのコピーであって、CLI ではありません。あなたのユーザーとして動くプロセスはデータを読めます。zanei export を実行できる、シェルを持つ agent もその一つです。root や、プロセスメモリを読めるものも同様です。ディスクごと盗まれた場合の保護は Zanei ではなく FileVault の役割です。
  • agent がデータを読んだ後。 MCP サーバも CLI も外部送信はしませんが、タイムラインを読んだ agent は通常それを LLM プロバイダに送ります。その送信は agent 側の責任です。同梱の skill には送信前に範囲を絞るよう書いています。

想定用途

Zanei は自分のマシン上の自分の操作を記録するツールです。他者の監視のためには作られておらず、そうした利用は地域によっては違法です。会社管理のデバイスで使う場合は、所属組織のポリシーに従ってください。

このページは役に立ちましたか?