Commands

Full command reference for the Social0 CLI — auth, accounts, posts, analytics, inbox, and ops.

Global package: social0 (v0.2.0). Thin client over https://api.social0.app/v1.

Global flags

Available on every command:

FlagMeaning
--jsonJSON output
--yamlYAML output
--tableTable output (default)
--verboseVerbose request logging (sensitive URLs redacted where needed)
--api-url <url>Override API base for this run

Auth

social0 login
social0 login --skip-passphrase
social0 login --require-passphrase
echo "sk_live_..." | social0 login

social0 logout
social0 whoami
social0 passphrase status
social0 passphrase set
social0 passphrase remove

whoami shows name, email, plan, API URL, and a masked key (GET /v1/me).

Keys must start with sk_live_…. Create them in Developer settings.

Credential storage

  • Prefer OS keychain (macOS Keychain / Linux Secret Service / Windows Credential Manager)
  • Fallback: ~/.social0/ file with mode 0600
  • Optional AES passphrase for file fallback: --skip-passphrase, --require-passphrase, or SOCIAL0_CREDENTIAL_PASSPHRASE
  • Env auth: SOCIAL0_API_KEY is used as-is and not written to disk

Config

social0 config
social0 config list
social0 config get <key>
social0 config set <key> <value>
KeyPurpose
apiUrlAPI base URL
defaultWorkspaceDefault workspace
defaultTimezoneTimezone for natural schedule times
defaultPlatformDefault platform alias
outputFormatDefault output (table, json, yaml)

Config file: ~/.social0/config.json.

Accounts

social0 accounts
social0 accounts connect <platform>    # opens dashboard connect guidance
social0 accounts disconnect <id>

Pass platforms as names (twitter, linkedin, instagram, …) or numeric IDs from social0 accounts. Prefer IDs when multiple accounts share a platform.

Posts

social0 post create -c "Hello" -p twitter linkedin
social0 post create -c "Hello" -p 1 2 --publish
social0 post create -c "Later" -p linkedin -s "tomorrow 9am"

social0 post list
social0 post list --status draft
social0 post show <id>
social0 post edit <id> -c "Updated"
social0 post delete <id>
social0 post init          # sample JSON template

Default post create saves a draft. Add --publish to publish immediately, or -s / --schedule for a time.

Publish / schedule / media / status

social0 publish -c "Ship day" -p twitter linkedin
social0 publish <draft-id>
social0 publish latest
social0 publish post.md
echo "From stdin" | social0 publish -p twitter

social0 schedule -c "Tomorrow launch" -p 1 2 -t "tomorrow 9am"
social0 schedule post.md
social0 schedule batch.json

social0 upload ./hero.png ./clip.mp4
social0 upload ./hero.png --json

social0 status <tracking-id>
social0 status <tracking-id> --watch

publish / schedule targets can be content flags, a draft id, latest, a .md file (supports front matter), or stdin. Schedule also accepts a JSON batch file.

Drafts

social0 drafts
social0 drafts list
social0 drafts publish <id>
social0 drafts schedule <id> -t "tomorrow 9am"
social0 drafts delete <id>

Prefer the full UUID for draft publish/schedule/delete when short IDs fail.

Analytics

Live metrics for posts you published through Social0, read from each network at request time. Default window is the last 7 days. Same live platforms as the dashboard: X, Bluesky, YouTube, TikTok, Pinterest (Meta and LinkedIn are not live yet).

social0 analytics                       # totals, by platform, top posts (overview)
social0 analytics --range 28d
social0 analytics --range custom --since 2026-01-01 --until 2026-02-01
social0 analytics --account bluesky     # numeric ID, platform name, or UUID
social0 analytics --fresh               # bypass warm cache
social0 analytics accounts              # which accounts have live analytics
social0 analytics post <post-id>        # per-network breakdown for one post
social0 analytics --json | jq '.totals'
FlagMeaning
--range7d (default), 14d, 28d, 90d, 365d, or custom
--since / --untilISO dates; required with --range custom
--accountRestrict to one connected account
--freshBypass warm cache (entries younger than 90s may still be cached)

