A fast, simple terminal tool to highlight specific words in your command output with colors. Perfect for tailing logs, debugging, and making command output more readable.

ch reads from standard input line by line and:
The preset colors use a pastel palette optimized for readability on both light and dark terminals: Red, Green, Orange, Blue, Pink, Purple.
Colors cycle when you have more than 6 words without custom colors.
The tool is optimized for streaming, making it ideal for real-time log monitoring.
ch [options] <word1> <word2> <word3> ...
Highlights specified words with colors from a preset palette.
ch <word1>::<HEXCOLOR> <word2>::<COLORNAME> <word3> ...
Use custom hex colors (with or without # prefix) or named colors. Words without specified colors use preset colors.
Available named colors: red, green, orange, blue, pink, purple
-s - Case-sensitive matching (default is case-insensitive)-w - Whole word extension - extends match until space or end of line-b - Use background colors instead of foreground colors-a - Play a discreet beep when a match is found# Only highlights exact case matches
echo "Error ERROR error" | ch -s Error
The -w flag extends the match to the entire word (until space or EOL):
# Input: "Notice: backup 13344 - started with name backup_13344.zip"
echo "Notice: backup 13344 - started with name backup_13344.zip" | ch -w back
# Highlights: "backup" and "backup_13344.zip" (entire words)
The -b flag uses background colors instead of foreground colors:
# Highlight with background colors
tail -f app.log | ch -b error warning success
# Mix with custom colors
tail -f app.log | ch -b error::red warning::orange info::blue
The -a flag plays a discreet beep when a match is found; the alert is not even if matches are frequent (max one every 5 seconds):
# Play a beep
tail -f app.log | ch -a panic::red
# Test repeated match heads with a one-second interval
for i in {1..10}; do echo "line $i"; sleep 1; echo "error occurred"; sleep 1; done | ch -a error
# Tail a log file with highlighted keywords
tail -f app.log | ch error warning success
# Highlight with custom colors (hex and named)
tail -f app.log | ch error::red warning::orange info::00FF00
# Monitor system logs
journalctl -f | ch failed::red error::red success::green started::blue
# Watch Docker logs
docker logs -f container_name | ch error warning started stopped
# Monitor Kubernetes pods
kubectl logs -f pod-name | ch error panic fatal warning
# Highlight database queries
tail -f query.log | ch SELECT INSERT UPDATE DELETE
# Database monitoring
mysql -e "SHOW PROCESSLIST;" | ch SELECT UPDATE DELETE INSERT
# Search and highlight
grep -i "error" app.log | ch error exception failed
# Highlight build output
make 2>&1 | ch error warning success completed
# Git log highlighting
git log --oneline | ch feat fix docs style refactor
# Highlight code patterns
cat script.sh | ch function if else error
# Mix preset, named, and hex colors
tail -f app.log | ch error::red warning::FF5500 info debug success::green
# Case-insensitive by default (highlights: error, Error, ERROR, ErRoR, etc.)
tail -f app.log | ch error
# Monitor web server logs with named colors
tail -f access.log | ch GET::blue POST::orange 404::red 500::red 200::green
# Clone or download the repository
git clone <repository-url>
cd ch
# Initialize Go module
go mod init ch
# Build
go build -o ch
# (Optional) Install to your PATH
sudo mv ch /usr/local/bin/
Some programs detect when their output is being piped and switch from line buffering to full buffering for performance. This means output may not appear in real-time when using ch. If you experience delayed highlighting or no output until the program completes, you need to force line buffering using one of these methods:
# Use script (built-in)
script -q /dev/null your-command | ch your-words
# Or install and use unbuffer
brew install expect
unbuffer your-command | ch your-words
# Use stdbuf (usually built-in)
stdbuf -oL your-command | ch your-words
# Or use script
script -qfc "your-command" /dev/null | ch your-words
# Or install and use unbuffer
unbuffer your-command | ch your-words
ch uses buffered I/O and processes input line by line, making it efficient for:
tail -fMIT License - feel free to use and modify as needed.