Filters
Allow and deny lists that discard events before they are written — the privacy boundary of Tadoru.
Filters decide which apps and sites are recorded at all. They run in the Privacy Filter stage, before the store — excluded data is never written, so there is nothing to delete or leak later. This is the trust core of Tadoru.
Two kinds of “filtering by app” — don’t confuse them
| Capture-time filters (this page) | Query-time filters (--app etc.) |
|
|---|---|---|
| Where it acts | Before the store — matching events are discarded | Only when reading data back |
| Purpose | Privacy boundary — keep sensitive apps out of the store entirely | Convenience — narrowing results |
| Configured via | tadoru filter commands / [filter] in config.toml |
Per-command flags like --app, --types |
| From MCP | Cannot be changed (read-only boundary) | Usable as query_events arguments |
Managing the lists
tadoru filter show # current lists and active mode
tadoru filter exclude-app add com.1password.1password # deny list: add
tadoru filter exclude-app remove com.1password.1password
tadoru filter only-app add com.apple.Safari # allow-only list: add
tadoru filter exclude-site add example.com # exclude by URL host (browser.* events)
tadoru filter only-site add github.com
| Subcommand | config.toml key |
Meaning |
|---|---|---|
exclude-app |
exclude_apps |
Deny list — everything else is captured |
only-app |
include_only_apps |
Allow list — when non-empty, only listed apps are captured |
exclude-site |
exclude_websites |
Deny list for browser.* URL hosts |
only-site |
include_only_websites |
Allow list for browser.* URL hosts |
Editing config.toml directly is equivalent; the CLI additionally validates keys and deduplicates, so it’s the safer path. The daemon watches the config file at roughly 2-second intervals, so changes apply within a few seconds — no daemon restart needed.
Matching semantics
- Apps — match by
bundle_id(recommended; display names can change or be spoofed). An app that has abundle_idis matched only by it; a display-name entry applies only to events whose app has nobundle_id. Matching is case-insensitive. - Sites — dot-boundary suffix match on the URL host:
example.comalso coversapi.example.com, but notevil-example.com. There is no Public Suffix List handling — an entry likecommatches every.comhost, so prefer full domain names. Site rules apply to the URL host ofbrowser.*events, so you can keep recording the browser while dropping specific sites. - Precedence — if
include_only_*is non-empty, an event is captured only if it is in that list and not inexclude_*. If empty, everything not excluded is captured. - App-level exclusion is total — it drops all event types from that app (
ui.*,input.*,window.*, …), not just some.
Always-on exclusions
Independent of your lists:
- Private browsing is always excluded (Chrome Incognito, detected deterministically).
- Built-in exclusions are always applied — password managers and credential stores (
1Password,Keychain Access, …) are excluded by a hard-coded layer that cannot be lifted, not even withinclude_only_apps. It is a separate layer from the default entries you see inexclude_appsinconfig.toml— editing those does not affect it.filter showlists the built-in entries separately from your own.
Filters and MCP
Capture-time filters cannot be modified over MCP — the MCP server is a read-only view by design. An agent can never weaken your privacy boundary, even by accident. Filter management happens only through the CLI or config.toml. See MCP server.