Skip to content

Commands

<channel> is a channel id, or a channel name from bfr channels (case-insensitive, resolved against the cache, run bfr channels first).

Two verbs publish live the moment they run (both connected channels have an unpaused queue): post, thread, image. Everything else is safe: it either never reaches an audience, or it edits/reads something that already exists without changing its reach.

channels

Lists every connected channel and caches it for name lookups elsewhere.

bfr channels
Cached 2 channel(s) to .bfr-channels.json
64f1a2b3c4d5e6f7a8b9c0d1    mychannel   linkedin    queuePaused=false
64f1a2b3c4d5e6f7a8b9c0d2    general-x   twitter queuePaused=false

idea

Posts to the ideas board. No channel attached, never posts.

bfr idea ./post.md
IDEA CREATED (draft only, not posted): id=64f1a2b3c4d5e6f7a8b9c0d3

draft

Drafts on a channel (saveToDraft). Never posts.

bfr draft mychannel ./post.md
DRAFT on mychannel (not queued, not published): post id=64f1a2b3c4d5e6f7a8b9c0d4 status=draft

schedule

Moves an existing draft to a scheduled time, or retimes an already scheduled post. Never creates a new post. Optionally carries a LinkedIn first comment, which survives a retime even when --first-comment is omitted on that call (the existing one is read back and echoed rather than silently dropped).

bfr schedule 64f1a2b3c4d5e6f7a8b9c0d4 2026-09-10T14:00:00Z --first-comment "Link in the comments."
SCHEDULED and CONFIRMED by re-read: post id=64f1a2b3c4d5e6f7a8b9c0d4 now due 2026-09-10 14:00 UTC / 2026-09-10 17:00 +03 / 2026-09-10 10:00 EDT

A bare success response from Buffer's API is not trusted here: schedule always re-reads the post afterward and compares the actual resulting dueAt against what was requested, failing loudly if they do not match rather than reporting success on a silent no-op. See the source comment on cmdSchedule for the two verified field combinations (draft to scheduled vs. retiming an already-scheduled post) if you are extending this verb.

post

Publishes live. Queues to the channel; will post.

bfr post mychannel ./post.md
QUEUED: post id=64f1a2b3c4d5e6f7a8b9c0d5 status=queued

thread

Publishes live. ----delimited blocks in the file become a thread.

First tweet in the thread.

---

Second tweet, posted as a reply.
bfr thread general-x ./thread.md
QUEUED: post id=64f1a2b3c4d5e6f7a8b9c0d6 status=queued

image

Publishes live. Drive upload, attach, queue, in one call.

bfr image mychannel ./post.md ./cover.png
Image asset URL: https://drive.usercontent.google.com/download?id=...
QUEUED: post id=64f1a2b3c4d5e6f7a8b9c0d7 status=queued

draft-image

Drafts on the channel with an image attached. Never posts.

bfr draft-image mychannel ./post.md ./cover.png
Image asset URL: https://drive.usercontent.google.com/download?id=...
DRAFT on mychannel (not queued, not published): post id=64f1a2b3c4d5e6f7a8b9c0d8 status=draft

attach-image

Attaches an image to an existing draft or post. Never creates a new post, never changes text, status, or schedule. Takes an already-public URL, not a local file, so it does no Drive upload of its own and does not need BUFFER_DRIVE_ACCOUNT/gog/sips.

bfr attach-image 64f1a2b3c4d5e6f7a8b9c0d4 https://raw.githubusercontent.com/Esturban/ev-assets/main/cover.png
IMAGE ATTACHED: post id=64f1a2b3c4d5e6f7a8b9c0d4 status=draft

update

Replaces an existing draft's text in place. Refuses anything not status=draft (read back first), never touches status, schedule, channel, or assets.

bfr update 64f1a2b3c4d5e6f7a8b9c0d4 ./revised-post.md
UPDATED: post id=64f1a2b3c4d5e6f7a8b9c0d4 status=draft

show

Reads a post or draft back: status, channel, text, assets. Text truncates to 100 characters by default; --full prints it untruncated, which matters when verifying anything appended past that point, such as hashtags.

bfr show 64f1a2b3c4d5e6f7a8b9c0d4 --full
id:      64f1a2b3c4d5e6f7a8b9c0d4
status:  draft
dueAt:   2026-09-10T14:00:00Z
channel: mychannel (linkedin)
text:    The full, untruncated post body appears here, hashtags and all.
firstComment: Link in the comments.
asset:   mimeType=image/png source=https://drive.usercontent.google.com/download?id=...

list

Lists drafts and scheduled posts on a channel (or every channel if none is given): id, status, channel, due time in UTC/Riyadh/New York, text, and whether an image is attached. Read-only.

bfr list mychannel
id  status  channel due(UTC)    due(Riyadh) due(NewYork)    text    image
64f1a2b3c4d5e6f7a8b9c0d4    draft   mychannel           The full, untruncated post b... yes
64f1a2b3c4d5e6f7a8b9c0d5    scheduled   mychannel   2026-09-10 14:00 UTC    2026-09-10 17:00 +03    2026-09-10 10:00 EDT    Another draft's text... no

delete

Permanently deletes a post or draft. Irreversible.

bfr delete 64f1a2b3c4d5e6f7a8b9c0d4
DELETED: post id=64f1a2b3c4d5e6f7a8b9c0d4

version

bfr version
bfr v0.3.0 (commit 2142ded, built 2026-09-04T14:00:44Z)