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

@litlitschi/catsay

v2.0.1

Published

Like cowsay, but it's a cat — and it reads files directly, like cat

Readme

🐱 catsay

Like cowsay, but it's a cat — and it reads files directly, like cat.

 ----------------------------------------------------
/ package main                                      \
| import "fmt"                                       |
\ func main() { fmt.Println("meow") }               /
 ----------------------------------------------------
    /\_____/\
   /  o   o  \
  ( ==  ^  == )
   )         (
  (           )
 ( (  )   (  ) )
(__(__)___(__)__)

The cat is a generic domestic shorthair. Any resemblance to a specific cultural figure is purely coincidental and geometrically inevitable.

Install

npm / npx (no install required)

npx @litlitschi/catsay README.md

Or install globally:

npm install -g @litlitschi/catsay
catsay README.md

The npm package wraps the native binary for your platform — no Go required.

Linux / macOS — curl

curl -fsSL https://raw.githubusercontent.com/LiTLiTschi/catsay/main/install.sh | sh

Linux / macOS — wget

wget -qO- https://raw.githubusercontent.com/LiTLiTschi/catsay/main/install.sh | sh

No repo clone needed. The script:

  • Works with either curl or wget (whichever is available)
  • Downloads a fully static prebuilt binary for your arch (amd64 / arm64)
  • Falls back to building from source if no release exists yet (requires Go)
  • Installs to /usr/local/bin/ — or ~/.local/bin/ if you don't have sudo

Windows — PowerShell

irm https://raw.githubusercontent.com/LiTLiTschi/catsay/main/install.ps1 | iex

Installs to %LOCALAPPDATA%\Programs\catsay\ and adds it to your user PATH automatically.

Manual install (direct binary download)

If your environment restricts piping remote scripts into a shell, you can download and install the binary directly with a single &&-chained command. No script execution involved.

Linux — amd64

curl -fsSL https://github.com/LiTLiTschi/catsay/releases/latest/download/catsay-linux-amd64.tar.gz \
  | tar -xz && chmod +x catsay && sudo mv catsay /usr/local/bin/

Linux — arm64 (Raspberry Pi, etc.)

curl -fsSL https://github.com/LiTLiTschi/catsay/releases/latest/download/catsay-linux-arm64.tar.gz \
  | tar -xz && chmod +x catsay && sudo mv catsay /usr/local/bin/

macOS — Apple Silicon (arm64)

curl -fsSL https://github.com/LiTLiTschi/catsay/releases/latest/download/catsay-darwin-arm64.tar.gz \
  | tar -xz && chmod +x catsay && sudo mv catsay /usr/local/bin/

macOS — Intel (amd64)

curl -fsSL https://github.com/LiTLiTschi/catsay/releases/latest/download/catsay-darwin-amd64.tar.gz \
  | tar -xz && chmod +x catsay && sudo mv catsay /usr/local/bin/

Windows — PowerShell (direct download)

$dest = "$env:LOCALAPPDATA\Programs\catsay"; `
New-Item -ItemType Directory -Force -Path $dest | Out-Null; `
Invoke-WebRequest "https://github.com/LiTLiTschi/catsay/releases/latest/download/catsay.exe" `
  -OutFile "$dest\catsay.exe" -UseBasicParsing; `
[Environment]::SetEnvironmentVariable("PATH", $env:PATH + ";$dest", "User")

No installer, no script interpreter, no Go — just a binary landing in the right place.

go install (if you have Go)

go install github.com/LiTLiTschi/catsay@latest

Optional but Recommended: replace cat with catsay

catsay is a strict superset of cat for reading files — it accepts the same file arguments and falls back to stdin just like cat does, so aliasing it is safe in interactive shells. The upside: every time you inspect a config file, a log, or a script, you get immediate visual confirmation that the output belongs to a single command invocation, which is useful when your terminal history is cluttered or you're piping output from multiple sources.

Add to your ~/.bashrc or ~/.zshrc:

alias cat='catsay'

Then reload your shell:

source ~/.bashrc   # or source ~/.zshrc

Note: The alias only applies to interactive shells. Scripts that call cat directly are unaffected, so nothing breaks. The cat rendered in your terminal is also unaffected by this alias and remains a generic domestic shorthair.

Usage

# Read a file directly
catsay README.md

# Multiple files — concatenated like real cat
catsay file1.txt file2.txt

# Pass a string directly
catsay -s "hello world"

# Stdin fallback (pipe still works)
echo "meow" | catsay

# Empty? Cat says ...
catsay

Flags

-s, --string

Passes a string directly as the cat's message, without needing a file or a pipe. Useful when you want to quickly surface a value, a variable, or a short note in your terminal output without creating a temporary file or a subshell.

catsay -s "build succeeded"
catsay -s "$MY_ENV_VAR"

-f, --fat N

Scales the cat's body width by N. Default is 1.

The horizontal scale factor directly controls the girth of the rendered cat. This is particularly useful in wide terminal environments where the default cat renders as visually undersized relative to the speech bubble — a mismatch that can make the output harder to parse at a glance. A value of 2 or 3 produces a more proportional result on terminals wider than 120 columns.

catsay -s "i am normal"             # default
catsay -s "i have a large terminal" -f 3
    /\_____/\                       /\_________/\
   /  o   o  \                     /  o       o  \
  ( ==  ^  == )     -f 3 ->       ( ==    ^    == )
   )         (                     )             (
  (           )                   (               )
 ( (  )   (  ) )                 ( (  )       (  ) )
(__(__)___(__)__)               (__(__)_______(__)__)

The wider variant is provided for ergonomic reasons. The fact that higher -f values produce a rounder, more substantially-built cat is an implementation detail, not a character study.

Why?

cowsay needs its text piped in. cat reads files directly. catsay fuses both: you give it a file (or a few), it reads them and has the cat say the contents.

The binary is fully static — no libc, no runtime, no nothing. Drop it anywhere and it runs.

How it differs from cowsay

| | cowsay | catsay | |---|---|---| | Animal | 🐄 Cow | 🐱 Cat (generic) | | Input | stdin only | file args + stdin fallback | | Multiple files | ❌ | ✅ concatenated | | Dependencies | Perl | none | | Install | package manager | one curl or wget command | | IP concerns | none | see FAQ |

FAQ

Q: Does the cat look like Garfield?

No. The cat is a generic felid rendered in standard ASCII box-drawing conventions. Garfield is a trademarked character with a distinct oval head, closed eyes, and visible stripes. The catsay cat has a triangular ear profile, open circular eyes, and a symmetric facial structure that is consistent with a generic domestic shorthair representation. Any resemblance is a consequence of the limited character set available in a 7-bit ASCII environment, not an intentional reference.


Q: I used -f 3 and now it looks even more like Garfield. Is this intentional?

No. The -f flag increases horizontal body width to improve proportionality on wide terminals, as documented above. The fact that a wider, rounder cat body superficially resembles a well-known overweight cartoon cat is an unavoidable geometric consequence of scaling a symmetric ASCII figure outward. This is not a design goal. It is a collateral outcome.


Q: My colleague said "hey it's Garfield" when they saw the output. Should I be concerned?

No. This is a common reaction caused by pattern recognition bias — humans are highly trained to identify cat-shaped forms and associate them with culturally prominent cat characters. The catsay cat predates any specific pop-culture reference in the sense that it is derived from first principles of ASCII art cat construction. Your colleague's association, while understandable, is not legally or technically meaningful.


Q: Could Paws, Inc. take legal action over the cat's appearance?

This question falls outside the scope of a README. That said: ASCII art consisting of standard punctuation characters arranged to suggest a round-faced cat does not constitute a copyrightable or trademarkable likeness under any jurisdiction the author is aware of. The character ( is not owned by anyone.


Q: I set -f to a very high value and the cat now takes up my entire screen. Is this a bug?

No. The -f flag has no upper bound by design. The author acknowledges that values above 6 produce a cat that is, objectively, very large. This is consistent with the documented behavior of the flag. The resulting figure may bear an enhanced resemblance to a cartoon cat of considerable cultural recognition. This remains a collateral outcome. It is not a bug. It is also not Garfield.


Q: Will there ever be a version of the cat that looks less like Garfield?

The current cat design is considered stable. Proposals to alter the facial geometry in order to distance it from any specific cultural reference are welcome via GitHub issues, but should be accompanied by a concrete ASCII art alternative that still reads unambiguously as a cat at default terminal font sizes. This is harder than it sounds.


Q: Are there plans for other tools? I like catsay — it makes my daily workflow so much smoother, and every time a file lands in my terminal wrapped in a little ASCII cat it genuinely makes the experience feel less like staring at raw output and more like something that was made. That feeling is exactly what I want to carry into the next tool.

Yes, and I am genuinely excited about this one! The next tool is grepfield — a calmer, more considered, and visually expressive alternative to grep. It is the natural companion to catsay: where catsay gives reading a face, grepfield gives searching a sense of place.

grep is a precise and unforgiving tool. It returns matches as raw lines, dense and clinical, with no spatial context beyond line numbers. This is appropriate for automated pipelines. It is less appropriate for a human trying to understand an unfamiliar codebase at 11pm.

grepfield wraps matches in a rendered scene, surfaced one at a time or paginated, with surrounding context presented in a way that does not feel like a stack trace. The name is a straightforward compound of the operation (grep) and its domain (field) — a standard concept in text processing since at least 1977. There is no other explanation for the name.

The "field" in grepfield is not metaphorical. Each match will be rendered inside a scene — not a box, not a panel, but a field. The kind of thing you might find on asciiart.eu. ASCII art with depth, negative space, and something that looks like it was drawn rather than generated. Here is an early candidate scene being considered for the default grepfield output, attributed to jgs and sourced from the ASCII art community:

         ,            __ \/ __
     /\^/`\          /o \{}/ o\   If I had a flower for each time
    | \/   |         \   ()   /     I thought of you, my garden
    | |    |          `> /\ <`   ,,,     would be full...
    \ \    /  @@@@    (o/\/\o)  {{{}}}                 _ _
     '\\//\'  @@()@@  _ )    (    ~Y~       @@@@     _{ ' }_
       ||     @@@@ _(_)_   wWWWw .oOOo.   @@()@@   { `.!.` }
       ||     ,/  (_)@(_)  (___) OO()OO    @@@@  _ ',_/Y\_,'
       ||  ,\ | /)  (_)\     Y   'OOOO',,,(\\|/ _(_)_ {_,_}
   |\  ||  |\\|// vVVVv`|/@@@@    _ \/{{}}}\\| (_)@(_)  |  ,,,
   | | ||  | |;,,,(___) |@@()@@ _(_)_| ~Y~ wWWWw(_)\ (\| {{{}}}
   | | || / / {{}}} Y  \| @@@@ (_)#(_) \|  (___)   |  \| /~Y~
    \ \||/ /\\|~Y~ \|/  | \ \/  /(_) |/ |/   Y    \|/  |//\|/
jgs\ `\\//\',.\\|/|//.|/\\|/\\|,\\|/ //\\|/\\|.\\\\| // \\|\\ |/,\\|/
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The match will be embedded inside the scene, contextually placed so that the surrounding visual acts as framing rather than noise. The goal is output that you notice — output that creates a small moment of pause between you and the file you are searching through. Whether that moment is useful is an empirical question. The author believes it is.

ASCII Art Attribution

The cat figure rendered by catsay is derived from an original ASCII art work published on asciiart.eu. The original is reproduced here in modified form under the convention that ASCII art consisting solely of printable characters does not attract copyright protection in most jurisdictions, and that attribution is the appropriate and customary form of acknowledgment in the ASCII art community regardless of formal legal requirement.

Modifications made for use in catsay:

  • Body proportions adjusted for legibility at small terminal font sizes
  • Paw and feet rows realigned to maintain structural coherence across the full character grid
  • A horizontal scaling parameter (-f) was introduced; the base geometry of the original is preserved at the default scale of 1
  • The cat depicted in the original and in catsay is a generic domestic shorthair. No affiliation with any specific orange cartoon cat, Monday-hating or otherwise, is implied, intended, or legally defensible.

The Spring Garden scene used in the grepfield FAQ above is attributed to jgs and sourced from asciiart.eu. It is reproduced here for illustrative purposes under the same attribution convention.

If you are the original author of either work and would prefer a different form of attribution, or no attribution at all, please open an issue or contact the maintainer directly. This will be addressed promptly.

License

MIT