Totals cover the most recent publications in the window, not lifetime numbers.

sampled vs partial: do not fold these into one caveat.

  • sampled — the page was capped. Only the latest N publications were read (sample_limit). Do not quote the total as a lifetime figure.
  • partial — the live request budget ran out before every publication was read.

When the response is capped the CLI prints a Showing the latest N publications warning.

API keys see the personal / main account pool only (same as other /v1 routes).

Inbox

Comments on posts published through Social0, plus DMs on networks that support them.

Comments live: X, Bluesky, YouTube. DMs live: X and Bluesky. TikTok and Pinterest have no comments inbox. YouTube / Pinterest / Facebook / Threads have no DMs. TikTok DMs are not live. Hide is Instagram + Facebook Pages only — not useful on the live inbox set today.

# Comments
social0 inbox                                   # comment threads, last 7 days
social0 inbox --unanswered                      # only threads you haven't answered
social0 inbox --platform bluesky --range 28d
social0 inbox --before <next_before>            # page older publications

# Reply / moderate — both ids come from the list above
social0 inbox reply <comment-id> --publication <publication-id> --text "Thanks!"
social0 inbox like <comment-id> --publication <publication-id>
social0 inbox unlike <comment-id> --publication <publication-id>
social0 inbox hide <comment-id> --publication <publication-id>   # Instagram, Facebook Pages

# DMs
social0 inbox dms
social0 inbox dm <conversation-id> --account <id>
social0 inbox dm-reply <conversation-id> --account <id> --text "On it."

# Which accounts have an inbox
social0 inbox accounts
social0 inbox accounts --dms

--publication is the publication_id shown in social0 inbox --json. Social0 verifies the comment is actually on that post before sending, so a wrong id is rejected rather than posted to the wrong thread. reply needs both comment_id and publication_id.

Inbox pages are per publication, so a page can come back empty while older publications remain. The CLI follows next_before once on its own; if the page is still empty it prints 0 threads on this page with the cursor to pass to --before. In --json mode check has_more before treating an empty threads array as "no comments".

When the API answers 429, the CLI already retried with Retry-After; the final error prints how many seconds to wait. Live analytics and inbox reads share a per-minute budget with the dashboard.

Project / ops

social0                 # interactive menu
social0 examples
social0 link -p twitter linkedin
social0 link -f json    # writes .social0 in the current directory

social0 watch           # monitor publish queue
social0 logs            # stream publish events
social0 export out.json
social0 import in.json

social0 completion bash
social0 completion zsh
social0 completion fish
social0 completion powershell

social0 doctor
social0 version
social0 update

Custom API URL

Priority (highest first):

  1. --api-url <url>
  2. SOCIAL0_API_URL
  3. social0 config set apiUrl … (~/.social0/config.json)
  4. Default https://api.social0.app/v1

The CLI appends /v1 if you omit it.

social0 --api-url https://api.social0.app accounts
export SOCIAL0_API_URL=https://api.social0.app/v1
social0 config set apiUrl https://api.social0.app/v1
social0 config get apiUrl

Environment variables

VariablePurposeDefault
SOCIAL0_API_KEYAPI key for CI / headless
SOCIAL0_CREDENTIAL_PASSPHRASEEncrypt local fallback credentials
SOCIAL0_API_URLAPI basehttps://api.social0.app/v1
SOCIAL0_REQUEST_TIMEOUT_MSRequest timeout30000
SOCIAL0_MAX_RETRIESRetries on HTTP 4293
SOCIAL0_VERBOSEVerbose logs (1 to enable)0

Coming soon

These commands exist in the CLI but are not ready yet — don’t rely on them:

  • social0 suggest
  • social0 improve
  • social0 hashtags