Note publisher
approvedby bvn13
Publishes a note (with its images) to a private GitHub repo and creates a UUID-only public link rendered by a Cloudflare Worker. - This plugin has not been manually reviewed by Obsidian staff.
Note publisher
Publish a single Obsidian note — together with its embedded images — to your own private GitHub repository, and get a clean, UUID-only public link that is rendered by a small worker you host yourself.
The plugin is a thin client. There is no vendor backend: the author has no access to your notes, your GitHub token, or your repository. Everything runs between your vault, your GitHub repo, and the worker you deploy.
How it works
Obsidian vault ──(GitHub API, your PAT)──▶ your private GitHub repo
│
▼
worker reads the repo and renders
https://<your-worker>/v/<uuid>
- When you publish a note, the plugin ensures the note has a stable
uuidstored in its properties (frontmatter). If absent, one is generated. - It reads the note body, collects the embedded images, and rewrites the embeds to relative filenames.
- Using your fine-grained GitHub token, it commits the document as
<root>/<uuid>/index.mdplus the images into the same folder of your private repo. - The public link
https://<your-worker>/v/<uuid>is written back into the note's properties and copied to your clipboard.
The worker that turns <uuid> into a readable page is deployed by you. Two
reference implementations are available:
- Cloudflare Worker: https://github.com/obsidian-note-publisher/cloudflare-worker
- Self-hosted worker: https://github.com/obsidian-note-publisher/self-hosted-worker
Requirements
- A private GitHub repository to hold the published documents.
- A fine-grained Personal Access Token with
Contents: Read and writescoped to that repository. - A deployed worker (Cloudflare or self-hosted — see the links above) that has read access to the same repository and renders the public pages.
Installation
From Community Plugins (once approved)
Settings → Community plugins → Browse → search for Note publisher → Install → Enable.
Manual
- Download
manifest.jsonandmain.jsfrom the latest release. - Copy them into
<vault>/.obsidian/plugins/note-publisher/. - Reload Obsidian and enable the plugin in Settings → Community plugins.
Configuration
Open Settings → Note publisher and fill in:
| Setting | Description | Default |
|---|---|---|
| Personal Access Token (write) | Fine-grained PAT with Contents: Read and write. Stored locally in this vault only. | — |
| Owner | GitHub user or organization that owns the repo. | — |
| Repository | Private repository name. | — |
| Branch | Branch to commit to. | main |
| Root directory | Path in the repo under which each document gets its own folder. | docs |
| Worker base URL | Public URL of your worker, no trailing slash. | — |
| UUID property | Note property that stores the document UUID. | publish_uuid |
| Link property | Note property that stores the public URL after publishing. | public_url |
Usage
Open the command palette and run one of:
- Publish current note — uploads the note and its images to the private repo and copies the public link.
- Unpublish current note — deletes the note's folder from the repo, so the public link goes dead. The note keeps its UUID.
- Copy public link — copies the already-published link from the note's properties.
Privacy & network usage
For reviewers and privacy-conscious users, here is exactly what the plugin does over the network:
- The plugin makes outbound requests to one host only:
api.github.com, authenticated with your own fine-grained token, to create, list, and delete files in your private repository. - The plugin does not send your note content to the worker. It only builds
the link string
<worker>/v/<uuid>. The worker independently reads the notes from your GitHub repo — the plugin never talks to it. - No telemetry, no analytics, no calls to any author-controlled server.
- Your GitHub token is stored locally in the vault
(
.obsidian/plugins/note-publisher/data.json) and is never committed to your repo or sent anywhere except GitHub's own API. - All requests use Obsidian's
requestUrl, so the plugin works on desktop without CORS workarounds.
License
MIT — see LICENSE.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.