MarkPaste is an isomorphic tool that converts rich text to Markdown. It works seamlessly in both the browser as a web application and in Node.js as a library.
- Isomorphic Core: The same robust conversion logic runs in modern browsers and Node.js.
- Rich Text to Markdown: Convert rich text from any source into clean, readable Markdown.
- Multiple Converters: Choose between Turndown for standard conversion or Pandoc (via WASM) for advanced features.
- HTML Cleaning: Optional sanitization to strip unnecessary tags and attributes while preserving structure.
- Web UI: A polished, responsive interface with live HTML preview, syntax highlighting, and dark mode.
- Open the app: Run locally or host the
index.html. - Paste: Copy rich text from a webpage or document and paste it into the input area.
- Get Markdown: View the generated Markdown from multiple converters simultaneously.
- Copy: Click to copy the Markdown to your clipboard.
MarkPaste can be used programmatically in Node.js environments. It uses linkedom to provide a lightweight DOM implementation for the conversion logic.
import {convert} from './src/index.js';
const html = '<h1>Hello World</h1><p>This is <b>bold</b> text.</p>';
// Basic usage (defaults to Turndown)
const markdown = await convert(html);
console.log(markdown);
// Using Pandoc
const pandocMarkdown = await convert(html, {converter: 'pandoc'});
console.log(pandocMarkdown);
// Disabling HTML cleaning
const rawMarkdown = await convert(html, {clean: false});To run MarkPaste locally:
-
Clone & Install:
git clone https://github.com/paulirish/markpaste.git cd markpaste pnpm install -
Start the Web UI:
pnpm start
Access the application at
http://localhost:7025.
The project uses a dual-testing strategy:
- Node.js tests: Unit tests for isomorphic modules (
pnpm test:node). - Playwright tests: End-to-end browser testing (
pnpm test:web).
Run all tests with:
pnpm testThe pandoc.wasm and pandoc.js files used in this project originate from the haskell-wasm/pandoc-wasm project. Since GitHub Actions artifacts are cleaned up after ~90 days and the upstream repository hadn't run its CI recently, a fork was created to generate fresh build artifacts. The files in this project were obtained from that fork's GitHub Actions build artifacts.
This project is licensed under the Apache License 2.0. See LICENSE for details.