rick-cli 0.3.0

A better cURL, written in Rust
rick-cli-0.3.0 is not a library.

The Problem

You want to POST some JSON. Here's cURL:

curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d '{"name": "rick"}' https://api.example.com/users

Here's rick:

rick --json '{"name": "rick"}' https://api.example.com/users

That's it. That's the whole pitch.


What's New in v0.3.0

Colors & Typography — rick now has beautiful terminal output:

  • JSON syntax highlighting — Keys, strings, numbers, booleans all in distinct colors
  • Colored HTTP status codes — Green (2xx), Yellow (3xx), Red (4xx/5xx)
  • Method colors — GET=green, POST=blue, PUT/PATCH=yellow, DELETE=red
  • Progress indicators — Spinner during requests, progress bar for large downloads
  • Smart color detection — Auto-disables for pipes/CI, respects NO_COLOR env
# Pretty JSON with colors (automatic when outputting to terminal)
rick https://api.github.com/users/octocat

# Force pretty-print without colors
rick --pretty --no-color https://api.github.com/users/octocat

# Verbose mode shows colored request/response flow
rick -v https://httpbin.org/get

Installation

Pre-built binaries (recommended)

Download the latest release for your platform:

# macOS (Apple Silicon)
curl -L https://github.com/beratcano/rick/releases/latest/download/rick-macos-arm64.tar.gz | tar xz
sudo mv rick-macos-arm64 /usr/local/bin/rick

# macOS (Intel)
curl -L https://github.com/beratcano/rick/releases/latest/download/rick-macos-x86_64.tar.gz | tar xz
sudo mv rick-macos-x86_64 /usr/local/bin/rick

# Linux (x86_64)
curl -L https://github.com/beratcano/rick/releases/latest/download/rick-linux-x86_64.tar.gz | tar xz
sudo mv rick-linux-x86_64 /usr/local/bin/rick

# Linux (ARM64)
curl -L https://github.com/beratcano/rick/releases/latest/download/rick-linux-arm64.tar.gz | tar xz
sudo mv rick-linux-arm64 /usr/local/bin/rick

Or download manually from Releases.

From source

git clone https://github.com/beratcano/rick
cd rick
cargo build --release
sudo cp target/release/rick /usr/local/bin/

Cargo

cargo install rick-cli

Quick Start

# GET request (with JSON syntax highlighting!)
rick https://api.github.com/users/octocat

# POST JSON (the killer feature)
rick --json '{"title": "Hello", "body": "World"}' https://api.example.com/posts

# Custom headers
rick -H "Authorization: Bearer token123" https://api.example.com/me

# Save response to file (with progress bar for large files)
rick -o response.json https://api.example.com/data

# See what's happening (colored request/response)
rick -v https://api.example.com/debug

Why rick?

1. --json flag

The single feature that justifies rick's existence.

# cURL (pain)
curl -H "Content-Type: application/json" -H "Accept: application/json" -d '{"key": "value"}' URL

# rick (joy)
rick --json '{"key": "value"}' URL

2. Beautiful output

JSON responses are automatically syntax-highlighted. Status codes are colored. Errors come with helpful hints.

3. Smart defaults

Behavior cURL rick
Follow redirects No (-L to enable) Yes (--no-follow to disable)
POST when data provided No (-X POST required) Yes (auto-detected)
Colored output No Yes (auto-detected)

4. HTTP-focused

cURL supports 25+ protocols (FTP, LDAP, SMTP, Gopher...). rick supports HTTP and HTTPS. That's it. This keeps the codebase simple, the binary small, and the mental model clear.

5. Zero dependencies

Single static binary. No OpenSSL. No system libraries. Download and run.


Usage

rick [OPTIONS] <URL>

Arguments:
  <URL>  URL to request

