Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

dtonon/ch

Colored Highlighter - A fast, simple terminal tool to highlight specific words in your command output with colors

dtonon/ch.json
{
"createdAt": "2025-10-13T09:47:30Z",
"defaultBranch": "master",
"description": "Colored Highlighter - A fast, simple terminal tool to highlight specific words in your command output with colors",
"fullName": "dtonon/ch",
"homepage": null,
"language": "Go",
"name": "ch",
"pushedAt": "2025-10-16T11:40:21Z",
"stargazersCount": 131,
"topics": [],
"updatedAt": "2025-12-26T17:05:12Z",
"url": "https://github.com/dtonon/ch"
}

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.

![]!(screenshot.png)

  • Automatic color assignment from a preset palette
  • Custom hex colors for specific words
  • Optiona discreet sound on match
  • Case-insensitive matching by default
  • Whole word extension mode
  • Fast and efficient - designed for real-time log tailing
  • Cross-platform - works on macOS and Linux

ch reads from standard input line by line and:

  1. Searches for specified words (case-insensitive by default)
  2. Highlights matches with assigned colors
  3. Handles overlapping matches (first match wins)
  4. Outputs to standard output with ANSI color codes

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.

Terminal window
ch [options] <word1> <word2> <word3> ...

Highlights specified words with colors from a preset palette.

Terminal window
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
Terminal window
# 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):

Terminal window
# 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:

Terminal window
# 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):

Terminal window
# Play a beep
tail -f app.log | ch -a panic::red
Terminal window
# 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
Terminal window
# 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
Terminal window
# Highlight database queries
tail -f query.log | ch SELECT INSERT UPDATE DELETE
# Database monitoring
mysql -e "SHOW PROCESSLIST;" | ch SELECT UPDATE DELETE INSERT
Terminal window
# 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
Terminal window
# 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
Terminal window
# 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:

Terminal window
# 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
Terminal window
# 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:

  • Large log files
  • Real-time streaming with tail -f
  • High-throughput pipelines
  • Continuous monitoring scenarios
  • Go 1.16 or higher (for building)
  • Terminal with ANSI color support (most modern terminals)
  • macOS or Linux operating system

MIT License - feel free to use and modify as needed.