Is Markdown Here safe?
We analyzed Markdown Here version 2.16.0's actual code and gave it a 84/100 trust score. This is a generally trustworthy Markdown formatter with moderate,…
Bottom line
This is a generally trustworthy Markdown formatter with moderate, user-controlled page access and no established abuse.
What it can access
It can edit the active page and, if enabled, inspect Gmail drafts for its reminder, which fits the formatting purpose but still grants moderate page access. [Q1][Q2][Q8][Q15]
Security weaknesses
No meaningful security weakness was found: injected behavior is packaged, outside pages have no privileged messaging route, and form destinations are not changed. [Q11][Q16][Q21][Q24]
Signs of misuse
No misuse is established, though optional math rendering can send formulas to CodeCogs and expose viewing metadata. [Q6][Q12][Q14][Q17]
Code findings
What access does this extension ask for, and does that access make sense for what it claims to do?
It requests activeTab, scripting, context-menu and storage access. All HTTP(S) host access is optional rather than granted at installation; the packaged UI requests Gmail access only when the user enables the reminder.
Declares activeTab, scripting, storage and optional HTTP(S) host permissions. — manifest.json:17-18
Enabling the reminder explicitly requests mail.google.com permission; disabling it removes permission. — common/options.js:458-479
Which websites can it run on, and can it read or change what appears on those pages?
On user activation, it reads the focused contenteditable element or selection, converts it to Markdown text, and replaces that same range with rendered HTML. It does not scrape unrelated page content.
Requires a button-click message, validates the focused render target and sends only its converted text for local rendering. — chrome/contentscript.js:23-67
Reads the selected fragment or focused element innerHTML. — common/mdh-html-to-text.js:82-90
Replaces the selected range with rendered content and observes that wrapper only for later edit warnings. — common/markdown-here.js:464-516
Can it see sensitive information you type, such as passwords, payment details, messages, or form entries?
No evidence of this behavior was found in the reviewed package.
Limits rendering to the focused contenteditable/design-mode editor and user-triggered render flow. — common/markdown-here.js:100-107,553-628
Manual source searches found no password, payment or credential-specific collection path. — inventory.json:1
Can it access private browser data such as cookies, signed-in sessions, browsing history, bookmarks, or downloads?
No evidence of this behavior was found in the reviewed package.
Requests none of the cookies, history, bookmarks, downloads or tabs permissions. — manifest.json:17-18
Automatic injection is gated by an existing optional permission; normal injection follows a user action. — chrome/backgroundscript.js:161-175,177-207
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.
Declares no device, clipboard, geolocation, file-system or native-messaging permission. — manifest.json:17-18
Does it send information outside your browser? If so, what information is sent, where does it go, and why?
No direct upload of editor content was found. If the user enables math rendering, the formula is encoded into a CodeCogs image URL; loading that image can disclose the formula and viewer network metadata to CodeCogs.
Math rendering is off by default; its default template points to latex.codecogs.com. — common/options-store.js:12-21
When enabled, mathcode is URL-encoded into the configured image template. — common/markdown-render.js:28-33,75-88
First-party fetch calls are local packaged-resource reads, not content uploads. — common/utils.js:290-315,424-435
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.
Loads defaults from packaged files or fixed values and stores user preferences. — common/options-store.js:119-127,296-317
The shared loader is documented and used for local files. — common/utils.js:290-315
Can it take actions without a clear user request, such as opening pages, redirecting searches, downloading files, or sending requests?
The main formatter runs on user action. The optional Gmail reminder can run automatically on mail.google.com after the user enables it and grants permission; it checks the focused draft locally every two seconds and only intercepts a send attempt when Markdown is detected.
User actions trigger normal injection; already granted origins may be injected after page load. — chrome/backgroundscript.js:161-207
The reminder exits unless its preference is enabled and then checks the focused editor every two seconds. — chrome/contentscript.js:82-113
Limits interception to supported mail compose UI and locally tests draft text for Markdown. — common/common-logic.js:112-151,214-217
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.
Declares no settings, proxy, search or management permissions. — manifest.json:17-18
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.
Package inventory separates readable first-party modules from bundled third-party libraries. — inventory.json:1
Identifies itself as DOMPurify 3.2.6 with its license and upstream attribution. — common/vendor/dompurify.min.js:1-2
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.
Injects a fixed list of packaged script paths through chrome.scripting. — chrome/backgroundscript.js:209-262
The repeating timer receives a packaged function reference. — chrome/contentscript.js:92-113
Manual call-site searches found no first-party text-to-code sink. — inventory.json:1
Does it track the websites, pages, searches, or links you visit?
No evidence of this behavior was found in the reviewed package.
Adds the current top-level URL as data-md-url on the rendered wrapper. — common/markdown-here.js:483-490
Does not request history or tabs permission. — manifest.json:17-18
Does it create a persistent ID or browser fingerprint to recognize you?
No evidence of this behavior was found in the reviewed package.
Stored data consists of user rendering preferences and CSS. — common/options-store.js:119-127,149-205
Manual endpoint and API searches found no analytics or fingerprinting path. — inventory.json:1
Does it send cookies, session details, authentication data, or page contents elsewhere?
It does not read cookies, sessions or authentication data. Optional math rendering can expose the user's formula to CodeCogs through an image URL, but this feature is disabled by default and editable by the user.
Does not request cookies permission. — manifest.json:17-18
Math is disabled by default and uses an editable CodeCogs image template. — common/options-store.js:12-21
Encodes formula text into that template only when math is enabled. — common/markdown-render.js:28-33,75-88
Does it record typing, form entries, clipboard contents, or screenshots?
The optional Gmail reminder listens for send-button clicks and send hotkeys, then reads the focused draft to detect Markdown. It is off by default, requires a site permission, processes text locally, and does not log general typing.
The reminder is disabled by default. — common/options-store.js:12-21
Enabling it requests the Gmail origin permission. — common/options.js:458-479
Hooks send UI and Ctrl/Cmd+Enter, reading the compose text only to decide whether to show a local warning. — common/common-logic.js:205-295
Can a website or remote server send commands that make the extension take actions?
No evidence of this behavior was found in the reviewed package.
All injected code paths are fixed packaged files. — chrome/backgroundscript.js:209-262
Behavioral preferences originate from packaged defaults or user storage. — common/options-store.js:119-127,296-317
Does it alter links, referral codes, advertisements, shopping carts, or search results?
No evidence of this behavior was found in the reviewed package.
Deletes and replaces only the operational editor range. — common/markdown-here.js:197-225,464-516
Requires DOMPurify and returns a sanitized DocumentFragment. — common/utils.js:26-55
Converts user-authored Markdown links through the packaged renderer before final sanitation. — common/markdown-render.js:58-72,98-100
Does it redirect or modify web traffic, request headers, downloads, or proxy settings?
No evidence of this behavior was found in the reviewed package.
Declares no webRequest, declarativeNetRequest, downloads or proxy permission. — manifest.json:17-18
Creates ordinary rendered HTML rather than intercepting browser traffic. — common/markdown-render.js:58-72,75-100
Can it communicate with software on the computer or services running on localhost?
No evidence of this behavior was found in the reviewed package.
Does not request nativeMessaging or related system permissions. — manifest.json:17-18
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.
chrome.scripting.executeScript receives only fixed packaged file paths or a literal packaged function. — chrome/backgroundscript.js:209-262
Fetches packaged defaults and a packaged changelog resource. — common/utils.js:290-315,424-435
No first-party eval, new Function, remote import or remote script element was found. — inventory.json:1
Can ordinary websites access privileged extension features through messaging or exposed files?
No evidence of this behavior was found in the reviewed package.
Contains no externally_connectable declaration or page-world content script. — manifest.json:17-45
Handles internal runtime requests from tabs and exposes no external-message listener. — chrome/backgroundscript.js:109-153
The open-tab request is made only by the packaged options page for its packaged test link. — common/options.js:115-126
Does suspicious behavior activate only for certain users, websites, dates, or remote settings?
No evidence of this behavior was found in the reviewed package.
Defines the packaged defaults and user-configurable values. — common/options-store.js:12-21,119-127
Saves the visible options from the extension's settings page. — common/options.js:215-255
Does it perform hidden resource-intensive work, such as cryptocurrency mining?
No evidence of this behavior was found in the reviewed package.
Runs a small two-second focused-editor check only when the reminder preference is enabled. — chrome/contentscript.js:82-113
No mining pool, proof-of-work loop or hidden worker code was found. — inventory.json:1
Does it change form fields or where a form sends its information?
No evidence of this behavior was found in the reviewed package.
Restricts edits to a renderable focused editor and replaces its selected range. — common/markdown-here.js:100-107,464-516
The opt-in reminder pauses a send attempt, shows a local prompt and follows the user's back/send choice. — common/common-logic.js:239-295,399-418,505-534
Manual searches found no form.action assignment or action-attribute rewrite. — inventory.json:1