Options:
  -X, --method <METHOD>   HTTP method (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS)
  -H, --header <HEADER>   Add header (can be used multiple times)
  -d, --data <DATA>       Request body
      --json <JSON>       JSON body (sets Content-Type & Accept automatically)
  -o, --output <FILE>     Write response to file
  -i, --include           Show response headers
  -v, --verbose           Show request and response headers
      --no-follow         Don't follow redirects
      --pretty            Pretty print JSON response
      --color <MODE>      Color mode: auto, always, never [default: auto]
      --no-color          Disable colors (same as --color=never)
  -h, --help              Print help
  -V, --version           Print version

Examples

GET request

rick https://httpbin.org/get

POST with form data

rick -d "username=rick&password=morty" https://httpbin.org/post

POST JSON

rick --json '{"dimension": "C-137"}' https://httpbin.org/post

Custom headers

rick -H "Authorization: Bearer abc123" -H "X-Custom: value" https://api.example.com

PUT request

rick -X PUT --json '{"updated": true}' https://api.example.com/resource/1

Download file

rick -o image.png https://example.com/image.png

Debug request/response

rick -v https://httpbin.org/get
# > GET https://httpbin.org/get HTTP/1.1    (green GET)
# >
# < HTTP/1.1 200 OK                          (green 200)
# < content-type: application/json
# ...

Include response headers

rick -i https://httpbin.org/get
# HTTP/1.1 200 OK
# content-type: application/json
# ...
#
# {"args": {}, ...}

Disable colors for piping

# Automatic (colors disabled when piping)
rick https://httpbin.org/json | jq .

# Explicit
rick --no-color https://httpbin.org/json > response.json

# Or use NO_COLOR environment variable
NO_COLOR=1 rick https://httpbin.org/json

vs cURL

Feature cURL rick
JSON POST -H "Content-Type: application/json" -d '{}' --json '{}'
Follow redirects Need -L Default behavior
Auto-detect POST Need -X POST Automatic with -d/--json
Colored output No Yes (automatic)
JSON highlighting No Yes
Progress bars Basic Modern with ETA
Protocols 25+ HTTP(S) only
Binary size ~540 KB (dynamic) ~7 MB (static)
Dependencies OpenSSL, libcurl, etc. None

When to use cURL instead

  • You need FTP, SFTP, SCP, or other protocols
  • You need advanced features (cookies file, netrc, proxy auth)
  • You're writing a shell script that must work everywhere
  • Binary size is critical

When to use rick

  • 99% of your API testing
  • You're tired of the JSON header dance
  • You want sane defaults
  • You want beautiful terminal output
  • You want a single static binary

Name

rick = Rust Integrated Curl + K (for fun)

Yes, it should be "ric" but that looked weird.


Design Philosophy

  1. Optimize for the common case — JSON APIs are everywhere, make them easy
  2. Respect muscle memory — Keep familiar flags (-H, -d, -o, -v, -i, -X)
  3. Modern defaults — Follow redirects, auto-detect methods, colorful output
  4. Do one thing well — HTTP only, no feature creep

See DECISIONS.md for detailed design rationale.


Building from source

# Clone
git clone https://github.com/beratcano/rick
cd rick

# Build
cargo build --release

# Run tests
cargo test

# Install locally
cargo install --path .

Requirements

  • Rust 1.75 or later
  • That's it

Contributing

Contributions are welcome! Please read the guidelines:

  1. Keep it simple — rick is intentionally minimal
  2. Discuss first — Open an issue before adding features
  3. Document decisions — Update DECISIONS.md for non-trivial changes
# Format code
cargo fmt

# Run clippy
cargo clippy

# Run tests
cargo test

Roadmap

We're actively developing rick. Here's what's coming:

Version Focus Status
v0.3.0 Colors & Typography Done
v0.4.0 Performance & Benchmarks Up next
v0.5.0 Quality of Life Planned
v0.6.0 Advanced Features Planned

v0.4.0 Highlights (Up Next)

  • Benchmark suite against cURL
  • --time flag to show request duration
  • Response time breakdown (DNS, connect, TLS, first byte)

Want to contribute? Check out ROADMAP.md for the full plan and pick something to work on!

Not planned: Other protocols, cookie jars, feature parity with cURL.


License

MIT License — do whatever you want.