cctv

Crates.iocctv
lib.rscctv
version0.8.1
created_at2025-05-02 08:21:15.784498+00
updated_at2025-08-29 21:50:16.33507+00
descriptionTerminal interface for CoolerControl
homepage
repositoryhttps://gitlab.com/coolercontrol/cctv
max_upload_size
id1657437
size214,908
(caferen)

documentation

README

cctv_logo
cctv

A terminal client for CoolerControl.

:warning: Requires the CoolerControl service daemon to be running either locally or remotely, see Configuration.

[[TOC]]

Building

Clone the git repo and build with cargo. Requires a working Rust installation.

git clone https://gitlab.com/coolercontrol/cctv.git
cd cctv
cargo build --release
cargo run --release

Installing/Upgrading

There are no packages for distributions yet but you can download and install the latest binary artifact built from master or build from source yourself.

Latest release

curl -LOJ --clobber --output-dir "/tmp" \
    https://gitlab.com/api/v4/projects/69657520/packages/generic/master/latest/cctv
sudo install -Dm 755 /tmp/cctv -t /usr/bin

From source

Install with cargo. Requires a working Rust installation.

cargo install --git https://gitlab.com/coolercontrol/cctv.git

From crates.io

cctv is also published to crates.io. Note that the version there may be slightly outdated.

cargo install cctv

Make sure $HOME/.cargo/bin is in your path:

# Bash users
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

# zsh users
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

Usage

CLI

Usage: cctv [OPTIONS]
TUI client for CoolerControl

Options:
  --list-modes, -l                              Lists all available modes.
  --activate-mode <mode-name>, -a <mode-name>   Activates the specified mode.
  --daemonize                                   Do not launch the TUI and daemonize cctv.
  --activate-previous-mode, -p                  Activates the previously active mode. 
  --dump                                        Dump information about the system to stdout as json.
  --help, -h                                    Shows this help message.

If no options are passed, the application will launch into the TUI.

The dump command is meant to be used with jq. To get the name of the currently active mode:

cctv --dump | jq -r '.state.current_mode_uid as $uid | .modes[] | select(.uid == $uid) | .name'

Feel free to reach out to request shortcuts for commonly used operations.

TUI

Keybindings

For the differences between working and saved changes or edit and normal modes, refer to editing profiles.

Keys Page Mode Action
Down, e, j All Normal Select next item
Up, i, k All Normal Select previous item
Right, o, l All Normal Go to the next page
Left, n, h All Normal Go to the previous page
R All Normal Refresh app data
s All Normal Toggle legend visibility
q All Normal Quit
Ctrl+b All Normal Toggle dock visibility. You can still use relevant keybindings when the dock is hidden.
a Devices Normal Toggle between the default and the alternative chart
Enter Modes Normal Activate currently highlighted mode
D Profiles All Discard working changes
E Profiles Normal Enter edit mode
A Profiles Normal Apply saved changes to daemon
Esc Profiles Edit Exit edit mode
Enter Profiles Edit Save working changes
Right, o, l Profiles Edit Move cursor right
Left, n, h Profiles Edit Move cursor left
Backspace Profiles Edit Delete one character
digits, space, dot, comma, [, ] Profiles Edit Insert the character

Editing profiles

Profile editing is a work-in-progress. There's experimental support for manipulating graph and fixed profiles.

:warning: Take a backup of your config before editing - there may be breakages.

There are two input modes: edit and normal. Normal mode is the default.

When you enter edit mode you will see a popup populated with the current settings.

Edits are in one of three states: working, saved, and applied.

State Description
Working Changes made but not saved within cctv. Visible only in the text box.
Saved Changes saved in cctv but not submitted to CoolerControl. Used for graph drawing, ineffective until applied.
Applied Final changes successfully sent to the daemon.

:light_bulb: Working changes are preserved (without being saved) when moving between edit and normal modes.

Changes are validated when moving between stages.

From To Validation
Working Saved All syntactically correct changes are accepted.
Saved Applied All changes deemed valid by the daemon are accepted.

There are no guard rails beyond these. You will be notified of any errors. Lack of a notification indicates success.

:light_bulb: To discard saved changes: press 'R' to sync cctv with the daemon.

:warning: Changes made in cctv require a page refresh to be reflected in the GUI. The reverse is also true.

Alerts

cctv will listen for server side events both when daemonized and in interactive mode. It will send desktop notifications when it receives an alert.

Configuration

Configuration is optional. cctv will attempt to construct configurations from below locations, in order of precedence:

  • Environment variables listed below.
  • coolercontrold configuration file
  • CoolerControl defaults

This means that if you're overriding CoolerControl's defaults, cctv will automatically pick some of them up. But you can still override them specifically for cctv with the environment variables e.g. to have cctv connect to a remote CoolerControl instance instead of your local daemon.

Note that there's currently no SSL or IPv6 support.

Environment variables

Environment Variable Description Default
CCTV_DAEMON_PORT Port CoolerControl is listening on. 11987
CCTV_DAEMON_ADDRESS Address CoolerControl is listening on. 127.0.0.1
CCTV_DAEMON_CONFIG_FILE_PATH Path to CoolerControl's config file. /etc/coolercontrol/config.toml
CCTV_TIME_RANGE Time range in seconds for device charts. 60
CCTV_USERNAME CoolerControl username. Internal default
CCTV_PASSWORD CoolerControl password. Internal default
CCTV_NO_SPLASH Skips splash screen. false
Commit count: 130

cargo fmt