A minimal Chrome extension that converts any web page to clean Markdown with a single click. Built for Obsidian users, but works for anyone who wants readable Markdown from the web.
- One-click conversion - click the icon, get Markdown
- Clean output - extracts article content, strips ads/nav/clutter using Mozilla's Readability
- GFM support - tables, strikethrough, task lists via Turndown + GFM plugin
- Obsidian-ready - YAML frontmatter with title, source URL, and date
- Save or copy - download as
.mdfile or copy to clipboard - Preview - expandable preview of the generated Markdown
- No external APIs - everything runs locally in the browser
- Minimal permissions - only
activeTab+scripting(no background access to your browsing)
- Download the latest
save-to-markdown-chrome-mv3.zipfrom Releases - Extract the zip
- Open
chrome://extensions - Enable Developer mode
- Click Load unpacked and select the extracted folder
git clone https://github.com/regen-dev/save-to-markdown.git
cd save-to-markdown
pnpm install
pnpm buildThen load .output/chrome-mv3/ as unpacked extension in Chrome.
- Navigate to any article or page you want to save
- Click the Save to Markdown extension icon
- Click Save .md to download or Copy to clipboard
The generated Markdown includes YAML frontmatter:
---
title: "Article Title"
source: "https://example.com/article"
date: 2026-03-07
---| Component | Role |
|---|---|
| WXT | Extension framework (Vite-based, Manifest V3) |
| Turndown | HTML to Markdown conversion |
| turndown-plugin-gfm | GitHub Flavored Markdown support |
| Readability.js | Article content extraction (by Mozilla) |
popup click
|
v
scripting.executeScript --> grabs page HTML + title + URL
|
v
DOMParser + Readability --> extracts clean article HTML
|
v
Turndown + GFM plugin --> converts to Markdown
|
v
download .md / clipboard
Everything runs in the popup context. No content scripts, no background service worker, no external requests.
| Permission | Why |
|---|---|
activeTab |
Access the current tab's content when you click the icon |
scripting |
Inject a minimal script to read the page HTML |
No <all_urls>, no persistent background, no data collection.
MIT