Is Distill Web Monitor safe?
We analyzed Distill Web Monitor version 4.1.0's actual code and gave it a 56/100 trust score. This is a legitimate monitoring tool with unusually broad…
Bottom line
This is a legitimate monitoring tool with unusually broad website access and a serious weakness in its trusted-site control bridge.
What it can access
It can inspect all websites, selected page content and form values, then store or sync monitoring data; this fits monitoring but is broad. [Q1][Q2][Q3][Q6]
Security weaknesses
A page on an approved Distill website can request broadly selected extension functions without clear method restrictions, creating a serious control weakness. [Q16][Q21]
Signs of misuse
The package shows feature-related syncing and analytics, but no clear deceptive or unexplained misuse is established. [Q6][Q13][Q22]
Code findings
What access does this extension ask for, and does that access make sense for what it claims to do?
It has all-site access plus tabs, scripting, notifications, storage, alarms, and unlimited storage so it can monitor and interact with webpages.
Injects an all-frame loader on all URLs and requests tabs, scripting, notifications, storage, alarms, unlimitedStorage, and all-host access. — manifest.json:33-59
Which websites can it run on, and can it read or change what appears on those pages?
It extracts selected or full-page HTML and text, including shadow-page content, for change monitoring.
Walks the selected DOM, reads text and configured properties or attributes, and builds the monitor result. — content/content.js:2638-2679
Clones and filters the page, then returns its HTML and text. — content/content.js:2789-2826
Can it see sensitive information you type, such as passwords, payment details, messages, or form entries?
A user can configure a monitor to read element properties such as an input's current value; passive collection of every form was not found.
Reads explicitly selected element properties and attributes into monitored text. — content/content.js:2640-2679
Offers the selected element's properties and attributes as monitor fields. — content/content.js:3316-3342
Can it access private browser data such as cookies, signed-in sessions, browsing history, bookmarks, or downloads?
It stores monitor URLs, schedules, selected content, page-change history, snapshots, account data, actions, and macro definitions in extension storage.
Defines persistent stores for monitor configuration, text, HTML/data, metadata, hashes, and snapshots. — common/store-common.js:641-808
Exposes the extension's client, user, monitor, change-data, action, macro, and workspace stores. — chrome/bg.js:16-38
Can it access anything else on your device, such as files, location, camera, microphone, clipboard, or installed applications?
No evidence of this behavior was found in the reviewed package.
Requests no clipboard, downloads, media-capture, desktopCapture, or file-system permission. — manifest.json:47-59
Does it send information outside your browser? If so, what information is sent, where does it go, and why?
Signed-in sync sends monitor data to Distill; product analytics goes to PostHog, and a fifth repeated macro-player failure can attach page HTML to Sentry.
Posts locally created syncable records to the Distill API. — common/sync.js:200-216
Identifies signed-in users and captures named product events with user and client identifiers. — ui/assets/routes-DUU3lCMX.js:6465-6505
After the fifth V2 macro failure, attaches snapshot.html plus steps and URL to a Sentry exception. — common/runner.js:755-799
Does it download or run code, settings, or instructions supplied by a remote server?
It fetches vendor feature flags and, for eligible signed-in accounts, syncs monitor and macro records from Distill.
Loads public feature flags from the Distill API. — common/main.js:1283-1291
Syncs client, user, rule, macro, monitor, change-data, action, group, and workspace stores. — common/sync.js:423-436
Can it take actions without a clear user request, such as opening pages, redirecting searches, downloading files, or sending requests?
Configured monitors run automatically on schedules and can trigger notifications or user-selected remote alert actions.
A new full-page monitor defaults to an interval schedule. — chrome/bg.js:285-317
Runs configured actions after matching a detected change. — common/main.js:1037-1051
Can it change important browser settings, including your proxy, search engine, homepage, privacy settings, or other extensions?
No evidence of this behavior was found in the reviewed package.
Requests no proxy, privacy, settings, or search-provider permission. — manifest.json:47-59
Is any important behavior difficult to inspect because the code is hidden, heavily obfuscated, dynamically generated, or supplied by third parties?
No evidence of this behavior was found in the reviewed package.
Core privileged modules retain clear imports, names, and comments. — chrome/proxy-globals.js:1-64
Does it use eval(), new Function(), or string-based timers to turn text into executable code?
No evidence of this behavior was found in the reviewed package.
Defines an eval-based content API. — content/content.js:143-148
A JavaScript selector reaches eval, then returns an unsupported error when CAN_EVAL_JS is false. — content/content.js:2222-2249
Sets CAN_EVAL_JS only for Electron, not Chrome. — common/port.js:235-243
Manifest V3 extension CSP allows self scripts and wasm unsafe eval, not ordinary unsafe-eval. — manifest.json:30-31
Does it track the websites, pages, searches, or links you visit?
No evidence of this behavior was found in the reviewed package.
Includes the current frame URL and title in its extension port and reports navigation URLs. — content/port-loader.js:9-48
Stores monitor URLs and marks monitor records for server sync. — common/store-common.js:641-672
Does it create a persistent ID or browser fingerprint to recognize you?
PostHog receives account or client identifiers and named product events; automatic page and session recording are disabled.
Identifies the user with user ID, name, client ID, and join date, then sends named events. — ui/assets/routes-DUU3lCMX.js:6465-6505
Initializes PostHog with autocapture, session recording, page views, and page-leave capture disabled. — ui/assets/routes-DUU3lCMX.js:6512-6545
Does it send cookies, session details, authentication data, or page contents elsewhere?
A packaged internal page services can return a monitored page's non-HttpOnly document.cookie string, but a routine caller or upload path for those cookies was not demonstrated.
The callable getDoc API includes document.cookie in its result. — content/content.js:2569-2592
Exposes page-reading helpers through the internal content API used by extension requests. — content/content.js:2780-2833
Does it record typing, form entries, clipboard contents, or screenshots?
User-selected monitors can read input properties and user-created macros can enter values, but no passive keystroke logger or screenshot capture was found.
Reads configured element properties such as value. — content/content.js:2638-2679
A macro step can set a chosen element's value and dispatch input/change events. — content/content.js:620-644
Can a website or remote server send commands that make the extension take actions?
Scripts on Distill's approved web domains can name broad extension modules and methods; this is a latent privileged-control path, not demonstrated active abuse.
Injects the authentication bridge into Distill web domains. — manifest.json:39-44
Forwards unvalidated custom-event details to runtime messaging. — content/auth.js:1-7
Resolves the supplied module and method path and invokes any matching function without a per-method allowlist. — common/main.js:1914-1941
Does it alter links, referral codes, advertisements, shopping carts, or search results?
No evidence of this behavior was found in the reviewed package.
Adds an extension-controlled closed-shadow UI host to the page. — content/content.js:149-153
Maps macro steps to page clicks, selection changes, focus, typing, scrolling, and navigation. — chrome/macro-playback.js:35-116
Does it redirect or modify web traffic, request headers, downloads, or proxy settings?
It fetches user-chosen monitored URLs and Distill service services; no proxy control or arbitrary hidden download mechanism was found.
Fetches the configured monitor URL and loads sanitized HTML into an extension iframe. — chrome/static-loader.js:54-74
Defines the Distill API, analytics, account, broadcast, static, and utility service destinations. — common/cfg.js:18-32
Can it communicate with software on the computer or services running on localhost?
No evidence of this behavior was found in the reviewed package.
Requests no nativeMessaging permission. — manifest.json:47-59
Does it decode, decrypt, or unpack hidden data and then execute or inject it?
No evidence of this behavior was found in the reviewed package.
Syncs MacroStore and SieveStore with the Distill service. — common/sync.js:423-436
Macro records are server-pulled and contain structured steps and parameters. — common/store-common.js:1230-1261
Enables server sync only for authenticated accounts whose server constraint permits it. — common/main.js:1440-1481
Can ordinary websites access privileged extension features through messaging or exposed files?
The Distill-site custom-event bridge exposes a generic dispatcher over Chrome services, authentication, preferences, stores, HTTP helpers, and service methods without a method allowlist.
Any page script on a matched Distill origin can dispatch details into chrome.runtime.sendMessage. — content/auth.js:1-7
The dispatch root includes chrome, auth, Prefs, all stores, HTTP, sync, and service helpers. — chrome/proxy-globals.js:25-62
Uses page-supplied module and method names to resolve and invoke functions. — common/main.js:1918-1941
Does suspicious behavior activate only for certain users, websites, dates, or remote settings?
No evidence of this behavior was found in the reviewed package.
Creates a monitor from the user's active tab and selected schedule. — chrome/bg.js:285-317
Requires a logged-in account and server sync entitlement before remote synchronization. — common/main.js:1440-1481
The trusted-site bridge itself performs no request authentication or method filtering. — content/auth.js:1-7
Does it perform hidden resource-intensive work, such as cryptocurrency mining?
No evidence of this behavior was found in the reviewed package.
Runtime components and permissions are consistent with monitoring, storage, scheduling, and notifications. — manifest.json:13-76
Does it change form fields or where a form sends its information?
User-created macros can set input and select values, but no code that secretly rewrites form actions or diverts submissions was found.
Macro handlers select options or set a chosen element's value and dispatch form events. — content/content.js:591-644
Structured user macro steps invoke select, fill, focus, and type operations. — chrome/macro-playback.js:93-116