Is Markdown Reader safe?
We analyzed Markdown Reader version 3.6.30's actual code and gave it a 78/100 trust score. A purpose-aligned Markdown reader has medium access and limited…
Bottom line
A purpose-aligned Markdown reader has medium access and limited privacy concerns, but no demonstrated abuse or dangerous remote control.
What it can access
It can read matching Markdown/text documents across websites and optionally local files, which fits previewing but may expose private document contents.[Q1][Q2][Q3]
Security weaknesses
No meaningful weakness was demonstrated: remote code execution was not found, and the sign-in message path has several checks.[Q7][Q11][Q16]
Signs of misuse
No clear misuse was found; diagram text goes to a rendering service for the reader feature, while account data goes to the extension’s own service.[Q6][Q14]
Code findings
What access does this extension ask for, and does that access make sense for what it claims to do?
It asks for storage and tabs, access to its own services, and content-script access to Markdown/text URLs on any website. Local-file matching is declared, but Chrome requires the user to separately enable file-URL access.
Declares storage, tabs, the Markdown Reader API host, supported Markdown/text URL patterns across web origins, optional file URL patterns, and the dedicated auth page. — manifest.json:34-110
Which websites can it run on, and can it read or change what appears on those pages?
It runs at document start on supported Markdown/text URLs across web origins and, when permitted, local files. It reads the source text and replaces the page with a formatted reader, outline, controls, and rendered diagrams.
Reads the original document body text, parses it with packaged Markdown plugins, clears the mount element, and renders the reader UI. — dist/content/index.global.js:1100
Limits the main content script to Markdown/text filename patterns and file URLs. — manifest.json:41-101
Can it see sensitive information you type, such as passwords, payment details, messages, or form entries?
It can read the complete contents of a matching document. That could include sensitive text if the user opens a private web document or grants access to a sensitive local Markdown/text file, but it does not monitor password fields or forms on normal websites.
Takes the matching document body's textContent as the raw Markdown source. — dist/content/index.global.js:1100
Can it access private browser data such as cookies, signed-in sessions, browsing history, bookmarks, or downloads?
It uses the tabs permission to inspect and update the current document/auth tab and stores its own account and preference data. It does not request cookie, history, bookmark, or download access and was not found reading other browser sessions.
Requests only storage and tabs plus its fixed API host; no cookies, history, bookmarks, or downloads permission is declared. — manifest.json:34-40
Uses tab state for auth and same-origin document retrieval and stores Markdown Reader account/preferences. — dist/background/index.mjs:29
Can it access anything else on your device, such as files, location, camera, microphone, clipboard, or installed applications?
It can read local Markdown/text files after the user manually enables Chrome's file-URL access toggle. It can write copied code blocks to the clipboard following a click, but it does not read the clipboard or request location, camera, microphone, native-messaging, or general filesystem access.
Declares file URL patterns for supported document extensions and folder views. — manifest.json:56-93
The code-copy control writes the selected rendered code block after a user click. — dist/content/index.global.js:36
Does it send information outside your browser? If so, what information is sent, where does it go, and why?
PlantUML support sends the full text of each PlantUML code block, compressed and encoded in an image URL, to https://www.plantuml.com/plantuml so that service can render an SVG. The plugin is enabled by default, so diagram text from web or local documents may leave the browser.
Builds an img src at www.plantuml.com from @startuml, the trimmed diagram block text, and @enduml. — dist/content/index.global.js:476-478
PlantUML is marked enabled and included in the default plugin list. — dist/content/index.global.js:4, 36
Uses the fixed mdreaderapi.bener.cc origin for optional account token and profile requests. — dist/background/index.mjs:29
Does it download or run code, settings, or instructions supplied by a remote server?
No evidence of this behavior was found in the reviewed package.
Extension pages restrict scripts to the packaged extension origin. — manifest.json:123-125
Targeted network-to-execution tracing found fixed data/image use rather than downloaded code execution. — dist/background/index.mjs, dist/content/index.global.js:complete bundles
Can it take actions without a clear user request, such as opening pages, redirecting searches, downloading files, or sending requests?
It automatically replaces matching documents when opened. Optional auto-refresh can repeatedly refetch the current document after the user enables that setting, and account refresh may contact the fixed services when account state needs updating.
Initializes rendering at page load and starts the document refresher only when the stored refresh setting is enabled. — dist/content/index.global.js:1100
Refreshes expired account tokens and user details against the fixed API. — dist/background/index.mjs:29
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.
No browser-settings, proxy, management, downloads, or search-provider permissions are declared. — manifest.json:34-40
Is any important behavior difficult to inspect because the code is hidden, heavily obfuscated, dynamically generated, or supplied by third parties?
The main content bundle is roughly 5.9 MB and minified, with many packaged libraries, which makes review substantially harder. Sensitive network, rendering, storage, and messaging paths remain identifiable; no encrypted or remotely unpacked application data was found.
Records a large minified content bundle plus bundled background, options, popup, and rendering libraries. — inventory.json:complete file
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.
Targeted dynamic-code searches and surrounding sink review found names/keywords only, with no executable string path. — dist/content/index.global.js, dist/background/index.mjs:complete bundles
The extension-page CSP permits only self-hosted scripts. — manifest.json:123-125
Does it track the websites, pages, searches, or links you visit?
No evidence of this behavior was found in the reviewed package.
Content-script scope is limited to supported document URLs and the dedicated auth page. — manifest.json:41-110
URL use supports rendering, same-origin refresh, folder navigation, and auth rather than visit tracking. — dist/background/index.mjs, dist/content/index.global.js:complete bundles
Does it create a persistent ID or browser fingerprint to recognize you?
Signed-in users are persistently recognized through the Markdown Reader account's access token, refresh token, open ID, name, and email stored locally. No separate advertising ID, device fingerprint, or unrelated cross-site identifier was found.
Defines and persists the account object containing name, email, accessToken, refreshToken, openId, and verification timestamps. — dist/background/index.mjs:29
Does it send cookies, session details, authentication data, or page contents elsewhere?
It sends its own access/refresh credentials to the fixed Markdown Reader services for account operations. Separately, enabled-by-default PlantUML rendering sends each PlantUML block's content to www.plantuml.com inside an encoded image URL.
Adds Markdown Reader bearer tokens to requests sent to mdreaderapi.bener.cc. — dist/background/index.mjs:29
Encodes PlantUML source into the public rendering service URL. — dist/content/index.global.js:476-478
Does it record typing, form entries, clipboard contents, or screenshots?
No evidence of this behavior was found in the reviewed package.
The main script does not run on general pages, only matching documents; no clipboardRead or capture permission is declared. — manifest.json:41-110
Input handling belongs to the reader's own settings/search UI rather than collection from third-party forms. — dist/content/index.global.js:complete bundle
Can a website or remote server send commands that make the extension take actions?
The dedicated Markdown Reader auth page can deliver a one-time login code that makes the extension exchange tokens and close the auth tab. The bridge requires the exact origin/path, originating tab, random state, matching PKCE verifier, message schema, and expiry.
Validates MDR_WEB_AUTH_BRIDGE messages against exact auth URL, tab, state, phase, expiration, and verifier before token exchange. — dist/background/index.mjs:29
The bridge content script runs only at md-reader.github.io/extension-auth/start. — manifest.json:103-110
Does it alter links, referral codes, advertisements, shopping carts, or search results?
No evidence of this behavior was found in the reviewed package.
Link handling supports Markdown rendering and first-party account/help pages; no monetized rewriting logic was found. — dist/content/index.global.js, dist/background/index.mjs:complete bundles
Does it redirect or modify web traffic, request headers, downloads, or proxy settings?
No evidence of this behavior was found in the reviewed package.
No webRequest, declarativeNetRequest, proxy, or downloads permissions are declared. — manifest.json:34-40
The bg-fetch helper rejects any URL whose origin differs from the current tab origin. — dist/background/index.mjs:29
Can it communicate with software on the computer or services running on localhost?
No evidence of this behavior was found in the reviewed package.
Declares no nativeMessaging permission or localhost/private-network host access. — manifest.json:34-40
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.
JWT decoding reads token claims for expiration and plan state. — dist/background/index.mjs:29
PlantUML encoding produces an img src, not executable code. — dist/content/index.global.js:476-478
Can ordinary websites access privileged extension features through messaging or exposed files?
No evidence of this behavior was found in the reviewed package.
Only the auth page receives the bridge script; web-accessible resources are static assets rather than privileged APIs. — manifest.json:103-121
bg-fetch validates a content-script sender and requires requested URL origin to equal the sender tab's URL origin. — dist/background/index.mjs:29
Does suspicious behavior activate only for certain users, websites, dates, or remote settings?
No evidence of this behavior was found in the reviewed package.
Behavior is selected by local feature preferences, account role, document URL, and explicit Chrome file access. — dist/background/index.mjs, dist/content/index.global.js:4, 29, 36
Does it perform hidden resource-intensive work, such as cryptocurrency mining?
No evidence of this behavior was found in the reviewed package.
Work consists of document parsing/rendering, diagrams, highlighting, UI, and optional visible auto-refresh. — dist/content/index.global.js:1100
Does it change form fields or where a form sends its information?
No evidence of this behavior was found in the reviewed package.
The main page script is scoped to document URLs, not general form-bearing pages. — manifest.json:41-110
DOM changes build the reader interface; no third-party form-action rewrite or submission interception was found. — dist/content/index.global.js:complete bundle