Search...Search plugins and themes...
⌘K
Sign in
  • Get started
  • Download
  • Pricing
  • Enterprise
  • Account
  • Obsidian
  • Overview
  • Sync
  • Publish
  • Canvas
  • Mobile
  • Web Clipper
  • CLI
  • Learn
  • Help
  • Developers
  • Changelog
  • About
  • Roadmap
  • Blog
  • Resources
  • System status
  • License overview
  • Terms of service
  • Privacy policy
  • Security
  • Community
  • Plugins
  • Themes
  • Discord
  • Forum / 中文论坛
  • Merch store
  • Brand guidelines
Follow us
DiscordTwitterBlueskyThreadsMastodonYouTubeGitHub
© 2026 Obsidian

Pubcopy

canartuccanartuc289 downloads

Copy notes as platform-optimized HTML for Medium and Substack.

Add to Obsidian
  • Overview
  • Scorecard
  • Updates12

Obsidian plugin that copies your notes as platform-optimized HTML to clipboard for pasting into Medium and Substack without formatting loss.

Install

From Obsidian (recommended)

Settings > Community plugins > Browse > Search "Pubcopy" > Install > Enable

Manual

  1. Download main.js, manifest.json, styles.css from the latest release
  2. Create folder: <your-vault>/.obsidian/plugins/pubcopy/
  3. Copy the 3 files into that folder
  4. Restart Obsidian
  5. Settings > Community plugins > Enable "Pubcopy"

Usage

Three ways to trigger:

Method Behavior
Command Palette (Cmd/Ctrl+P) > "Pubcopy" Copies entire note
Right-click in editor > Pubcopy submenu Copies selected text (or entire note if no selection)
Three-dot menu (top-right of note) > Pubcopy submenu Copies entire note

Each method offers two options:

  • Copy for Medium
  • Copy for Substack

After copying, paste (Cmd/Ctrl+V) into the Medium or Substack editor.

What gets converted

56 Obsidian markdown elements are handled:

Element Medium Substack
Bold, italic, strikethrough, inline code Yes Yes
Highlights ==text== Converted to bold Converted to bold
Headers H1-H4 Yes Yes
Headers H5-H6 Flattened to H4 Yes
Lists (ordered, unordered, nested) Max 2 levels Unlimited
Task lists - [ ] Unicode checkboxes Unicode checkboxes
Callouts > [!note] Styled blockquote with label Styled blockquote with label
Code blocks (with language) <pre><code> <pre>
Tables HTML table HTML table
Images (local) Base64 embedded Base64 embedded
Images (remote URL) URL passthrough URL passthrough
Image captions Italic text below image <figcaption>
Footnotes Superscript + Notes section Native
Math (LaTeX) Rendered via KaTeX Rendered via KaTeX
Mermaid diagrams Stripped (not supported) Stripped (not supported)
Wikilinks, tags, comments, frontmatter Stripped Stripped
Embeds ![[note]] Resolved and inlined Resolved and inlined

Settings

Settings > Community plugins > Pubcopy > Settings

Setting Default Description
Strip frontmatter On Remove YAML frontmatter
Strip tags On Remove #tag references
Strip wikilinks On Convert [[links]] to plain text
Mermaid format SVG SVG or PNG (for future use)
Image handling Auto Auto: base64 for local, URL for remote
Show notification On Display notice after copying

Privacy & permissions

The Obsidian community store shows a "Clipboard Access" label for Pubcopy. That label is a generic notice applied to any plugin that touches the clipboard. Here is exactly what Pubcopy does:

  • Writes only, never reads. Pubcopy calls navigator.clipboard.write() to place your converted note on the clipboard. It never reads the clipboard, so the label's "may expose content copied from outside Obsidian" warning does not apply. That warning concerns plugins that read clipboard contents.
  • Only your note is copied. The clipboard payload is built solely from the note (or selection) you choose to copy, as text/html plus a text/plain fallback.
  • Stays on your device. Pubcopy makes no network requests. Conversion, including math rendering and local image embedding, runs entirely on your machine. Remote image URLs are passed through untouched, never fetched.

