Skip to main content

Open-source CLI for composing and publishing X posts

Project description

xcli

xcli is a command line tool for interacting with the X API.

It is designed for local-first usage, safe publishing defaults, and open-source packaging.

Install

Install from PyPI:

pip install xcli-v2

Quickstart

  1. Set OAuth app credentials:
export TWITTER_CLIENT_ID="..."
export TWITTER_CLIENT_SECRET="..."

Set your app callback/redirect URL to http://localhost:3000/callback. If needed, override in the CLI with XCLI_REDIRECT_URI.

  1. Run login flow (prints an auth URL you can open manually):
xcli auth login

Optional: attempt auto-open in your default browser:

xcli auth login --open-browser
  1. Draft content:
xcli compose "shipping small daily"
  1. Post from terminal text (default):
xcli post "shipping small daily"
  1. Preview without posting:
xcli post "shipping small daily" --dry-run
  1. Post from file:
xcli post --file draft.txt
  1. Attach media (repeat --media up to 4 files):
xcli post "launch day" --media image1.png --media image2.jpg
  1. Post a video with subtitle sidecar:
xcli post --video clip.mp4 --srt clip.srt

Optional post text:

xcli post "launch clip" --video clip.mp4 --srt clip.srt

Currently supported media types are image uploads accepted by the X media upload endpoint (jpeg, png, webp, bmp, tiff). Media upload requires OAuth scope media.write; if you logged in before this was added, run xcli auth login again to refresh token scopes.

For --video, supported formats are .mp4, .m4v, .mov, .webm, and .ts. For --srt, supported subtitle formats are .srt and .vtt. --video and --srt must be used together and cannot be combined with --media.

Commands

  • xcli auth login
  • xcli auth whoami
  • xcli auth status
  • xcli auth logout
  • xcli compose
  • xcli post
  • xcli post --video <file> --srt <file>
  • xcli reply --to <tweet_id>
  • xcli quote --to <tweet_id>
  • xcli posts mine
  • xcli posts mine --replies false
  • xcli posts get --id <tweet_id>
  • xcli posts get --url <post_url>
  • xcli posts get --id <tweet_id> --md --out post.md
  • xcli profile <handle>
  • xcli timeline --user <handle>
  • xcli timeline --user <handle> --replies false

Safety model

  • Posting commands send by default (with confirmation prompt).
  • Use --dry-run to preview payload without posting.
  • Non-interactive workflows can use --yes.
  • Machine output is available with --json.

Auth storage

Default token path uses platform config directories:

  • macOS: ~/Library/Application Support/xcli/auth.json
  • Linux: ~/.config/xcli/auth.json
  • Windows: %APPDATA%\\xcli\\auth.json

Legacy compatibility fallback is supported for ~/.twitter/auth.json.

Development

pip install -e .[dev]
pytest
ruff check
mypy src

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xcli_v2-0.1.6.tar.gz (68.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

xcli_v2-0.1.6-py3-none-any.whl (27.8 kB view details)

Uploaded Python 3

File details

Details for the file xcli_v2-0.1.6.tar.gz.

File metadata

  • Download URL: xcli_v2-0.1.6.tar.gz
  • Upload date:
  • Size: 68.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.3

File hashes

Hashes for xcli_v2-0.1.6.tar.gz
Algorithm Hash digest
SHA256 7676800766aa8313f1a6933e12fb3ce5903e4df3eae2336bdacbeb38a0a34204
MD5 c5f62b21ec79834e7d161484e6fa00e2
BLAKE2b-256 7131899e4b62ae5ced70aba58f2a40147a649960db4a37c0fb4be905ee9bb60a

See more details on using hashes here.

File details

Details for the file xcli_v2-0.1.6-py3-none-any.whl.

File metadata

  • Download URL: xcli_v2-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 27.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.3

File hashes

Hashes for xcli_v2-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 0aef25f9f9534014ae9cbf2813851151a78665287a7d9b5399f5cf6d77d45454
MD5 12558087f1a1f596b6e51a6b5fbf283a
BLAKE2b-256 dbfdeffc33797675fdfcdaca2e101e5cb9b6d0b23bbf3f96b3c3d2acb6fa526d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page