CATGIRL(1)
π NAME π
catgirl β IRC client
aka catgirl(1) π β¨
β¨ SYNOPSIS β¨
okay so here's the vibe when you run it:
catgirl [-Relqv] [-C copy] [-H hash] [-I highlight] [-N notify]
[-O open] [-S bind] [-T[timestamp]] [-a plain] [-c cert]
[-h host] [-i ignore] [-j join] [-k priv] [-m mode] [-n nick]
[-p port] [-r real] [-s save] [-t trust] [-u user] [-w pass]
[config ...]
catgirl -o [-S bind] [-h host] [-p port] [config ...]
catgirl -g cert
π¦ DESCRIPTION π¦
okay so the catgirl IRC client gives you a curses interface for TLS-only Internet Relay Chat. The only required option is <code>-h</code>, the host name to connect to. Peep the βEXAMPLESβ section for managing further configuration. Type <code>/help</code> in catgirl to view the list of βCOMMANDSβ and βKEY BINDINGSβ π
Options can be loaded from files listed on the command line. Files are searched for in <code>$XDG_CONFIG_DIRS/catgirl</code> (usually <code>~/.config/catgirl</code>) unless the path starts with β/β, β./β or β../β. Files and flags listed later on the command line take precedence over those listed earlier. No cap.
Each option is placed on a line, and lines beginning with β#β are ignored. The options are listed below following their corresponding flags. Periodt.
Here's every flag and config line, fr fr:
-Cutil |copy = utilβ sets the utility used by/copy. Subsequentcopyoptions append arguments to util. The URL to copy is provided to util on standard input. The default is the first available ofpbcopy(1),wl-copy(1),xclip(1),xsel(1). π-Hseed,bound |hash = seed,boundβ sets the initial seed of the nick and channel color hash function and the maximum IRC color value produced by the function. The default is0,75. To use only colors from the 16-color terminal set, use0,15. To disable nick and channel colors, use0,0. π¨-Ipattern |highlight = patternβ adds a case-insensitive message highlight pattern, which may contain β*β, β?β and β[]β wildcards as inglob(7). The format of the pattern is:nick[!user@host [command [channel [message]]]]. The commands which can be matched are:INVITE,JOIN,NICK,NOTICE,PART,PRIVMSG,QUIT,SETNAME. β¨-Nutil |notify = utilβ sends notifications using a utility. Subsequentnotifyoptions append arguments to util. The window name and message are provided to util as two additional arguments, appropriate fornotify-send(1). π-Outil |open = utilβ sets the utility used by/open. Subsequentopenoptions append arguments to util. The URL to open is provided to util as an argument. The default is the first available ofopen(1),xdg-open(1). π«Ά-R|restrictβ disables the/copy,/execand/opencommands, thenotifyoption, and viewing this manual with/help. π-Shost |bind = hostβ binds to source address host when connecting to the server. To connect from any address over IPv4 only, use0.0.0.0. To connect from any address over IPv6 only, use::. π-T[format]|timestamp [= format]β shows timestamps by default, in the specifiedstrftime(3)format. The format string may contain raw IRC formatting codes. The default format is"%X". β°-auser:pass |sasl-plain = user:passβ authenticates as user with pass using SASL PLAIN. Leave pass blank to prompt for the password. π-cpath |cert = pathβ loads the TLS client certificate from path. The path is searched for in the same manner as configuration files. If the private key is in a separate file, it is loaded withpriv. Withsasl-external, authenticate using SASL EXTERNAL. Certificates can be generated with-g. π-e|sasl-externalβ authenticates using SASL EXTERNAL, also known as CertFP. The TLS client certificate is loaded withcert. See βConfiguring CertFPβ. πͺͺ-gpath β generates a TLS client certificate usingopenssl(1)and writes it to path. π οΈ-hhost |host = hostβ connects to host. π‘-ipattern |ignore = patternβ adds a case-insensitive message ignore pattern, which may contain β*β, β?β and β[]β wildcards as inglob(7). The format of the pattern is:nick[!user@host [command [channel [message]]]]. The commands which can be matched are:INVITE,JOIN,NICK,NOTICE,PART,PRIVMSG,QUIT,SETNAME. π-jchannels [keys] |join = channels [keys]β joins the comma-separated list of channels with the optional comma-separated list of channel keys. πͺ-kpath |priv = privβ loads the TLS client private key from path. The path is searched for in the same manner as configuration files. π-l|logβ logs chat events to files in paths$XDG_DATA_HOME/catgirl/log/network/channel/YYYY-MM-DD.log. π-mmode |mode = modeβ sets the user mode. ποΈ-nnick [...] |nick = nick [...]β sets nickname to nick. The default nickname is the value of the environment variableUSER. Additional space-separated nicks will be tried in order if the first is not available, and all nicks are treated as highlight words. π-oβ prints the server certificate chain to standard output in PEM format and exits. π¨οΈ-pport |port = portβ connects to port. The default port is6697. π-q|quietβ raises the default message visibility threshold for new windows, hiding general events (joins, quits, etc.). π€«-rreal |real = realβ sets realname to real. The default realname is the same as the nickname. πͺ-sname |save = nameβ saves and loads the contents of windows from name in$XDG_DATA_DIRS/catgirl, or an absolute or relative path if name starts with β/β, β./β, or β../β. πΎ-tpath |trust = pathβ trusts the self-signed certificate loaded from path and disables server name verification. The path is searched for in the same manner as configuration files. See βConnecting to Servers with Self-signed Certificatesβ. π€-uuser |user = userβ sets username to user. The default username is the same as the nickname. π§βπ»-v|debugβ logs raw IRC messages to the<debug>window as well as standard error if it is not a terminal. π-wpass |pass = passβ logs in with the server password pass. Leave pass blank to prompt for the password. π
π Configuring CertFP π
- Generate a new TLS client certificate:
$ catgirl -g ~/.config/catgirl/example.pem
- Connect to the server using the certificate:
cert = example.pem
# or: $ catgirl -c example.pem
- Identify with services or use
sasl-plain, then add the certificate fingerprint to your account:
/ns CERT ADD
- Enable SASL EXTERNAL to require successful authentication when connecting (not possible on all networks):
cert = example.pem
sasl-external
# or: $ catgirl -e -c example.pem
π Connecting to Servers with Self-signed Certificates π
- Connect to the server and write its certificate to a file:
$ catgirl -o -h irc.example.org > ~/.config/catgirl/example.pem
- Configure catgirl to trust the certificate:
trust = example.pem
# or: $ catgirl -t example.pem
πΈ INTERFACE πΈ
The catgirl interface is split into three areas. π«§
β¨ Status Line β¨
The top line of the terminal shows window statuses. Only the currently active window and windows with activity are listed. The status line for a window might look like this:
1+ #ascii.town +3 ~7 @
The number on the left is the window number. Following it may be one of β-β, β+β, β++β, as well as β=β. These indicate the message visibility threshold and mute status of the window.
On the right side, the number following β+β indicates the number of unread messages. The number following β~β indicates how many lines are below the scroll position. An β@β indicates that there is unsent input in the window's βInput Lineβ.
catgirl will also set the terminal title, if possible, to the name of the network and active window, followed by the unread count for that window, and the unread count for all other windows in parentheses. π
π¬ Chat Area π¬
The chat area shows messages and events. Regular messages are shown with the nick between β<>β angle brackets. Actions are shown with the nick preceded by β*β. Notices are shown with the nick between β-β hyphens.
Blank lines are inserted into the chat as unread markers.
While scrolling, the most recent 5 lines of chat are kept visible below a marker line. π
π€ Input Line π€
The bottom line of the terminal is where messages and commands are entered. When entering a message, action or notice, your nick appears on the left, as it would in the βChat Areaβ. When entering a command, no nick is shown.
Formatting codes are shown in the input line as reverse-video uppercase letters. These will not appear in the sent message.
Input that is too long to send as a single message will have a red background starting at the point where it will be split into a second message. βοΈ
πΈ COMMANDS πΈ
Okay bestie, this is the good part. Every command can be shortened to any unique prefix β so /join can just be /j. Type less, slay more π
π¬ Chat Commands
/away[message]β Sets your away status, or clears it if you don't give a message. Poof, gone, bye β¨/cscommandβ Sends a command straight to ChanServ./invitenickβ Invites a user to the channel. Bringing your bestie in, iconic behavior π«Ά/join[channel [key]]β Joins the channel you named, the current channel, or the one you got invited to. The key is if it's locked, iykyk π/list[channel]β Lists channels./me[action]β Sends an action message. You know, the* username does a thingvibe./msgnick messageβ Sends a private message. DMs, but make it IRC./namesβ Lists the users in the channel./nicknickβ Changes nicknames. New name, new era, main character energy π/noticemessageβ Sends a notice./nscommandβ Sends a command to NickServ./opsβ Lists the channel operators./part[message]β Leaves the channel. Not me leaving but leaving dramatically π/querynickβ Starts a private conversation./quit[message]β Quits IRC. The final exit, the closing credits π/quotecommandβ Sends a raw IRC command. Fr fr, useM--to show unknown replies./saymessageβ Sends a regular message./setnamenameβ Updates realname, if the server supports it./topic[topic]β Shows or sets the channel topic. Pro tip bestie: press Tab twice to copy the current topic π/whois[nick]β Queries info about a user, or about yourself. Self-obsessed? We call that research β¨/whowasnickβ Queries past info about a user. The lore π¦
π₯οΈ UI Commands
/close[name | num]β Closes the named, numbered, or current window./copy[nick | substring]β Copies the most recent URL from that nick, or from a matching substring./debugβ Toggles logging in the<debug>window./execcommandβ Runs command withSHELLand treats its output as input to the current window β including as commands. Very much giving "automation queen" π₯/helpβ Views this manual. Typeqto come back to catgirl./helptopicβ Lists the server help for a topic. Try/help indexfor a list of topics./highlight[pattern]β Lists message highlight patterns, or temporarily adds one. Wanna make it permanent? Use thehighlightoption./ignore[pattern]β Lists message ignore patterns, or temporarily adds one. Same deal β for permanent, use theignoreoption./move[name] numβ Moves the named or current window to that number./o...β Alias of/open./open[count]β Opens each of the count most recent URLs./opennick | substringβ Opens the most recent URL from that nick or matching substring./unhighlightpatternβ Temporarily removes a message highlight pattern./unignorepatternβ Temporarily removes a message ignore pattern./windowβ Lists all windows./windowname | substringβ Switches to a window by name or matching substring./windownum|/numβ Switches to a window by number.
π Operator Commands
/ban[mask ...]β Lists or bans masks from the channel./deop[nick ...]β Revokes channel operator status from users, or from yourself./devoice[nick ...]β Revokes voice from users in the channel, or from yourself./except[mask ...]β Lists or adds masks to the channel ban exception list./invex[mask ...]β Lists or adds masks to the channel invite list./kicknick [message]β Kicks a user from the channel. The audacity, the drama π/mode[modes] [param ...]β Shows or sets channel modes. In the<network>window, it shows or sets user modes instead./op[nick ...]β Grants channel operator status to users, or to yourself. Power up β¨/unbanmask ...β Unbans masks from the channel./unexceptmask ...β Removes masks from the channel ban exception list./uninvexmask ...β Removes masks from the channel invite list./voice[nick ...]β Grants voice to users in the channel, or to yourself.
β¨οΈ KEY BINDINGS β¨οΈ
The catgirl interface gives you emacs(1)-like line editing, plus keys for IRC formatting. The prefixes C- and M- mean the control and meta (alt) modifiers, respectively. Muscle memory, but make it cute π§
Line Editing
C-aβ Move to the beginning of the line.C-bβ Move left.C-dβ Delete the next character.C-eβ Move to the end of the line.C-fβ Move right.C-kβ Delete to the end of the line.C-tβ Transpose characters.C-uβ Delete to the beginning of the line.C-wβ Delete the previous word.C-xβ Expand a text macro that begins with\.C-yβ Paste the text you previously deleted.M-Enterβ Insert a newline without sending a command.M-bβ Move to the previous word.M-dβ Delete the next word.M-fβ Move to the next word.M-qβ Collapse all whitespace.Tabβ Complete a nick, channel, command, or macro.
Arrow keys and navigation keys also work as expected. Obviously π
Window Keys
C-lβ Redraw the UI.C-nβ Switch to the next window.C-pβ Switch to the previous window.C-rβ Scroll to the previous line matching your input.C-sβ Scroll to the next line matching your input.C-vβ Scroll down a page.M-+β Raise the message visibility threshold, hiding ignored messages, general events (joins, quits, etc.), or non-highlighted messages.M--β Lower the message visibility threshold, showing ignored messages and unknown replies.M-=β Toggle mute. Muted windows don't show up in the status line unless you're mentioned. π€«M-/β Switch to the previously selected window.M-<β Scroll to the top.M->β Scroll to the bottom.M-nβ Switch to window by number0β9.M-aβ Cycle through unread windows.M-lβ List the contents of the window without word-wrapping and with timestamps. Press Enter to return to catgirl.M-mβ Insert a blank line in the window.M-nβ Scroll to the next highlight.M-pβ Scroll to the previous highlight.M-sβ Reveal spoiler text.M-tβ Toggle timestamps.M-uβ Scroll to the first unread line.M-vβ Scroll up a page.
Not me noticing M-n shows up twice in this list. Bestie, I promise I'm not duplicating it β it's really in there twice. I don't make the rules π
IRC Formatting
C-z C-vβ Insert the next input character literally.C-z bβ Toggle bold.C-z cβ Set or reset color.C-z iβ Toggle italics.C-z oβ Reset formatting.C-z pβ Manually toggle paste mode.C-z rβ Toggle reverse color.C-z sβ Set spoiler text (black on black).C-z uβ Toggle underline.
Some color codes can be inserted with these:
C-z Aβ grayC-z Bβ blueC-z Cβ cyanC-z Gβ greenC-z Kβ blackC-z Mβ magentaC-z Nβ brown (dark red)C-z Oβ orange (dark yellow)C-z Pβ pink (light magenta)C-z Rβ redC-z Wβ whiteC-z Yβ yellow
Wanna set other colors? Follow C-z c with one or two digits for the foreground color, and optionally follow that with a comma and one or two digits for the background color. To reset the color, follow C-z c with a non-digit. β¨
The color numbers are as follows:
0β white1β black2β blue3β green4β red5β brown (dark red)6β magenta7β orange (dark yellow)8β yellow9β light green10β cyan11β light cyan12β light blue13β pink (light magenta)14β gray15β light gray99β default
π ENVIRONMENT π
SHELLβ The shell used by/exec. The default is/bin/sh.USERβ The default nickname.
π FILES π
$XDG_CONFIG_DIRS/catgirlβ Configuration files are searched for first in$XDG_CONFIG_HOME, usually~/.config, followed by the colon-separated list of paths in$XDG_CONFIG_DIRS, usually/etc/xdg.~/.config/catgirlβ The most likely location of configuration files. Honestly, probably where yours live π$XDG_DATA_DIRS/catgirlβ Save files are searched for first in$XDG_DATA_HOME, usually~/.local/share, followed by the colon-separated list of paths in$XDG_DATA_DIRS, usually/usr/local/share:/usr/share.~/.local/share/catgirlβ The most likely location of save files.
πͺ EXIT STATUS πͺ
The catgirl client exits 0 if the user requested it, EX_UNAVAILABLE (69) if the connection is lost, and >0 if any other error occurs.
The connection getting dropped and taking exit code 69 with it? It's giving comedy, and honestly I'm obsessed π
β¨ EXAMPLES β¨
Join #ascii.town straight from the command line:
$ catgirl -h irc.tilde.chat -j '#ascii.town'
Create a configuration file in ~/.config/catgirl/tilde:
host = irc.tilde.chat
join = #ascii.town
Load that configuration file:
$ catgirl tilde
β¨ STANDARDS β¨
okay bestie, gather round, these are the receipts πβ¨ the whole bibliography of specs catgirl is vibing with. every single one, no skipping, no cap:
- Adam and Attila Molnar, invite-notify Extension, IRCv3 Working Group,
https://ircv3.net/specs/extensions/invite-notify. - Jack Allnutt, Val Lorentz, and Daniel Oaks, Modern IRC Client Protocol, ircdocs,
https://modern.ircdocs.horse/index.html. - Kiyoshi Aman, Kyle Fuller, StΓ©phan Kochen, Alexey Sokolov, and James Wheare, Message Tags, IRCv3 Working Group,
https://ircv3.net/specs/extensions/message-tags. - Kiyoshi Aman, extended-join Extension, IRCv3 Working Group,
https://ircv3.net/specs/extensions/extended-join. - Waldo Bastian, Ryan Lortie, and Lennart Poettering, XDG Base Directory Specification,
https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html, November 24, 2010. - Christine Dodrill, Ryan, and James Wheare, chghost Extension, IRCv3 Working Group,
https://ircv3.net/specs/extensions/chghost. - Kyle Fuller, StΓ©phan Kochen, Alexey Sokolov, and James Wheare, server-time Extension, IRCv3 Working Group,
https://ircv3.net/specs/extensions/server-time. - Lee Hardy, Perry Lorier, Kevin L. Mitchell, Attila Molnar, Daniel Oakley, William Pitcock, and James Wheare, Client Capability Negotiation, IRCv3 Working Group,
https://ircv3.net/specs/core/capability-negotiation. - S. Josefsson, The Base16, Base32, and Base64 Data Encodings, IETF, RFC 4648,
https://tools.ietf.org/html/rfc4648, October 2006. - C. Kalt, Internet Relay Chat: Client Protocol, IETF, RFC 2812,
https://tools.ietf.org/html/rfc2812, April 2000. - Janne Mareike Koschinski, setname Extension, IRCv3 Working Group,
https://ircv3.net/specs/extensions/setname. - Mantas MikulΔnas, userhost-in-names Extension, IRCv3 Working Group,
https://ircv3.net/specs/extensions/userhost-in-names. - Daniel Oaks, IRC Formatting, ircdocs,
https://modern.ircdocs.horse/formatting.html. - Daniel Oaks, Standard Replies Extension, IRCv3 Working Group,
https://ircv3.net/specs/extensions/standard-replies. - J. Oikarinen and D. Reed, Internet Relay Chat Protocol, IETF, RFC 1459,
https://tools.ietf.org/html/rfc1459, May 1993. - William Pitcock and Jilles Tjoelker, IRCv3.1 SASL Authentication, IRCv3 Working Group,
https://ircv3.net/specs/extensions/sasl-3.1. - William Pitcock, multi-prefix Extension, IRCv3 Working Group,
https://ircv3.net/specs/extensions/multi-prefix. - James Wheare, Message IDs, IRCv3 Working Group,
https://ircv3.net/specs/extensions/message-ids. - James Wheare, reply Client Tag, IRCv3 Working Group,
https://ircv3.net/specs/client-tags/reply. - K. Zeilenga, Ed., The PLAIN Simple Authentication and Security Layer (SASL) Mechanism, IETF, RFC 4616,
https://tools.ietf.org/html/rfc4616, August 2006.
π¦ Extensions π¦
bestie, catgirl implements the causal.agency/consumer vendor-specific IRCv3 capability that pounce(1) offers β¨. and the consumer position? it's stored in the save file, periodt πΎ.
π AUTHORS π
the icon, the legend, the main character: June McEnroe <june@causal.agency> π.
π BUGS π
found a gremlin? Send mail to β¨list+catgirl@causal.agencyβ© or join #ascii.town on irc.tilde.chat π«Ά.
this page is Debian, dated October 11, 2023, and it's CATGIRL(1) β mwah, bye bestie π π
π¦ where this page comes from
- alpine 3.24: catgirl-doc 2.2a-r1 Β· GPL-3.0-or-later
- debian trixie: catgirl 2.2a-1 Β· GPL-3.0-or-later WITH OpenSSL exception
- nixos 26.05: catgirl 2.2a
- nixpkgs unstable: catgirl 2.2a
- ubuntu questing: catgirl 2.2a-1
- ubuntu resolute: catgirl 2.2a-1build1 Β· GPL-3.0-or-later WITH OpenSSL exception
- ubuntu stonking: catgirl 2.2a-1build1 Β· GPL-3.0-or-later WITH OpenSSL exception
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms