@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, likecat.
----------------------------------------------------
/ 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.mdOr install globally:
npm install -g @litlitschi/catsay
catsay README.mdThe 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 | shLinux / macOS — wget
wget -qO- https://raw.githubusercontent.com/LiTLiTschi/catsay/main/install.sh | shNo repo clone needed. The script:
- Works with either
curlorwget(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 | iexInstalls 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@latestOptional 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 ~/.zshrcNote: The alias only applies to interactive shells. Scripts that call
catdirectly 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 ...
catsayFlags
-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
-fvalues 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 of1 - The cat depicted in the original and in
catsayis 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
