---
name: "catgirl"
section: "1"
platform: "linux"
package: "catgirl"
version: "2.2a-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/catgirl"
---

# catgirl(1)

IRC client

## NAME

**catgirl** – IRC client

## SYNOPSIS

**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

The **catgirl** IRC client provides a curses interface for TLS-only Internet Relay Chat. The only required option is **-h**, the host name to connect to. See EXAMPLES for managing further configuration. Type **/help** 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 *$XDG\_CONFIG\_DIRS/catgirl*( usually *~/.config/catgirl*) unless the path starts with ‘/’, ‘./’ or ‘../’. Files and flags listed later on the command line take precedence over those listed earlier.

Each option is placed on a line, and lines beginning with ‘#’ are ignored. The options are listed below following their corresponding flags.

- **-C** *util* \| **copy** = *util*

  Set the utility used by **/copy**. Subsequent **copy** options append arguments to *util*. The URL to copy is provided to *util* on standard input. The default is the first available of pbcopy(1), [wl-copy(1)](/wl-copy/1.md), [xclip(1)](/xclip/1.md), [xsel(1)](/xsel/1.md).

- **-H** *seed,bound* \| **hash** = *seed,bound*

  Set the initial seed of the nick and channel color hash function and the maximum IRC color value produced by the function. The default is 0,75. To use only colors from the 16-color terminal set, use 0,15. To disable nick and channel colors, use 0,0.

- **-I** *pattern* \| **highlight** = *pattern*

  Add a case-insensitive message highlight pattern, which may contain ‘\*’, ‘?’ and ‘\[\]’ wildcards as in [glob(7)](/glob/7.md). The format of the pattern is as follows:

  *nick*\[*!user@host* \[*command* \[*channel* \[*message*\]\]\]\]

  The commands which can be matched are: **INVITE**, **JOIN**, **NICK**, **NOTICE**, **PART**, **PRIVMSG**, **QUIT**, **SETNAME**.

- **-N** *util* \| **notify** = *util*

  Send notifications using a utility. Subsequent **notify** options append arguments to *util*. The window name and message are provided to *util* as two additional arguments, appropriate for [notify-send(1)](/notify-send/1.md).

- **-O** *util* \| **open** = *util*

  Set the utility used by **/open**. Subsequent **open** options append arguments to *util*. The URL to open is provided to *util* as an argument. The default is the first available of [open(1)](/open/1.md), [xdg-open(1)](/xdg-open/1.md).

- **-R** \| **restrict**

  Disable the **/copy**, **/exec** and **/open** commands, the **notify** option, and viewing this manual with **/help**.

- **-S** *host* \| **bind** = *host*

  Bind to source address *host* when connecting to the server. To connect from any address over IPv4 only, use 0.0.0.0. To connect from any address over IPv6 only, use ::.

- **-T**\[*format*\] \| **timestamp** \[= *format*\]

  Show timestamps by default, in the specified [strftime(3)](/strftime/3.md) *format*. The format string may contain raw IRC formatting codes. The default format is "%X".

- **-a** *user*:*pass* \| **sasl-plain** = *user*:*pass*

  Authenticate as *user* with *pass* using SASL PLAIN. Leave *pass* blank to prompt for the password.

- **-c** *path* \| **cert** = *path*

  Load 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 with **priv**. With **sasl-external**, authenticate using SASL EXTERNAL. Certificates can be generated with **-g**.

- **-e** \| **sasl-external**

  Authenticate using SASL EXTERNAL, also known as CertFP. The TLS client certificate is loaded with **cert**. See Configuring CertFP.

- **-g** *path*

  Generate a TLS client certificate using [openssl(1)](/openssl/1.md) and write it to *path*.

- **-h** *host* \| **host** = *host*

  Connect to *host*.

- **-i** *pattern* \| **ignore** = *pattern*

  Add a case-insensitive message ignore pattern, which may contain ‘\*’, ‘?’ and ‘\[\]’ wildcards as in [glob(7)](/glob/7.md). The format of the pattern is as follows:

  *nick*\[*!user@host* \[*command* \[*channel* \[*message*\]\]\]\]

  The commands which can be matched are: **INVITE**, **JOIN**, **NICK**, **NOTICE**, **PART**, **PRIVMSG**, **QUIT**, **SETNAME**.

- **-j** *channels* \[*keys*\] \| **join** = *channels* \[*keys*\]

  Join the comma-separated list of *channels* with the optional comma-separated list of channel *keys*.

- **-k** *path* \| **priv** = *priv*

  Load the TLS client private key from *path*. The *path* is searched for in the same manner as configuration files.

- **-l** \| **log**

  Log chat events to files in paths *$XDG\_DATA\_HOME/catgirl/log/network/channel/YYYY-MM-DD.log*.

- **-m** *mode* \| **mode** = *mode*

  Set the user *mode*.

- **-n** *nick* \[*...*\] \| **nick** = *nick* \[*...*\]

  Set nickname to *nick*. The default nickname is the value of the environment variable USER. Additional space-separated nicks will be tried in order if the first is not available, and all nicks are treated as highlight words.

