Draft social media posts in Obsidian, send them to Buffer with one command — queue, schedule, or publish immediately across all your connected channels (X, LinkedIn, Instagram, TikTok, Threads, Bluesky, Mastodon, Facebook, Pinterest, YouTube, Google Business).
Built on Buffer's official GraphQL API.
Your notes are where ideas start. Buffer's integrations cover Notion, n8n, Raycast, and every major AI assistant — but not Obsidian. This plugin closes that gap: write in your vault, publish without leaving it, and keep the note as a permanent record of what was posted where.
- The note is the post — body text becomes the post content, frontmatter carries the config
- The note is the audit trail — after sending, the post ID and status are written back into frontmatter
- No double-posting — a note that already carries a
buffer-post-idis blocked from resending
- Get a Buffer API key: buffer.com → Settings → API → create a key (available on all plans, including Free)
- In Obsidian: Settings → Community plugins → Buffer Publisher → paste the key → hit Test
- You should see
Connected ✓ — N channel(s) found
The API key is stored locally in your vault's plugin data and sent only to api.buffer.com.
- Open (or create) the note you want to post — the note body becomes the post text
- Run Insert Buffer channel into frontmatter (
Cmd/Ctrl+P) and pick a channel - Run Send current note to Buffer
That's it. By default the post is added to your Buffer queue (nothing publishes immediately unless you ask it to).
---
buffer-channel: My LinkedIn # channel name or ID (required — use the insert command)
buffer-mode: addToQueue # optional, defaults to plugin setting
buffer-due: 2026-07-20T09:00 # required only when mode is customScheduled
---
Your post text goes here. Everything below the frontmatter is sent as-is.| Key | Values | Notes |
|---|---|---|
buffer-channel |
channel name or ID | Case-insensitive name match. Set it via the Insert Buffer channel command |
buffer-mode |
shareNow · addToQueue · shareNext · customScheduled |
shareNext puts the post at the front of the queue |
buffer-due |
ISO 8601 datetime | Only used with customScheduled; converted to UTC automatically |
buffer-draft |
true |
Save as a Buffer draft instead of scheduling — safe for pipelines you might re-run |
buffer-thread |
true |
Split the note body on --- dividers into a thread (X/Twitter, Mastodon, Threads, Bluesky only) |
Thread example — one note becomes a 2-post chain:
---
buffer-channel: My X account
buffer-thread: true
---
First post of the thread.
---
Second post. Add more `---` dividers for more posts.| buffer-post-id | (written by plugin) | Set after a successful send; remove it to allow resending |
| buffer-status | (written by plugin) | Post status returned by Buffer |
| buffer-idea-ids | (written by plugin) | IDs of ideas captured from this note |
| Command | What it does |
|---|---|
| Send current note to Buffer | Sends the active note's body to the channel in its frontmatter |
| Insert Buffer channel into frontmatter | Fuzzy-search your connected channels, write the pick into buffer-channel |
| Save selection (or note) to Buffer Ideas | Sends the selected text — or the whole note body if nothing is selected — to your Buffer Ideas board with a group picker; the note title becomes the idea title. Also available from the editor right-click menu when text is selected |
| Quick idea to Buffer | Hotkey-able capture modal: type an idea, pick a group, Cmd/Ctrl+Enter — no note required |
| Show Buffer metrics sidebar | Opens a right-sidebar panel showing per-post performance for the active note |
| Show Buffer ideas sidebar | Browse your Ideas board from Obsidian, grouped by idea group; click an idea to insert its text at the cursor |
| Update Buffer post from note | Edit the note, run this, and the still-unpublished post is updated in place — scheduling is carried forward unchanged |
| Cancel Buffer post (delete) | Deletes the post referenced by buffer-post-id and clears the frontmatter so the note can be sent again |
Open any note that has been sent to Buffer (it carries a buffer-post-id) and run Show Buffer metrics sidebar. The panel shows the post's status and, once Buffer's daily ingestion has run, its performance metrics (reactions, comments, and network-specific numbers like reach, impressions, clicks, engagement rate where the platform provides them). It follows the active note as you switch files.
| Setting | Default | Notes |
|---|---|---|
| Buffer API key | — | Required. Generate at buffer.com → Settings → API |
| Default share mode | addToQueue |
Used when a note has no buffer-mode key |
Beta (now): install via BRAT — add Ray0907/obsidian-buffer as a beta plugin.
Manual: download main.js + manifest.json from the latest release into <vault>/.obsidian/plugins/buffer-publisher/, then enable the plugin in Settings → Community plugins.
- Text-only posts — image/video attachments not yet supported (on the roadmap)
- One channel per note — multi-channel fan-out is planned
- No length validation — the plugin sends your full note body; platform character limits (e.g. X's 280) are enforced by Buffer's API, which returns a clear error
- Instagram/TikTok/YouTube posts are sent with
schedulingType: automatic; Buffer may require additional metadata for some post types on those platforms
- Post performance metrics in a sidebar (v0.2)
- Save ideas to the Buffer Ideas board (v0.2)
- Idea groups, quick capture, ideas browser (v0.3)
- Drafts, edit-in-place, cancel/delete, threads from note dividers (v0.4)
- Multi-channel fan-out from a single note
- Idea → post conversion from the ideas sidebar
- Image/video attachments from vault files (blocked on Buffer's planned media overhaul — the API currently requires already-public URLs that stay live until publish time)
- Pre-send character-count check against the target platform's limit
- LLM-as-judge draft scoring before publish (pre-publish quality gate)
| Symptom | Fix |
|---|---|
Add buffer-channel to frontmatter… |
The active note has no buffer-channel key — the insert command writes to whichever note is open when you run it |
Channel not found: … |
The name in frontmatter doesn't match any connected channel; re-run the insert command |
Channel "…" is disconnected |
Reconnect the channel inside Buffer |
Already sent to Buffer (post …) |
Intentional double-post guard — delete buffer-post-id from frontmatter to resend |
Buffer API HTTP 401 |
API key is wrong or was revoked; generate a new one |
npm install
npm run dev # watch build
npm run build # type-check + production build (main.js)Copy main.js + manifest.json into <vault>/.obsidian/plugins/buffer-publisher/ to test locally.
GraphQL operation shapes were verified against Buffer's official buffer-n8n node, the API reference, and live end-to-end testing against a real account (every command in this README has been exercised against the production API).
This is a community plugin, not an official Buffer product. It talks only to Buffer's public API with your own API key.