merrier22 downloadsSync Obsidian notes to GitHub-backed Markdown static-site blogs with image handling and status tracking.
Blog Bridge is an Obsidian plugin for syncing selected notes to GitHub-backed Markdown static-site blogs.
Blog Bridge focuses on file-based Markdown static-site frameworks:
| Framework | Default post path | Default image path |
|---|---|---|
| Hexo | source/_posts |
source/images/obsidian |
| Hugo | content/posts |
static/images/obsidian |
| Jekyll | _posts |
assets/images/obsidian |
| Astro | src/content/blog |
public/images/obsidian |
| VitePress | docs/posts |
docs/public/images/obsidian |
| MkDocs | docs/blog/posts |
docs/assets/images/obsidian |
The paths are configurable, so the presets are starting points rather than hard rules.
title and date.slug or urlname for the output file name, then fall back to a slugified title.Modified when they changed locally after the last successful sync.Install Blog Bridge from Obsidian's Community Plugins marketplace:
Settings.Community plugins and turn off Restricted mode if needed.Browse, search for Blog Bridge, then install and enable it.For local development from source:
cd .obsidian/plugins
git clone https://github.com/merrier/obsidian-blog-bridge.git
cd obsidian-blog-bridge
npm install
npm run build
Configure the plugin from the settings tab:
Blog framework: target Markdown static-site framework.GitHub owner: user or organization that owns the blog repository.GitHub repository: repository name without the owner.GitHub branch: target branch, defaults to main. The branch must already exist.Sync mode: choose Direct commit or Pull Request / MR.MR branch: branch used for Pull Request / MR sync, defaults to blog-bridge/sync. It must differ from the target branch.GitHub token: select an Obsidian SecretStorage entry. The plugin currently accepts tokens that start with ghp_.Sync source directory: vault folder shown in the status page.Blog note template: optional Markdown template for new notes.Apply template to new notes: off by default. When enabled, new empty Markdown files in the sync source directory receive the selected template content.Posts directory: post path in the GitHub repository.Local image directory: image path in the GitHub repository.Image name template: defaults to {{slug}}/{{filename}}.Git commit message template: defaults to chore(blog): sync {{title}}.Use a GitHub classic personal access token because Blog Bridge validates the ghp_ prefix.
data.json.Blog Bridge sends requests to the GitHub REST API to read repository refs, create blobs, commits, branches, and pull requests for the repository you configure. It does not include client-side telemetry, analytics, or advertising.
Blog Bridge is desktop-only because it reads local Markdown notes and local image attachments from your Obsidian vault before uploading the selected note and referenced local images to your configured GitHub repository.
Sync on a row, or select multiple notes and run Sync selected.Sync current note to blog from the command palette.Modified and it can be synced again.Blog Bridge only supports local images. It does not depend on image hosting services.
The plugin resolves Markdown image links and Obsidian wiki image links, commits local images as blobs in the same GitHub commit, and rewrites Markdown links to public site paths for the selected framework.
Image name template variables:
{{filename}} {{slug}} {{index}} {{hash}} {{original}} {{ext}} {{date}}
{{filename}} preserves the Obsidian attachment file name.
Blog note templates support:
{{title}} {{slug}} {{date}} {{datetime}}
Image name templates support:
{{filename}} {{slug}} {{index}} {{hash}} {{original}} {{ext}} {{date}}
Commit message templates support:
{{title}} {{slug}} {{status}}
npm install
npm run build
The build produces main.js, which Obsidian loads from the plugin directory.
If Blog Bridge saves you time maintaining your blog, you can support the author through GitHub Sponsors: