supralune52 downloadsPublish selected Markdown notes and local attachments to a configurable local blog project.
English | 简体中文
Publish selected Obsidian notes and their local attachments to configurable folders in a local blog project. Blog Outbox produces standard Markdown with YAML Frontmatter and does not depend on a specific blog framework.
[!IMPORTANT] Blog Outbox is a desktop-only plugin that accesses files outside your Obsidian vault. It writes only inside the blog project and output folders you configure. Review Security and privacy before using it.
Blog Outbox does not run your blog's build, validation, Git, or deployment commands.
After Blog Outbox is listed in the Obsidian Community directory:
main.js, manifest.json, and styles.css from a GitHub release.<vault>/.obsidian/plugins/blog-outbox/.Use a test vault and a disposable copy of your blog project for your first publishing test.
Open Settings → Blog Outbox and set Blog project root folder to the absolute path of your local blog project.
The following settings are optional. Leave them blank to use their defaults:
| Setting | Default | Purpose |
|---|---|---|
| Post output folder | posts |
Relative folder for generated <slug>.md files. |
| Attachment output folder | assets |
Relative folder for copied attachments. It should map to a publicly served folder in your blog. |
| Attachment public URL prefix | /assets |
URL prefix written into Markdown attachment links. |
| Post public URL template | /posts/{slug}/ |
URL used when converting links to other published notes. Must contain one {slug}. |
| Publish switch field | publish |
Frontmatter field that must be exactly true. |
| Published YAML fields | See below | Complete allowlist of top-level Frontmatter fields copied to the blog. |
| File conflict policy | Stop and report | Stops or skips a post when an unmanaged target file exists. |
| Allow draft publishing | Off | When off, draft: true blocks publishing. |
| Update publish date when publishing | On | When on, publishing updates publishDate in the source note to today's local date. |
Select Validate and save. The plugin checks path boundaries, permissions, and URL settings without assuming a specific blog framework or configuration file.
Add YAML Frontmatter to a note:
---
title: "My first post"
description: "A short summary"
publishDate: 2026-08-22
tags: [Markdown, Obsidian]
draft: false
publish: true
slug: "my-first-post"
---
Only the publish switch is required by Blog Outbox. Your blog determines which other fields, names, and value types it requires.
slug is optional. If omitted, Blog Outbox generates one from title, or from the note file name when no title is available. For a stable public URL, set an explicit slug before the first publish.
Open the command palette and run one of these commands:
When Update publish date when publishing is enabled, the plugin updates the source note's publishDate property to today's local date (YYYY-MM-DD) after publishing is confirmed and before generating the blog-side file. Disable this setting to preserve the existing value. Checks, previews, and cancelled publishes do not edit the note.
Command names and plugin UI follow the current Obsidian language. Chinese locales use Chinese; other locales fall back to English. Reload the plugin after changing the Obsidian language.
The default published-field allowlist contains:
title
description
publishDate
updatedDate
category
tags
draft
featured
readingTime
Edit Published YAML fields to match your blog. Scalar values, arrays, and nested objects are preserved. Fields missing from a note are skipped.
The following control fields are always excluded from published Frontmatter:
publishslugBlog Outbox does not validate your blog's content schema. Run the blog project's own checks or build after publishing.
![[image.png]], ![[image.png|alt text]], and standard Markdown images.![[image.png|640]] and ![[image.png|640x360]] as HTML sizing hints. Rendering depends on the target blog's Markdown and CSS support.http, https, and data: image URLs unchanged and never downloads them.Empty attachments block publishing.
Publishing the same unchanged note is idempotent. Blog Outbox records the source hash, output hash, target path, slug, and attachment references in the vault's plugin data.
If a managed blog-side post changed after the previous publish, the preview warns before allowing an overwrite. If the slug changes, withdraw the existing post first and then publish with the new slug so the old page is not left behind.
Withdrawal uses the plugin record rather than guessing file names. It removes an attachment only when no other managed post references it. If a managed file changed externally, the withdrawal preview warns you, but you can still confirm its deletion.
Blog Outbox accesses the external blog project because publishing requires writing outside the vault.
.blog-outbox-staging-* and .blog-outbox-withdraw-* transaction folders may be created at the blog project root and are removed after success or rollback.<vault>/.obsidian/plugins/blog-outbox/data.json.Do not commit the plugin's data.json to a public repository. Files outside the vault usually cannot be recovered through Obsidian's trash. Review the withdrawal preview carefully before confirming permanent deletion.
<slug>.md.Verify that the path is absolute, the folder exists, and Obsidian has read and write permission. Then select Validate and save again.
Blog Outbox will not take ownership of an unknown file. Move or rename the file, change the note slug, or otherwise resolve the conflict manually.
Run Blog Outbox: Withdraw current post, confirm removal of the old managed output, and publish again with the new slug.
Add the exact top-level field name to Published YAML fields, then validate and save. Optional fields that do not exist in the current note are skipped.
Confirm that the link resolves inside Obsidian. Blog Outbox uses Obsidian's link resolution rather than guessing paths from link text.
Verify the output folders, public URL settings, and YAML allowlist against your blog's requirements, then run the blog's own validation or build command.
Node.js 18 or later is required.
npm ci
npm run dev
For manual testing, place this project in a test vault's .obsidian/plugins/blog-outbox/ folder, or copy main.js, manifest.json, and styles.css there. Reload Obsidian after rebuilding.
Run the complete automated check:
npm run check
This runs TypeScript checks, ESLint, tests, and the production build. Before releasing, also test single publishing, batch publishing, attachments, conflicts, slug changes, and withdrawal in an isolated vault and blog project.
MIT © supralune