npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

ctxcat

v0.1.2

Published

A command-line utility that intelligently gathers and concatenates file contents.

Downloads

5

Readme

image

ctxcat

A command-line utility that intelligently gathers and concatenates file contents into a single, formatted text blob - perfect for creating context-rich prompts for Large Language Models (LLMs).

Features

  • 🚀 Simple & Fast: Works out-of-the-box with sensible defaults
  • 🎯 Smart Filtering: Automatically respects .gitignore and common ignore patterns
  • 🔧 Highly Customizable: Powerful templating system for output formatting
  • 🔗 Unix-friendly: Composable with other CLI tools via stdin/stdout
  • 📁 Flexible Input: Supports files, directories, and glob patterns
  • 🌐 Cross-platform: Consistent behavior across different operating systems

Installation

Quick and easy

npm install -g ctxcat

Manual (recommended)

  1. Download the latest release from the releases page.
  2. Extract the binary to a directory in your $PATH (e.g. /usr/local/bin).

Quick Start

# Concatenate all files in src/ directory
ctxcat src/

# Copy to clipboard (macOS)
ctxcat src/ | pbcopy

# Use glob patterns (recommended - quote them!)
ctxcat "src/**/*.js" "test/**/*.test.js"

# Combine with other tools
find . -name "*.md" | ctxcat

Usage

ctxcat [OPTIONS] [PATH...]

Arguments

  • PATH...: Files, directories, or glob patterns to process
  • If no paths provided, reads newline-separated file paths from stdin

Options

Input & Path Control

| Flag | Description | |------|-------------| | --no-recursive, -nr | Disable recursive directory traversal |

Filtering & Ignoring

| Flag | Description | |------|-------------| | --exclude <pattern>, -e <pattern> | Exclude files matching glob pattern (repeatable) | | --no-gitignore | Don't respect .gitignore files | | --ignore-file <filepath> | Use custom ignore file (.gitignore syntax) | | --no-binary-check | Don't skip binary files |

Output & Formatting

| Flag | Description | |------|-------------| | --output <filepath>, -o <filepath> | Write output to file instead of stdout | | --template <string> | Custom output template (see templating section) |

Utility

| Flag | Description | |------|-------------| | --help, -h | Show help message | | --version, -v | Show version number |

Output Templating

Customize the output format using the --template flag with these variables:

| Variable | Description | Example | |----------|-------------|---------| | {content} | Full file content | console.log('hello'); | | {path} | Relative file path | src/components/Button.js | | {absPath} | Absolute file path | User/project/src/components/Button.js | | {basename} | Filename with extension | Button.js | | {filename} | Filename without extension | Button | | {extension} | File extension (no dot) | js |

Default Template

=== File Start: {path} ===
```{extension}
{content}
```
=== File End: {path} ===

Template Configuration

Create a .ctxcat.template.txt file for default templates. ctxcat searches for this file in:

  1. Current working directory
  2. User's home directory
  3. ~/.config/ctxcat/template.txt

Note: The --template flag always overrides configuration files.

Filtering Rules

Rules are applied in this order (first match wins):

  1. --exclude patterns → Always excluded (highest priority)
  2. Custom ignore files → Excluded if matched
  3. .gitignore files → Excluded if matched (unless --no-gitignore)
  4. Default inclusion → Included if no exclusion rules match

Glob Patterns

ctxcat includes its own powerful glob engine with cross-platform support:

  • * matches any characters except path separators
  • ** matches any characters including path separators (recursive)
  • ? matches any single character
  • [abc] matches any character in brackets

Important: Quote Your Globs!

Recommended:

ctxcat "src/**/*.js" "test/**/*.test.js"

Also works (shell-expanded):

ctxcat src/*.js test/*.js

Quoting ensures ctxcat's glob engine handles the pattern, providing consistent behavior across different shells and platforms.

Examples

Basic Usage

# Process all files in src directory
ctxcat src/

# Process specific files
ctxcat package.json README.md src/main.js

# Process with glob patterns
ctxcat "**/*.{js,ts,json}"

