One-click push your Obsidian notes to HackMD.
obsidian-hackmd-push.zip from Releasesobsidian-hackmd-push folder into your vault's .obsidian/plugins/ directoryOnly main.js and manifest.json are required to run the plugin.
hackmd.io/settings#api in your browser (you must be logged in)With any Markdown note open:
| Action | How |
|---|---|
| Push to HackMD | Command palette → Push current note to HackMD, or click the cloud icon in the ribbon |
| Copy link | Command palette → Copy HackMD link |
| Open in browser | Command palette → Open in HackMD |
| Unlink note | Command palette → Unlink from HackMD |
On first push the plugin creates a new HackMD note and writes three fields into your frontmatter:
hackmd-id: abc123xyz
hackmd-url: https://hackmd.io/@username/note-slug
hackmd-pushed-at: 2026-07-28T00:00:00.000Z
Subsequent pushes update the same remote note.
The plugin reads the following frontmatter fields before uploading:
title: My Note Title # used as the HackMD note title; falls back to filename
tags: [CISSP, security] # synced to HackMD tags; string or array both accepted
The frontmatter block itself is stripped from the uploaded content.
| Permission | Default |
|---|---|
| Read | Everyone (guest) |
| Write | Signed-in users |
| Comment | Disabled |
All three can be changed in Settings.
Your API token is stored in plain text at .obsidian/plugins/hackmd-push/data.json. If your vault is synced via iCloud, Obsidian Sync, or Git, the token travels with it. Treat it like a password and regenerate it if you suspect exposure.
![[image.png]]) are not uploaded — HackMD cannot access files on your machine[[note]]) are not converted — they appear as plain text on HackMD> [!note]) are not converted to HackMD container syntaxgit clone https://github.com/EnyaWu/obsidian-hackmd-push
cd obsidian-hackmd-push
npm install
# watch mode (symlink main.js into your vault's plugin folder for live reload)
npm run dev
# production build
npm run build
See ARCHITECTURE.md for a detailed breakdown of every source file.
MIT