#clash #api #cli #tui

bin+lib clashctl

Cli & Tui used to interact with Clash RESTful API

9 releases

Uses new Rust 2021

0.3.2 Dec 13, 2021
0.3.1 Dec 13, 2021
0.3.0-alpha.3 Nov 27, 2021
0.2.2 Nov 6, 2021
0.1.0 Oct 24, 2021

#805 in Command line utilities

Download history 6/week @ 2022-01-31 2/week @ 2022-02-07 3/week @ 2022-02-14 9/week @ 2022-02-21 2/week @ 2022-02-28 37/week @ 2022-03-14 27/week @ 2022-03-21 3/week @ 2022-03-28 9/week @ 2022-04-04 2/week @ 2022-04-11 18/week @ 2022-04-25 93/week @ 2022-05-02 12/week @ 2022-05-09 153/week @ 2022-05-16

276 downloads per month

MIT license

145KB
4K SLoC

Clashctl

About

Easy-to-use TUI & CLI to interact with Clash RESTful API.

Screenshots

Status panel

Status panel

Proxies panel

Proxies panel

Installing

From crates.io

# Full function version
$ cargo install clashctl 
# Or install the tui-only version
$ cargo install clashctl-tui

Compile from source

$ git clone https://github.com/George-Miao/clashctl.git
$ cd clashctl
$ cargo install --path ./clashctl # Note that the path here is *NOT* a mistake - It's a submodule with exact same name that contains the bin

Getting Started

First add an API server:

$ clashctl server add
# Follow the prompts

Use command without subcommands defaults to open TUI:

$ clashctl

# Equals

$ clashctl tui

Or use a subcommand to use the cli:

$ clashctl proxy list

---------------------------------------------------------
TYPE                DELAY   NAME
---------------------------------------------------------
selector            -       All

    URLTest         -       Auto-All
    ShadowsocksR    19      SomeProxy-1
    Vmess           177     SomeProxy-2
    Vmess           137     SomeProxy-3
    Shadowsocks     143     SomeProxy-4

---------------------------------------------------------

Features

  • Pretty terminal UI
  • Change proxies
  • Display proxies, with filter and sorting supported, in both plain and grouped mode
  • Store and use multiple servers
  • Generate completion script (by clap_generate)
  • Manage multiple servers

Done & TODO

  • Cli
    • Manage servers
    • Sort proxies
    • More features
  • TUI
    • Status Panel
    • Proxies Panel
      • Update proxy
      • Test latency
      • Sort by {Original, LatencyAsc, LatencyDsc, NameAsc, NameDsc}
    • Rules Panel
    • Connections Panel
      • Sort
    • Log Panel
    • Debug Panel
    • Config Panel
      • Update clash configs
      • Update clashctl configs
    • Search
    • (Maybe?) mouse support

Prerequisites

You will need nightly rust environment (Cargo & rustc) to compile and install

Usage

Use the TUI

  • Use the cli to config servers (for now)
  • Use number to navigate between tabs
  • Space to hold the list (and therefor move the list)
  • Arrow key to move the list under Hold mode
  • [^d] open debug panel

Use the CLI

$ clashctl -h
clashctl

George Miao <gm@miao.dev>

Cli & Tui used to interact with Clash RESTful API

USAGE:
    clashctl [OPTIONS] [SUBCOMMAND]

OPTIONS:
    -c, --config-path <CONFIG_PATH>    Path of config file. Default to ~/.config/clashctl/config.ron
        --config-dir <CONFIG_DIR>      Path of config directory. Default to ~/.config/clashctl
    -h, --help                         Print help information
    -t, --timeout <TIMEOUT>            Timeout of requests, in ms [default: 2000]
        --test-url <TEST_URL>          Url for testing proxy endpointes [default: http://
                                       www.gstatic.com/generate_204]
    -v, --verbose                      Verbosity. Default: INFO, -v DEBUG, -vv TRACE
    -V, --version                      Print version information

SUBCOMMANDS:
    completion    Generate auto-completion scripts
    help          Print this message or the help of the given subcommand(s)
    proxy         Interacting with proxies
    server        Interacting with servers
    tui           Open TUI

Use as a crate

# cargo.toml

[dependencies]
clashctl-core = "*" # Don't add `clashctl`, that will be the binary crate. `clashctl-core` contains API stuff.

Then in your project:

use clashctl_core::Clash;

fn main() {
  let clash = Clash::builder("http://example.com:9090").unwrap().build();
  println!("Clash version is {:?}", clash.get_version().unwrap())
}

Development

clashctl comes with a justfile to speed up your development. Especially the command just dev, managed to reproduce the hot reload function in front-end development, with cargo-watch.

Just commands

just dev [ alias: d ]

Hot reload development, auto reload on cargo-check approved changes, with all features enabled

just run {{ Args }} [ alias: r ]

Run with feature cli & ui

just ui

Run UI only

just cli

Run CLI only

just build [ alias: b ]

Build in release mode with feature cli & ui

just add

Add an optional dependency, requires cargo-edit

Project structure

$ tree src -L 2
├── clashctl                # Submodule for binary - Both CLI & TUI
├── clashctl-core           # Submodule for API interaction
├── clashctl-interactive    # Submodule for common dependency of CLI & TUI
├── clashctl-tui            # TUI only binary
├── clashctl-workspace-hack # Workspace hack generated by cargo-hakari
└── ...

Dependencies

~13MB
~282K SLoC