フィルタ
どのアプリ・サイトを記録するかを決める許可/不許可リスト。ストアに書き込まれる前に適用されます。
フィルタは、どのアプリ・サイトを記録するかを決めます。capture-time scope は、全 event、入力・clipboard 本文、content snapshot の 3 つです。帰属不能な clipboard 変化はアプリと照合できないため、app.name: "Unknown" かつ帰属と本文が null の clipboard.copy として残り得ます。
capture-time と query-time
「アプリで絞る」方法は 2 種類あり、役割が異なります。
| capture-time フィルタ(このページ) | query-time フィルタ(--app 等) |
|
|---|---|---|
| 効く場所 | ストアの手前。該当イベントは破棄 | 読み出し時のみ |
| 目的 | 機微アプリをストアに入れない | 結果の絞り込み |
| 設定手段 | zanei filter コマンド / config.toml の [filter] |
各コマンドの --app --types 等 |
| MCP から | 変更不可(read-only) | query_events の引数として利用可 |
リストの管理
zanei filter show # 3 scope と mode を表示
zanei filter exclude-app add 1Password # 全 event
zanei filter text-content exclude-app add Slack # 本文のみ除外。事実は残る
zanei filter text-content only-site add github.com # Chrome/Safari の入力・clipboard 本文をこの site だけに限定
zanei filter content-snapshot only-app add Terminal # snapshot をこの app だけに限定
zanei filter content-snapshot exclude-site add mail.google.com
コマンドの形は zanei filter [<scope>] <list> add|remove [VALUE] です。<scope> を省略すると [filter]、text-content は [filter.text_content]、content-snapshot は [filter.content_snapshot] を操作します。4 つの list はすべての scope で同じ意味です。
| list | config key suffix | 意味 |
|---|---|---|
exclude-app |
exclude_apps |
指定 app を除外 |
only-app |
include_only_apps |
非空なら指定 app だけを含める |
exclude-site |
exclude_websites |
指定した browser URL host を除外 |
only-site |
include_only_websites |
非空なら指定した browser URL host だけを含める |
app / site の各軸で include_only_* が非空なら only mode、空なら exclude mode です。exclude_* はどちらの mode でも常に優先します。デーモンは 3 scope を約 2 秒間隔で reload するため、変更は数秒以内に再起動なしで反映されます。
各 scope が除外するもの
評価順は固定です。
- 組み込みの app 除外。
[filter]の app rule。対象外 app に帰属するすべての event を破棄。[filter]の website rule。一致する browser URL event を破棄し、その window の入力・clipboard 本文と snapshot を抑止。[filter.text_content]の app / website rule。scope 外ではinput.key.text・ui.value.data.text・clipboard のtext/size_bytes・element.valueを null にし、event と内容以外の事実は残す。その window だけcapture.text_content = falseと同じ形。[filter.content_snapshot]の app / website rule。scope 外ではcontent.snapshotevent を生成しない。
サイトルールはChromeとSafariに適用し、単体利用と組み込み利用で同じscopeを使います。他のbrowserはapp ruleで制御します。Safariのプライベート閲覧の除外は保証せず、本文の既定除外は維持します。
filter reloadで対応browserを対象に加えると、recorderの再起動なしでそのbrowserの追跡が始まり、再び除外すると停止します。macOSのAutomation確認は、そのbrowserを初めて対象に加え、権限が必要になった時点で表示されます。
アプリを選ぶ
zanei apps # installed / running / recent app
zanei apps slack # name または bundle ID を大文字小文字無視で検索
zanei apps slack --json # 機械可読の候補
全 app list の add は表示名または bundle ID を受け付け、同じ候補群に対して解決し、bundle ID があればそれを保存します。正常時は Added com.apple.Terminal (Terminal) のように正規化結果を表示します。解決できない値は保存せず code 2 で終了し、近い候補があれば提示します。まだ installed でない app を意図的に保存する場合だけ --unverified を使います。Zanei は検証できなかったことを warning します。
値を省略した add は、recent 順の番号選択を開きます。非 TTY または --quiet では値が必須で、省略すると code 2 です。remove は現在の list 内で解決するため、uninstall 済みの entry も削除できます。zanei filter show は解決済み entry に表示名を付け、手編集した未解決値には (not installed) を付けます。
zanei apps [QUERY] [--json] は TCC 権限が不要で、daemon 停止中も動きます。table は name・bundle ID・installed/running/recent source・last use を表示します。JSON は { "apps": [...], "recent_unavailable": null, "installed_unreadable": 0 } です。store から recent app を取得できない場合も installed / running は残り、recent_unavailable に理由が入ります。installed_unreadable は metadata を読めなかった app bundle の件数です。
Browser の既定除外
private window を確実に判定できないため、両方の content scope は次の browser を既定で除外します。
| browser | bundle ID |
|---|---|
| Safari | com.apple.Safari |
| Firefox | org.mozilla.firefox |
| Brave | com.brave.Browser |
| Edge | com.microsoft.edgemac |
| Vivaldi | com.vivaldi.Vivaldi |
| Arc | company.thebrowser.Browser |
これらを only-app に追加する場合、または exclude-app から外す場合は、--quiet 未指定なら warning を表示します。固定 block ではなく編集可能な既定値です。0.3.0 では既存の capture.text_content = true 利用者にも適用され、これらの browser の本文は既定で null になりますが、event と内容以外の事実は残ります。
マッチング
- アプリ —
bundle_idで照合します(推奨。表示名は変わり得ます)。bundle_idを持つアプリはbundle_idだけで照合され、表示名のエントリはbundle_idを持たないイベントにのみ効きます。大文字小文字は区別しません。 - サイト — browser URL host のドット境界サフィックスで一致します。
example.comはapi.example.comにも一致しますが、evil-example.comには一致しません。Public Suffix List は扱わないため、comのような指定は全.comホストに一致します。完全なドメイン名を指定してください。 - 優先順位 —
include_only_*が非空なら「そのリストにあり、かつexclude_*にない」ものだけ捕捉。空なら「exclude_*にない」ものすべてを捕捉します。 - 帰属できたイベントに対するアプリ単位の除外は全面的 — そのアプリに帰属できたすべてのイベント型(
ui.*・input.*・window.*・…)を落とします。帰属不能な clipboard 変化はapp.name: "Unknown"として残り得ます。
常時有効の除外
リスト設定に関係なく、次の除外は常に効きます。
- プライベートブラウジング — Chrome incognito は URL イベントを生成せず、本文も null のままです。タイトルと操作メタデータは残り得ます。
- Secure Input — Secure Input 中は content snapshot を取りません。
- 組み込みの除外 — パスワードマネージャ・資格情報ストア(
1Password・Keychain Access等)は、include_only_appsでも解除できない固定の層で除外されます。config.tomlのexclude_appsに見える既定エントリとは別の層で、そちらを編集しても影響しません。filter showは組み込み分をユーザー設定と分けて表示します。
フィルタと MCP
capture-time フィルタは MCP から変更できません。MCP サーバは read-only です。フィルタの管理は CLI と config.toml のみです。MCP サーバ参照。