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

設定

config.toml のスキーマ — 捕捉ソース・フィルタ・出力・保持期間。

設定は単一の TOML ファイルにまとまっています。

~/.config/zanei/config.toml

グローバルフラグ --config <path> で呼び出しごとに上書きできます。ヘルパーコマンドは次のとおりです。

zanei config init   # 設定パスに全項目のコメント付きテンプレートを生成
zanei config path   # 設定ファイルのパスを表示
zanei config show   # 有効設定(既定値マージ後)を表示
zanei config edit   # $EDITOR で開く
zanei config set capture.text_content true
zanei config set capture.content_snapshot true

zanei config init は不足している親ディレクトリを作成し、以下の完全なテンプレートを 書き込みます。既存ファイルは上書きせず、生成先が存在する場合はそのパスを表示して終了コード 1 で終了します。既定以外の場所を初期化するにはグローバル --config <path> を使います。

capture.text_content、capture.content_snapshot、output.batch_interval_s、output.retention_hours には zanei config setを使います。filter リストには zanei filter、その他の配列には config edit を使います。

全体例(既定値)

[capture]
sources = ["app", "window", "ui", "input", "browser"]
text_content = false            # 内容の捕捉は明示的な opt-in
content_snapshot = false        # 前面ウィンドウの Accessibility text を記録するか

[filter]                        # capture-time フィルタ = プライバシー境界(ストア書込前に適用)
exclude_apps = ["1Password", "Keychain Access"]   # 不許可リスト(bundle_id 推奨)。既定除外を同梱
include_only_apps = []          # 非空で許可リストモードに切替
exclude_websites = []           # browser URL event/本文。URL host のドット境界サフィックス一致
include_only_websites = []      # browser URL event/本文の許可リスト
redactors = ["credit_card", "token"]              # 限定的なパターンベースのスクラブ。email は opt-in

[filter.text_content]           # 入力・clipboard 本文だけ。event と内容以外の事実は残る
exclude_apps = ["com.apple.Safari", "org.mozilla.firefox", "com.brave.Browser",
                "com.microsoft.edgemac", "com.vivaldi.Vivaldi", "company.thebrowser.Browser"]
include_only_apps = []
exclude_websites = []
include_only_websites = []

[filter.content_snapshot]       # content.snapshot event だけ
exclude_apps = ["com.apple.Safari", "org.mozilla.firefox", "com.brave.Browser",
                "com.microsoft.edgemac", "com.vivaldi.Vivaldi", "company.thebrowser.Browser"]
include_only_apps = []
exclude_websites = []
include_only_websites = []

[output]
batch_interval_s = 5
retention_hours = 48            # 既定で短期保持

egress に相当する設定はありません。外部送信という機能自体が存在しないためです。

バリデーション

省略した設定に既定値を補完した後にバリデーションを実行します。受理するのは以下の 18 キーと任意の [filter.capture_policy] テーブル(それぞれ定義された section 内)だけで、それ以外のキーがあるとファイル全体を不正とします。config init は 18 項目をすべて出力し、[filter.capture_policy] は書き出しません。ルールに違反するファイルは受理されず、config show や config edit を含む設定を読み込むすべてのコマンドが exit code 1 で終了します。config set や filter に渡した不正値は使用法エラー(code 2)で、何も保存されません。config set が受け付けるのはスカラーキー(capture.text_content・capture.content_snapshot・output.batch_interval_s・output.retention_hours)のみで、配列キーは filter か手編集で変更します。

キー 受理する値
capture.sources app・window・ui・input・browser のうち 0 個以上。重複不可
capture.text_content TOML boolean。config set では true / false と完全一致する値のみ
capture.content_snapshot TOML boolean。config set では true / false と完全一致する値のみ。有効化時は現在の scope を表示して [y/N] を確認(CLI リファレンス参照)
filter.exclude_apps・filter.include_only_apps 文字列。各 entry は非空・前後 whitespace なし・リスト内で大文字小文字を無視して一意。既存値(大文字小文字違いを含む)の filter ... add は no-op(code 0)
filter.exclude_websites・filter.include_only_websites ドメイン名。非空・whitespace・一意性のルールは上と同じ。末尾の . は 1 個まで。それを除いて全体 253 bytes 以下、dot 区切りの各 label は 1〜63 bytes の ASCII 英数字と - で、先頭と末尾は英数字。同梱の public suffix snapshot に含まれる値(com など)は受理するが、filter ... add は --quiet 未指定なら warning を表示
filter.text_content.exclude_apps・filter.text_content.include_only_apps・filter.content_snapshot.exclude_apps・filter.content_snapshot.include_only_apps 同じ app list rule。両方の exclude_apps は全体例に示した Safari・Firefox・Brave・Edge・Vivaldi・Arc の bundle ID が既定値。他の app list は []
filter.text_content.exclude_websites・filter.text_content.include_only_websites・filter.content_snapshot.exclude_websites・filter.content_snapshot.include_only_websites 同じ domain list rule。4 list とも既定値は []
filter.redactors email・credit_card・token のうち 0 個以上。重複不可。email は選択可能だが既定では無効
output.batch_interval_s・output.retention_hours 0 より大きい符号なし整数(u64)
[filter.capture_policy] 任意。既定では存在しません。テーブルを書いた場合は browser と ide、およびその中の全キーが必須で、allowed_apps だけが任意です。[filter.capture_policy] を参照

