PRIVACY UPDATE - #6
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Privacy overhaul: tracker blocking, browsing data control, and store integrity
Closes the gap between what ÆTHER claims about privacy and what it enforces. Adds real request filtering on all three desktop platforms, gives the user a way to clear what sites leave behind, removes the last outbound request from the privileged window, and fixes several ways the library could leak or lose data.
Tracker blocking
New per-platform request filtering, driven by one shared rule file (
src-tauri/resources/content-blocking-rules.json).WebKit evaluates rules inside the network path, so a blocked request is never made rather than made and discarded. Windows is the odd one out: WebView2 has no rule-list concept, so it re-derives a host list from the same file and matches per request across the COM boundary. It also has no equivalent of the
block-cookiesrule — a tracker not on the host list can still set third-party cookies there.Two constraints on the rule file are silent failures — one bad rule rejects the entire list at runtime with nothing visible to say so — so
cargo run --example verify_content_rulescompiles the rules through real WebKit, and unit tests cover the alternation and extra-key traps.Browsing data
Clear browsing datain Settings wipes cookies, caches, local storage and the rest of the shared webview store, leaving collections, captures and conversations untouched. Scope is deliberately the shared default store — a private tab's store is discarded with its webview anyway.Favicons off the privileged window
Tab favicons used to be
<img src="https://host/favicon.ico">inside the window that holds the IPC bridge, which meant that window made a direct request to every host visited, and forcedimg-srcto allowhttps:andhttp:.They now resolve in Rust on the shared client and reach the renderer as
data:URIs. The privileged window makes no outbound requests at all, and the CSP is down to'self' data: blob:. The cache is memory-only on purpose — a favicon cache on disk is a list of visited hosts by another name.Honest reporting in Settings
A new Tracker blocking panel states what the running build actually does — engine, domain count, and whether third-party cookies are covered. This is reported by the backend rather than hardcoded in the renderer, because the platforms genuinely differ and a fixed string would keep claiming cookie blocking on Windows long after anyone remembered it wasn't true. Tests assert the per-platform claim: a build that stops blocking cookies while still saying it does is worse than one that never claimed to.
Capture quality
The snapshot script's cleaning previously had no effect — it stripped
nav/footer/scriptfrom a clone, then sent untouchedinnerTextanyway, so navigation and consent banners were what got embedded. Cleaned text now wins, extraction skips non-content subtrees, and five named consent-manager containers are removed (named roots only; a wrong match silently deletes real article text). A thin page now fails honestly instead of being padded with its own chrome up to the capture threshold.Store integrity
library.json; worse, mutations were unsynchronised read-modify-write, so two commands in flight could silently drop one write.with_library_read/with_library_mutfix both. The mutation closure is fallible because callers validate against the library they're about to change, and doing that outside the lock is the race being closed.Performance
Build and CI
.github/workflows/checks.ymlruns clippy and tests on macOS, Linux and Windows for every push, dev-profile and no bundling — a Windows-only compile error used to surface only behind a full release installer build.bun run check:platformsgives the same coverage locally, including a Windows cross type-check that catches WebView2 signature errors from a Mac.Release profile adds
lto = "thin",codegen-units = 1,strip.panic = "abort"is deliberately excluded and documented: every llama.cpp call goes throughspawn_blockingand turns a panic into an error message viaJoinError. Underabortthere is noJoinError— measured, the process takes SIGABRT (exit 134). An abort mid-capture is exactly the orphan state reconciliation exists to clean up.Docs
docs/SECURITY.mdgains sections on content blocking, private tabs, container tabs, what gets captured, and how to verify the platform code.Verification
103 Rust tests pass on macOS and Linux; Windows type-checks; WebKit accepts all rules; lint, typecheck and renderer build clean.
Known gaps