Filtering & Exclusion

# Exclude specific patterns
ctxcat src/ -e "**/__pycache__/**" -e "*.log"

# Use custom ignore file
ctxcat . --ignore-file .contextignore

# Disable gitignore
ctxcat . --no-gitignore

Custom Templates

# Simple template
ctxcat src/ --template "### {path}\n{content}\n---\n"

# Detailed template
ctxcat src/ --template "File: {path} ({extension})\n{content}\n\n"

Piping & Composition

# Copy to clipboard
ctxcat src/ | pbcopy

# Save to file
ctxcat src/ -o context.txt

# Find specific files and process
find . -name "*.config.js" | ctxcat

# Chain with other tools
ctxcat src/ | wc -l

Real-world Examples

# Create LLM context for a React project
ctxcat "src/**/*.{js,jsx,ts,tsx}" "*.{json,md}" --exclude "node_modules/**"

# Documentation files only
ctxcat "**/*.md" "docs/**/*.txt"

# Configuration files across project
find . -name "*.config.*" -o -name ".*rc*" | ctxcat

Tips

  1. Most UI doesn't support pasting large amount of text into their UI. You can create this bash script to create a temp file and then copy it's reference to your clipboard. Then you can paste it as file into your UI.

For macOS

#!/bin/bash

# A script that saves stdout to a uniquely named file in a dedicated
# directory and copies it to the clipboard. It cleans up the *previously*
# created file on each new run.
#
# Usage:
#   some_command | ./this_script.sh

STORAGE_DIR="$HOME/.clipboard_files"
TRACKER_FILE="$STORAGE_DIR/last_file.txt"

mkdir -p "$STORAGE_DIR"

if [ -s "$TRACKER_FILE" ]; then
    LAST_FILE_PATH=$(cat "$TRACKER_FILE")
    if [ -f "$LAST_FILE_PATH" ]; then
        rm "$LAST_FILE_PATH"
    fi
fi

TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
NEW_FILE_PATH="$STORAGE_DIR/clip_${TIMESTAMP}.md"

cat - > "$NEW_FILE_PATH"

osascript -e "set the clipboard to (POSIX file \"$NEW_FILE_PATH\")"

echo "$NEW_FILE_PATH" > "$TRACKER_FILE"

echo ":white_check_mark: File copied to clipboard: ${NEW_FILE_PATH##*/}"
echo "   You can now paste it. The previous file has been cleaned up."

For Linux

#!/bin/bash

# A script that saves stdout to a uniquely named file in a dedicated
# directory and copies it to the clipboard on Linux. It cleans up the
# previously created file on each new run.
#
# Usage:
#   some_command | ./this_script.sh

STORAGE_DIR="$HOME/.clipboard_files"
TRACKER_FILE="$STORAGE_DIR/last_file.txt"

check_dependencies() {
    if ! command -v xclip &> /dev/null
    then
        echo "Error: 'xclip' is not installed."
        echo "Please install it using your distribution's package manager, e.g.:"
        echo "  sudo apt install xclip   (for Debian/Ubuntu)"
        echo "  sudo yum install xclip   (for CentOS/RHEL)"
        echo "  sudo pacman -S xclip   (for Arch Linux)"
        exit 1
    fi
}

check_dependencies

mkdir -p "$STORAGE_DIR"

if [ -s "$TRACKER_FILE" ]; then
    LAST_FILE_PATH=$(cat "$TRACKER_FILE")
    if [ -f "$LAST_FILE_PATH" ]; then
        rm "$LAST_FILE_PATH"
    fi
fi

TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
NEW_FILE_PATH="$STORAGE_DIR/clip_${TIMESTAMP}.md"

cat - > "$NEW_FILE_PATH"

xclip -selection clipboard < "$NEW_FILE_PATH"

echo "$NEW_FILE_PATH" > "$TRACKER_FILE"

echo ":white_check_mark: File copied to clipboard: ${NEW_FILE_PATH##*/}"
echo "    You can now paste it. The previous file has been cleaned up."

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

License

MIT License