[capture]

キー 既定値 説明
sources ["app", "window", "ui", "input", "browser"] 捕捉するイベントファミリー。browser がない場合、browserのAutomationは、対象のcontent snapshot、または text_content と ui / input を有効にした場合に必要です。window 単独では不要です(権限参照)
text_content false 入力・フィールド内容(ui.value・input.key・クリップボードの中身)の捕捉。既定オフ。プライバシーモデル参照
content_snapshot false 前面ウィンドウに表示された Accessibility text を content.snapshot として捕捉。sources と text_content から独立しており、window が sources に無くてもこの opt-in は Accessibility を必要とし snapshot を記録可能。再起動が必要

[filter]

capture-time フィルタはストア書込前に適用されます。scope は 3 つです:全 event の [filter]、入力・clipboard 本文の [filter.text_content]、snapshot event の [filter.content_snapshot]。app / website の各軸では、include_only_* が非空なら only mode、空なら exclude mode です。exclude_* はどちらの mode でも常に優先します。

評価順は組み込み除外、[filter] の app と website、[filter.text_content]、[filter.content_snapshot] です。text-content scope 外では event と事実を残して本文 field を null にし、その window だけ capture.text_content = false と同じ形にします。snapshot scope 外では content.snapshot 自体を生成しません。サイトルールはChromeとSafariに適用します。詳細はフィルタガイドを参照し、list は zanei filter で管理してください。

キー 既定値 説明
exclude_apps 既定除外を同梱 アプリの不許可リスト(bundle_id 推奨。表示名も可)
include_only_apps [] 許可リスト。非空で許可リストモードに切替
exclude_websites [] browser URL イベントと本文に対する URL host の不許可リスト。Public Suffix List 非対応のドット境界サフィックス一致:example.com は api.example.com に一致し、evil-example.com には一致しません。com を指定するとすべての .com ホストが除外されます
include_only_websites [] browser URL イベントと本文に対する URL host の許可リスト
redactors ["credit_card", "token"] 捕捉値に適用するパターンベースの redaction ルール。email は opt-in ルールとして引き続き選択可能

nested scope も同じ 4 list 名を使います。既定値と挙動は上記のとおりです。デーモンは 3 scope すべてを約 2 秒間隔で監視しており、フィルタの変更はデーモン再起動なしで数秒以内に反映されます。

[filter.capture_policy]

recorder を組み込むアプリケーション向けの任意テーブルです。書き込むのはそのアプリケーションか 手編集で、config init は生成せず、config set と filter も触れません。このテーブルが無い設定は 上記のとおりに動作し、追加しても上記のキーの意味は変わりません。

記録対象アプリの選び方は全員共通です。 どのアプリケーションを記録するかは filter.exclude_apps と filter.include_only_apps、つまり zanei filter exclude-app と zanei filter only-app が管理する list が 決めます。capture_policy が足すのは、その list では表現できない browser の URL ルールと IDE の ファイルルールだけです。

allowed_apps は任意で、独自の許可リストを固定したい policy のためにあります。省略すればアプリ選択の ゲートは上記 2 つの filter list だけになり、指定すればそれらの後に追加で適用される許可リストになります (したがって allowed_apps = [] は何も記録しません)。

[filter] の app list を通過した event の評価順は次のとおりです。

  1. 組み込み除外(パスワードマネージャ・資格情報ストア)が拒否します。どの設定でも解除できません。
  2. allowed_apps がある場合、アプリの表示名が含まれていなければ拒否します(前後の whitespace を除いた 大文字小文字を無視した一致)。
  3. Google Chrome と Safari は browser だけが決めます。
  4. Cursor・Visual Studio Code・Code は ide が決めます。
  5. それ以外のアプリは許可します。