- **-o**

  Print the server certificate chain to standard output in PEM format and exit.

- **-p** *port* \| **port** = *port*

  Connect to *port*. The default port is 6697.

- **-q** \| **quiet**

  Raise the default message visibility threshold for new windows, hiding general events (joins, quits, etc.).

- **-r** *real* \| **real** = *real*

  Set realname to *real*. The default realname is the same as the nickname.

- **-s** *name* \| **save** = *name*

  Save and load the contents of windows from *name* in *$XDG\_DATA\_DIRS/catgirl*, or an absolute or relative path if *name* starts with ‘/’, ‘./’, or ‘../’.

- **-t** *path* \| **trust** = *path*

  Trust the self-signed certificate loaded from *path* and disable server name verification. The *path* is searched for in the same manner as configuration files. See Connecting to Servers with Self-signed Certificates.

- **-u** *user* \| **user** = *user*

  Set username to *user*. The default username is the same as the nickname.

- **-v** \| **debug**

  Log raw IRC messages to the **\<debug\>** window as well as standard error if it is not a terminal.

- **-w** *pass* \| **pass** = *pass*

  Log in with the server password *pass*. Leave *pass* blank to prompt for the password.

### Configuring CertFP

1. Generate a new TLS client certificate:

   ```
   $ catgirl -g ~/.config/catgirl/example.pem
   ```

2. Connect to the server using the certificate:

   ```
   cert = example.pem
   # or: $ catgirl -c example.pem
   ```

3. Identify with services or use **sasl-plain**, then add the certificate fingerprint to your account:

   ```
   /ns CERT ADD
   ```

4. 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

1. Connect to the server and write its certificate to a file:

   ```
   $ catgirl -o -h irc.example.org > ~/.config/catgirl/example.pem
   ```

2. 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

Any unique prefix can be used to abbreviate a command. For example, **/join** can be typed **/j**.

### Chat Commands

- **/away** \[*message*\]

  Set or clear your away status.

- **/cs** *command*

  Send a command to ChanServ.

- **/invite** *nick*

  Invite a user to the channel.

- **/join** \[*channel* \[*key*\]\]

  Join the named channel, the current channel, or the channel you've been invited to.

- **/list** \[*channel*\]

  List channels.

- **/me** \[*action*\]

  Send an action message.

- **/msg** *nick* *message*

  Send a private message.

- **/names**

  List users in the channel.

- **/nick** *nick*

  Change nicknames.

- **/notice** *message*

  Send a notice.

- **/ns** *command*

  Send a command to NickServ.

- **/ops**

  List channel operators.

- **/part** \[*message*\]

  Leave the channel.

- **/query** *nick*

  Start a private conversation.

- **/quit** \[*message*\]

  Quit IRC.

- **/quote** *command*

  Send a raw IRC command. Use **M--** to show unknown replies.

- **/say** *message*

  Send a regular message.

- **/setname** *name*

  Update realname if supported by the server.

- **/topic** \[*topic*\]

  Show or set the topic of the channel. Press **Tab** twice to copy the current topic.

- **/whois** \[*nick*\]

  Query information about a user or yourself.

- **/whowas** *nick*

  Query past information about a user.

### UI Commands

- **/close** \[*name* \| *num*\]

  Close the named, numbered or current window.

- **/copy** \[*nick* \| *substring*\]

  Copy the most recent URL from *nick* or matching *substring*.

- **/debug**

  Toggle logging in the **\<debug\>** window.

- **/exec** *command*

  Run *command* with SHELL and interpret its output as input to the current window, including as commands.

- **/help**

  View this manual. Type **q** to return to **catgirl**.

- **/help** *topic*

  List the server help for a topic. Try **/help** **index** for a list of topics.

- **/highlight** \[*pattern*\]

  List message highlight patterns or temporarily add a pattern. To permanently add a pattern, use the **highlight** option.

- **/ignore** \[*pattern*\]

  List message ignore patterns or temporarily add a pattern. To permanently add a pattern, use the **ignore** option.

- **/move** \[*name*\] *num*

  Move the named or current window to number.

- **/o** **...**

  Alias of **/open**.

- **/open** \[*count*\]

  Open each of *count* most recent URLs.

- **/open** *nick* \| *substring*

  Open the most recent URL from *nick* or matching *substring*.

- **/unhighlight** *pattern*

  Temporarily remove a message highlight pattern.

- **/unignore** *pattern*

  Temporarily remove a message ignore pattern.

- **/window**

  List all windows.

- **/window** *name* \| *substring*

  Switch to window by name or matching substring.

- **/window** *num* \| **/***num*

  Switch to window by number.

### Operator Commands

- **/ban** \[*mask* *...*\]

  List or ban masks from the channel.

- **/deop** \[*nick* *...*\]

  Revoke channel operator status from users or yourself.

- **/devoice** \[*nick* *...*\]

  Revoke voice from users or yourself in the channel.

- **/except** \[*mask* *...*\]

  List or add masks to the channel ban exception list.

- **/invex** \[*mask* *...*\]

  List or add masks to the channel invite list.

- **/kick** *nick* \[*message*\]

  Kick a user from the channel.

