x-cli, a Rust rewrite whose repository still describes the Ruby tool it replaced
A command-line power tool for Twitter.
At a glance
- What is it?
- The tree, the manifest and the development instructions all say Rust, while the repository description, the recorded primary language and the project homepage still belong to the earlier Ruby command line client. That mismatch is the first thing to sort out, and the rest of the page is a compact status report on a tool with no published release.
- Who is it for?
- This fits a developer who wants the X API from a terminal with OAuth 1.0a and 2.0 both available, YAML config, retries with backoff and streaming, and no runtime beyond a Rust toolchain. Before you rely on it, check three things.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 11 days ago.
- What is it written in?
- Mainly Ruby, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- sferik/x-cli5,598 ★ · +12
| Repository | 2026-09-23 | 2026-11-14 |
|---|---|---|
| sferik/x-cli | 5.6k | 5.6k |
12 Stars in the last 52 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The repository metadata still describes the Ruby tool
Three pieces of repository level information disagree with the code. The description reads `A command-line power tool for Twitter`, the recorded primary language is Ruby, and the homepage is the documentation site of a tool named `t`. What is actually in the tree is Rust: `Cargo.toml`, `Cargo.lock`, `rust-toolchain.toml`, `src/`, `tests/`, and an `x-api/` path dependency, and a `legacy/` directory. The manifest describes the project as `Command-line interface for the X API` at version `6.0.0` on edition 2024, and the page underneath it agrees, opening with a single word as its title. So the code, the manifest and the page agree with each other, and the repository level fields are the ones left over.
The binary is named x while the homepage still serves t
The package, the library and the executable are all called `x`. The library entry points at `src/lib.rs` and the binary at `src/main.rs`, so the command you type is `x`, not `t` and not `x-cli`, even though the repository is named `x-cli`. The development commands confirm the shape:
cargo test
cargo run -- version
cargo run -- accounts --profile /path/to/.xrcThat last one is also the shape of a real invocation: `accounts` is a command, and `--profile` points at a config file rather than relying on the default location in your home directory. The homepage field is the remaining loose end, since it still resolves to the old tool's documentation site.
The release recipe is written down, and no release exists yet
The repository has no GitHub releases, while the manifest is at version `6.0.0` and the page documents the whole tagging procedure. Tagging a new `v*` release is said to trigger GitHub Actions to build binaries for six targets: Linux on x86_64 and aarch64, macOS on x86_64 and aarch64, and Windows on x86_64 and aarch64. The release metadata is in the manifest, where `publish` is `false`, so nothing goes to a registry, `tag-name` is `v{{version}}`, and `tag-message` is `Release {{tag_name}}`. A `pre-release-hook` fetches tags from `origin` first. Driving it needs one tool installed by hand:
cargo install cargo-release --lockedfollowed by `cargo release-tag`, which tags the version already in `Cargo.toml`.
Two API versions with automatic fallback, and two stream mechanisms
The page claims V1.1 and V2 API support with automatic fallback, which means a command can work against either generation without the caller choosing. Streaming is split rather than unified. `stream all` and `stream matrix` use the OAuth2 sample stream, while `stream search`, `stream users`, `stream list`, and `stream timeline` use V2 filtered stream rules plus the stream itself. Both are described as persistent HTTP streaming. There is one knob for it: `X_STREAM_MAX_EVENTS` limits how many events are emitted, and the page says that is useful for tests and automation. The command families themselves are `cli`, `delete`, `list`, `search`, `set`, and `stream`, plus the local ones.
~/.xrc is the config, with ~/.trc read once and migrated on write
The default profile is `~/.xrc`. When that file is missing, `~/.trc` is used as a read fallback and migrated on write, so an old profile from the previous tool keeps working for reads and is converted the first time anything is written. Config parsing goes through `serde_yaml_ng`, so the file is YAML. The development example passes an explicit path with `--profile /path/to/.xrc`, which is the way to test against a config that is not your own. Authentication supports both OAuth 1.0a and OAuth 2.0.
ruler appears in the status list with nothing said about it
The local command list is `accounts`, `set active`, `delete account`, `version`, and `ruler`. The first four explain themselves by name, and `version` is what the development section runs. `ruler` does not appear anywhere else on the page: not in the feature list, not in the command families, not in the examples. There is no sentence anywhere describing what it reads, what it writes, or which part of the account it touches. The same gap exists for the rest of the tree, since `man/`, `etc/`, `x-api/`, and `tmp/` all appear in the root listing while the page covers none of them, and the man pages in particular are not linked even though `clap_mangen` is a dev dependency and therefore the tool that would generate them.
Blocking HTTP plus a repo root that holds a tmp directory
The HTTP dependency is `reqwest` with the `blocking` feature enabled, while the streaming commands are described as persistent HTTP streaming. The path dependency `x-api` holds the HTTP, auth and retry primitives, including the automatic retry with backoff for transient API errors, and it is referenced by path rather than pulled from a registry. The root listing also carries a `tmp/` directory next to `src/`, `tests/`, and `legacy/`, which is an unusual thing to keep in version control and is not explained anywhere.
Editorial conclusion
This fits a developer who wants the X API from a terminal with OAuth 1.0a and 2.0 both available, YAML config, retries with backoff and streaming, and no runtime beyond a Rust toolchain. Before you rely on it, check three things. The recorded primary language is Ruby and the homepage is the old tool's docs, so do not trust the repository metadata over the manifest. There are no published releases, so there are no prebuilt binaries to download; the README's development commands build and run it from source with `cargo run`. And `~/.xrc` is the config to create, with `~/.trc` accepted only as a read fallback that gets migrated the moment anything is written.
Frequently asked questions
What is x-cli and what language is it written in?
It is a command line interface for the X API, and the code is Rust: the manifest declares edition 2024 with a library at `src/lib.rs` and a binary at `src/main.rs`, and development runs through `cargo test` and `cargo run`. The repository level description and the recorded primary language still refer to the earlier Ruby tool.
How do you install or build the x command?
The package is not published to a registry, since the release metadata sets `publish` to false, and the repository has no GitHub releases. The README's development commands build and run it from source with `cargo run`, and the release path is to tag a `v*` release so GitHub Actions builds binaries for six Linux, macOS, and Windows targets.
Where does x-cli keep its configuration?
The default profile is `~/.xrc`, parsed as YAML. If that file is missing, `~/.trc` is read as a fallback and migrated on the first write, so an older profile keeps working. A specific file can be passed instead with the `--profile` option.
Which X API versions does x-cli talk to?
Both V1.1 and V2, with automatic fallback between them. Streaming is separate for each: `stream all` and `stream matrix` use the OAuth2 sample stream, while `stream search`, `stream users`, `stream list`, and `stream timeline` use V2 filtered stream rules plus the stream.
What authentication methods does x-cli support?
Both OAuth 1.0a and OAuth 2.0. The HTTP, auth, and retry primitives live in a path dependency named `x-api` rather than in a published crate, so retry with backoff for transient API errors comes from that local module.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/sferik-x-cli)Star history chart for your README
[](https://hysenlabs.com/projects/sferik-x-cli)Was this useful?