browser が URL を許可した後も、[filter] と [filter.text_content] / [filter.content_snapshot] の website ルールは Chrome と Safari に適用されます。[filter] の他のキーと同様、変更は daemon の設定監視が 数秒以内に反映するため再起動は不要です。

キー 必須 説明
allowed_apps 任意 アプリの表示名。省略するとアプリ選択は filter.exclude_apps / filter.include_only_apps に委ねられ、[] はすべてのアプリを拒否します。各 entry は非空・前後 whitespace なし・大文字小文字を無視して一意
browser.mode 必須 off は Chrome と Safari をそのまま拒否、all_sites は解決できた URL をすべて許可、rules は下の list を参照
browser.default_policy 必須 mode = "rules" でどのルールにも一致しなかった URL に対する allow / block
browser.on_url_unavailable 必須 host を持つ http / https URL を window に結び付けられなかったときの allow / block
browser.block_auth 必須 path に代表的な sign-in・sign-up・OAuth・パスワードリセットの segment を含む URL を拒否します。URL パターンであって認証画面の検出ではないため、/docs/oauth も一致します
browser.block_payments 必須 path に checkout・payment・payments・billing・subscription・subscriptions を含む URL を拒否
browser.allow_list・browser.block_list 必須 { host, path_prefix, match_subdomains } の配列。block_list は allow_list にも mode = "all_sites" にも優先します。host は URL.hostname が返す正規形(小文字の ASCII / IDNA。例え.テスト ではなく xn--r8jz45g.xn--zckzah、port なし、末尾ドットなし、IPv6 は角括弧)でなければなりません。path_prefix は前後 whitespace なしの、大文字小文字を区別するリテラル前方一致
ide.block_env_files 必須 Cursor・Visual Studio Code・Code で、window title が .env ファイルを指すときに捕捉を拒否します。.env.example などは拒否しません
ide.on_file_name_unavailable 必須 window title からファイル名を読めなかったときの allow / block

利用者が特定アプリを除外でき、browser は 2 サイトに限定し、IDE の .env は決して捕捉しない組み込み アプリケーションが書く例です。

[filter]
exclude_apps = ["1Password", "Keychain Access", "com.tinyspeck.slackmacgap"]
include_only_apps = []

[filter.capture_policy]                 # allowed_apps なし: 上の exclude_apps がアプリのゲート

[filter.capture_policy.browser]
mode = "rules"
default_policy = "block"
on_url_unavailable = "block"
block_auth = true
block_payments = true
allow_list = [
  { host = "github.com", path_prefix = "", match_subdomains = false },
  { host = "example.com", path_prefix = "/docs", match_subdomains = true },
]
block_list = []

[filter.capture_policy.ide]
block_env_files = true
on_file_name_unavailable = "block"

同じ policy を only mode にした場合(利用者が記録する 2 アプリを選んだ状態)です。

[filter]
include_only_apps = ["com.apple.Notes", "com.google.Chrome"]

filter の list ではなく独自の許可リストを持たせる場合は次の形です。

[filter.capture_policy]
allowed_apps = ["Notes", "Google Chrome"]

[output]

キー 既定値 説明
batch_interval_s 5 coalesce 済みイベントと SQLite batch のフラッシュ間隔
retention_hours 48 これより古いイベントは起動時と定期実行で purge され、読み取り結果からも除外

zanei record は記録したイベントを NDJSON で出力します。daemon は単一のローカル SQLite ストアへ書き込みます。出力動作とストアバックエンドは設定できません。

変更の反映

  • [filter]・[filter.text_content]・[filter.content_snapshot] の変更はデーモンの設定監視(約 2 秒間隔)で検知され、再起動なしで数秒以内に反映されます。
  • output.retention_hours は daemon 再起動なしで反映され、新しい保持期間の外にある event を即時 purge します。それ以外(capture.sources・capture.content_snapshot・output.batch_interval_s 等)は zanei stop && zanei start でのデーモン再起動後に反映されます。

関連パス

パス 用途 上書き
~/.config/zanei/config.toml 設定 --config <path>
~/.local/state/zanei/store.sqlite イベントストア --store <path>

イベントストアは暗号化されています。鍵は recorder の初回起動時に生成され、ログインキーチェーンに保存されます。暗号化に関する設定キーはありません。ZANEI_STORE_KEY_FILE=<path> を設定すると、すべての Zanei プロセスが代わりにそのファイルから鍵を読みます。これはソースからのビルド向けの開発用上書きで、CLI リファレンスに説明があります。

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