設定
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 の評価順は次のとおりです。
- 組み込み除外(パスワードマネージャ・資格情報ストア)が拒否します。どの設定でも解除できません。
allowed_appsがある場合、アプリの表示名が含まれていなければ拒否します(前後の whitespace を除いた 大文字小文字を無視した一致)。Google ChromeとSafariはbrowserだけが決めます。Cursor・Visual Studio Code・Codeはideが決めます。- それ以外のアプリは許可します。
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 リファレンスに説明があります。