blowhorn content

blowhorn content: delete, get, list, upsert.

The blowhorn content commands. Each one's --help prints the same text.

Command What it does
content delete Delete one post by number.
content get Print one post by number.
content list List the content queue's rows with their state and, for each, the profiles a post run would select it for right now ('Pending for' -- the same selection 'blowhorn post --check-queue' prints, read f...
content upsert Create a post, or update one in place, from a JSON object of column: value pairs in the queue's own column names.

blowhorn content delete

Delete one post by number. Requires --yes; --dry-run reports the row and touches nothing; --expected-fingerprint refuses the delete if the row changed since it was read. The row is removed from the store and every other row keeps its number.

output
blowhorn content delete [OPTIONS] row
Argument Required Description
row yes Post number, as 'content list' prints it (stable for the life of the post)
Flag Type Default Description
--yes boolean false Confirm the delete; without it the command refuses and exits 1 (use --dry-run to preview)
--expected-fingerprint string Refuse the write if the post's fingerprint (from 'content get' or 'content list') no longer matches
--json boolean false Emit machine-readable JSON output (the shape the desktop app's Content screen reads)
--platform string all Platform filter for 'blowhorn content': 'content list' keeps the Content rows whose Platform column names this platform, and no other content subcommand reads it. One of: bluesky, github, hn, linkedin, reddit, slack, x, all ('all' applies no filter, so every row is listed)
--pace string Accepted by 'blowhorn content delete' because --pace is a global flag, but this command does no paced work -- it opens no browser and sleeps between nothing -- so the value changes nothing about how it runs and appears only in the Pace column of the -v summary. Resolved as CLI flag, then BLOWHORN_PACE, then defaults.pace in .blowhorn.yaml (normal when none is set); an unrecognized value is rejected before anything runs

Also takes the shared flags: --config, --log-dir, --profile, --exclude, --headless, --chrome-launch, --headed, --dry-run, --verbose.

Examples:

terminal
blowhorn content delete 12 --dry-run
blowhorn content delete 12 --yes --json
blowhorn content delete 12 --yes --expected-fingerprint 3f2a1c

Output: json with --json, text otherwise.

blowhorn content get

Print one post by number: every column, its state, its validation problems, and the fingerprint that 'content upsert' and 'content delete' take as --expected-fingerprint so a later write can refuse a row edited in the store meanwhile.

output
blowhorn content get [OPTIONS] row
Argument Required Description
row yes Post number, as 'content list' prints it (stable for the life of the post)
Flag Type Default Description
--json boolean false Emit machine-readable JSON output (the shape the desktop app's Content screen reads)
--platform string all Platform filter for 'blowhorn content': 'content list' keeps the Content rows whose Platform column names this platform, and no other content subcommand reads it. One of: bluesky, github, hn, linkedin, reddit, slack, x, all ('all' applies no filter, so every row is listed)
--pace string Accepted by 'blowhorn content get' because --pace is a global flag, but this command does no paced work -- it opens no browser and sleeps between nothing -- so the value changes nothing about how it runs and appears only in the Pace column of the -v summary. Resolved as CLI flag, then BLOWHORN_PACE, then defaults.pace in .blowhorn.yaml (normal when none is set); an unrecognized value is rejected before anything runs

Also takes the shared flags: --config, --log-dir, --profile, --exclude, --headless, --chrome-launch, --headed, --dry-run, --verbose.

Examples:

terminal
blowhorn content get 12 --json
blowhorn content get 12

Output: json with --json, text otherwise.

blowhorn content list

List the content queue's rows with their state and, for each, the profiles a post run would select it for right now ('Pending for' -- the same selection 'blowhorn post --check-queue' prints, read from the profiles roster). One read of the store; nothing is written and no browser opens.

--profile keeps rows addressed to those profiles or to 'all'; --platform keeps one platform; --pending keeps only rows some profile would pick up now. --json is the shape the desktop app's Content screen reads, fingerprints included.

output
blowhorn content list [OPTIONS]
Flag Type Default Description
--pending boolean false Only posts some profile would pick up right now: the posts 'blowhorn post --check-queue' lists
--json boolean false Emit machine-readable JSON output (the shape the desktop app's Content screen reads)
--platform string all Platform filter for 'blowhorn content': 'content list' keeps the Content rows whose Platform column names this platform, and no other content subcommand reads it. One of: bluesky, github, hn, linkedin, reddit, slack, x, all ('all' applies no filter, so every row is listed)
--pace string Accepted by 'blowhorn content list' because --pace is a global flag, but this command does no paced work -- it opens no browser and sleeps between nothing -- so the value changes nothing about how it runs and appears only in the Pace column of the -v summary. Resolved as CLI flag, then BLOWHORN_PACE, then defaults.pace in .blowhorn.yaml (normal when none is set); an unrecognized value is rejected before anything runs

Also takes the shared flags: --config, --log-dir, --profile, --exclude, --headless, --chrome-launch, --headed, --dry-run, --verbose.

Examples:

terminal
blowhorn content list
blowhorn content list --profile kate
blowhorn content list --platform x --pending --json

Output: json with --json, text otherwise.

blowhorn content upsert

Create a post, or update one in place, from a JSON object of column: value pairs in the queue's own column names. Without --row a new row is created and given the next row number; with --row the payload is merged over that row, and every column it does not name is left as it was.

Platform must be one 'blowhorn post' publishes to (linkedin, x, reddit, slack, bluesky, github); Approved? takes yes or no (JSON true/false are written as yes/no); Promote On must parse (YYYY-MM-DD HH:MM:SS); Profile must name a profile the store knows, or 'all'. Unknown fields are refused rather than written. --expected-fingerprint refuses the write if the row changed since 'content get' or 'content list' read it. --dry-run prints the payload and touches nothing.

output
blowhorn content upsert [OPTIONS]
Flag Type Default Description
--payload string JSON object of Content column: value pairs in the queue's own column names, for example '{"Platform":"x","Profile":"kate","Message Text":"hello","Approved?":"yes"}'
--row integer Post number to update in place; omit to create a new post
--expected-fingerprint string Refuse the write if the post's fingerprint (from 'content get' or 'content list') no longer matches
--json boolean false Emit machine-readable JSON output (the shape the desktop app's Content screen reads)
--platform string all Platform filter for 'blowhorn content': 'content list' keeps the Content rows whose Platform column names this platform, and no other content subcommand reads it. One of: bluesky, github, hn, linkedin, reddit, slack, x, all ('all' applies no filter, so every row is listed)
--pace string Accepted by 'blowhorn content upsert' because --pace is a global flag, but this command does no paced work -- it opens no browser and sleeps between nothing -- so the value changes nothing about how it runs and appears only in the Pace column of the -v summary. Resolved as CLI flag, then BLOWHORN_PACE, then defaults.pace in .blowhorn.yaml (normal when none is set); an unrecognized value is rejected before anything runs

Also takes the shared flags: --config, --log-dir, --profile, --exclude, --headless, --chrome-launch, --headed, --dry-run, --verbose.

Examples:

terminal
blowhorn content upsert --payload '{"Platform":"linkedin","Profile":"kate","Message Text":"Meshery v0.9 is out","Approved?":"yes","Promote On":"2026-09-01 09:00:00"}' --json
blowhorn content upsert --payload '{"Platform":"github","Profile":"all","Amplify":"https://github.com/layer5io/meshery/issues/1234","Approved?":"yes"}' --json
blowhorn content upsert --row 12 --payload '{"Approved?":"yes"}' --expected-fingerprint 3f2a1c --json
blowhorn content upsert --payload '{"Platform":"x","Profile":"kate","Message Text":"hello"}' --dry-run

Output: json with --json, text otherwise.

Last modified October 18, 2026