- **/mode** \[*modes*\] \[*param* *...*\]

  Show or set channel modes. In the **\<network\>** window, show or set user modes.

- **/op** \[*nick* *...*\]

  Grant users or yourself channel operator status.

- **/unban** *mask* *...*

  Unban masks from the channel.

- **/unexcept** *mask* *...*

  Remove masks from the channel ban exception list.

- **/uninvex** *mask* *...*

  Remove masks from the channel invite list.

- **/voice** \[*nick* *...*\]

  Grant users or yourself voice in the channel.

## KEY BINDINGS

The **catgirl** interface provides [emacs(1)](/emacs/1.md)-like line editing as well as keys for IRC formatting. The prefixes **C-** and **M-** represent the control and meta (alt) modifiers, respectively.

### Line Editing

- **C-a**

  Move to beginning of line.

- **C-b**

  Move left.

- **C-d**

  Delete next character.

- **C-e**

  Move to end of line.

- **C-f**

  Move right.

- **C-k**

  Delete to end of line.

- **C-t**

  Transpose characters.

- **C-u**

  Delete to beginning of line.

- **C-w**

  Delete previous word.

- **C-x**

  Expand a text macro beginning with ‘\\’.

- **C-y**

  Paste previously deleted text.

- **M-Enter**

  Insert a newline without sending a command.

- **M-b**

  Move to previous word.

- **M-d**

  Delete next word.

- **M-f**

  Move to next word.

- **M-q**

  Collapse all whitespace.

- **Tab**

  Complete nick, channel, command or macro.

Arrow and navigation keys also work as expected.

### Window Keys

- **C-l**

  Redraw the UI.

- **C-n**

  Switch to next window.

- **C-p**

  Switch to previous window.

- **C-r**

  Scroll to previous line matching input.

- **C-s**

  Scroll to next line matching input.

- **C-v**

  Scroll down a page.

- **M-+**

  Raise message visibility threshold, hiding ignored messages, general events (joins, quits, etc.), or non-highlighted messages.

- **M--**

  Lower message visibility threshold, showing ignored messages and unknown replies.

- **M-=**

  Toggle mute. Muted windows do not appear in the status line unless you are mentioned.

- **M-/**

  Switch to previously selected window.

- **M-\<**

  Scroll to top.

- **M-\>**

  Scroll to bottom.

- **M-***n*

  Switch to window by number 0–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 next highlight.

- **M-p**

  Scroll to previous highlight.

- **M-s**

  Reveal spoiler text.

- **M-t**

  Toggle timestamps.

- **M-u**

  Scroll to first unread line.

- **M-v**

  Scroll up a page.

### 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 the following:

| | | | |
| --- | --- | --- | --- |
| **C-z** **A** | gray | **C-z** **N** | brown (dark red) |
| **C-z** **B** | blue | **C-z** **O** | orange (dark yellow) |
| **C-z** **C** | cyan | **C-z** **P** | pink (light magenta) |
| **C-z** **G** | green | **C-z** **R** | red |
| **C-z** **K** | black | **C-z** **W** | white |
| **C-z** **M** | magenta | **C-z** **Y** | yellow |

To set other colors, follow **C-z** **c** by one or two digits for the foreground color, optionally followed by a comma and one or two digits for the background color. To reset color, follow **C-z** **c** by a non-digit.

The color numbers are as follows:

| | | | |
| --- | --- | --- | --- |
| 0 | white | 8 | yellow |
| 1 | black | 9 | light green |
| 2 | blue | 10 | cyan |
| 3 | green | 11 | light cyan |
| 4 | red | 12 | light blue |
| 5 | brown (dark red) | 13 | pink (light magenta) |
| 6 | magenta | 14 | gray |
| 7 | orange (dark yellow) | 15 | light gray |
| 99 | 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 $XDG\_CONFIG\_DIRS, usually */etc/xdg*.

- *~/.config/catgirl*

  The most likely location of configuration files.

- *$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 $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 requested by the user, EX\_UNAVAILABLE (69) if the connection is lost, and \>0 if any other error occurs.

## EXAMPLES

Join #ascii.town 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 the configuration file:

```
$ catgirl tilde
```

## STANDARDS

-

  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*, November 24, 2010, https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html.

-

  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*, RFC 4648, IETF, October 2006, https://tools.ietf.org/html/rfc4648.

-

  C. Kalt, *Internet Relay Chat: Client Protocol*, RFC 2812, IETF, April 2000, https://tools.ietf.org/html/rfc2812.

-

  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*, RFC 1459, IETF, May 1993, https://tools.ietf.org/html/rfc1459.

-

  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*, RFC 4616, IETF, August 2006, https://tools.ietf.org/html/rfc4616.

### Extensions

The **catgirl** client implements the **causal.agency/consumer** vendor-specific IRCv3 capability offered by pounce(1). The consumer position is stored in the **save** file.

## AUTHORS

June McEnroe ⟨*june@causal.agency*⟩

## BUGS

Send mail to ⟨*list+catgirl@causal.agency*⟩ or join #ascii.town on irc.tilde.chat.