Pubcopy is MIT-licensed open source. You don't have to take these claims on trust: the full source is in this repository, so anyone can read it and verify exactly what the plugin does.

Development

Prerequisites

  • Node.js 24+
  • npm

Setup

git clone https://github.com/canartuc/pubcopy.git
cd pubcopy
npm install

Build

# Development (watch mode, rebuilds on file change)
npm run dev

# Production build
npm run build

Test

# Run all tests
npm test

# Watch mode
npm run test:watch

Deploy to your vault

First run asks for your vault path and saves it to .deploy.json (gitignored):

npm run deploy
# > Obsidian vault path: /path/to/your/vault
# > Saved to .deploy.json
# > Deployed to .../plugins/pubcopy

Every subsequent run just builds and copies:

npm run deploy

After deploying, restart Obsidian or reload the plugin.

Project structure

src/
├── main.ts                    # Plugin entry, commands, menus
├── settings.ts                # Settings interface and tab
├── converter/
│   ├── index.ts               # Conversion pipeline orchestrator
│   ├── preprocessor.ts        # Strip frontmatter, tags, wikilinks, etc.
│   ├── html-converter.ts      # Markdown to HTML via remark/rehype
│   ├── image-handler.ts       # Local base64, remote URL, captions
│   ├── embed-resolver.ts      # Resolve ![[note]] embeds
│   ├── footnote-processor.ts  # Platform-specific footnotes
│   └── math-renderer.ts       # LaTeX via KaTeX
├── platforms/
│   ├── index.ts               # PlatformProfile interface
│   ├── medium.ts              # Medium-specific rules
│   └── substack.ts            # Substack-specific rules
├── clipboard/
│   └── writer.ts              # Clipboard API (text/html + text/plain)
└── utils/
    ├── errors.ts              # PubcopyError, WarningCollector
    └── notifications.ts       # Obsidian Notice wrappers

Release

Push a tag to trigger a GitHub Actions release:

# Update version in manifest.json and package.json first
git tag X.Y.Z
git push origin X.Y.Z

GitHub Actions runs tests, builds, and creates a release with main.js, manifest.json, and styles.css.

License

MIT

HealthExcellent
ReviewPassed
About
Copy notes as platform-optimized HTML for Medium and Substack, preserving formatting and converting 56 Markdown elements — headers, lists, code blocks, tables, images, footnotes and KaTeX. Paste converted HTML directly into Medium or Substack from whole notes or selected text.
ExportHTMLMarkdown
Details
Current version
1.5.2
Last updated
4 weeks ago
Created
4 months ago
Updates
12 releases
Downloads
289
Compatible with
Obsidian 1.5.0+
Platforms
Desktop, Mobile
License
MIT
Report bugRequest featureReport plugin
Sponsor
Support
Author
canartuccanartuc
www.canartuc.com
GitHubcanartuc
  1. Community
  2. Plugins
  3. Export
  4. Pubcopy

Related plugins

Marp Slides

Create Marp presentations.

Screwdriver

Utility to put any files in and out under your vault.

Custom Views

Create custom HTML views for your notes based on filter rules. Transform how your notes are displayed.

Importer

Convert your data to Markdown files you can use in Obsidian. Works with Apple Notes, OneNote, Evernote, Notion, Google Keep, and many other formats.

Outliner

Work with your lists like in Workflowy or Roam Research.

Linter

Format and style your notes. Linter can be used to format YAML tags, aliases, arrays, and metadata; footnotes; headings; spacing; math blocks; regular Markdown contents like list, italics, and bold styles; and more with the use of custom rule options.

Custom Frames

Turn web apps into panes using iframes with custom styling. Also comes with presets for Google Keep, Todoist and more.

Various Complements

Complete words similar to auto-completion in an IDE.

Typewriter Mode

Typewriter scroll, writing focus, current line highlight, paragraph dimming, and more!

Chat View

Chat View lets you quickly and easily create elegant Chat UIs in your Markdown Files.