Circe—Yet Another Client for IRC in Emacs

Circe is yet another client for IRC in Emacs. It provides most features one would expect from an IRC client, with sane defaults to start from.

The best feature of Circe is the activity tracker, which many will know from ERC. That tracker displays (abbreviations of) channels with activity in the mode line, highlighting entries when your nick is mentioned while you're not looking. It is easy to check on talk while working, as C-c C-SPC will cycle through all channels with activity, returning you to your work when no more Circe buffers with activity are left—everything well integrated into your normal work environment.

Lui, the linewise user interface

About half of Circe is a separate library, called Lui, which handles all of the user interface for Circe. It is designed to be usable for other software projects. Please refer to the source file for more information.


[screenshot] Screenshot

Circe has the following features:

The following features are planned to be included at one point in the future:

Lui features:

Lui is still lacking the following features:


Circe was originally written because the author felt ERC, another very nice IRC client for Emacs, had become more and more difficult to debug and improve. The alternative, rcirc, lacked many features the author wanted. So the solution was to write a new client.

Circe owes a lot to the great ideas that got incorporated into ERC, and to the long amount of experience gotten from that project.


Download the files from CVS. You will end up with a directory with a number of .el files in them. Let's say this directory is ~/.elisp/circe/. The following code snippet in your .emacs will enable the M-x circe command to connect to IRC:

(add-to-list 'load-path "~/.elisp/circe/")
(autoload 'circe "circe" "Connect to an IRC server" t)

Here's a sample configuration from the author:

(autoload 'circe "circe" "Connect to an IRC server" t)

(when (file-directory-p "~/.elisp/circe")
  (add-to-list 'load-path "~/.elisp/circe"))

;; This defines the password variables below
(when (file-exists-p "~/.private.el")
  (load-file "~/.private.el"))

(setq circe-default-realname ""
      circe-ignore-list nil
      circe-server-coding-system '(latin-1 . undecided)
        '(("^freenode$" "#emacs" "#scheme" "#scsh"
                        "#darcs" "#wiki" "#css" "#latex"
                        "#ideologies" "##linguistics")
          ("^IRCnet" "#StarWars" ""))
        `(("freenode" ,freenode-passwd)))

(setq lui-max-buffer-size 30000
      lui-flyspell-p t
      lui-flyspell-alist '(("" "german8")
                           ("." "american")))

(eval-after-load "circe"
     (require 'lui-irc-colors)
     (add-to-list 'lui-pre-output-hook 'lui-irc-colors)
     (add-to-list 'circe-receive-message-functions

(defun fc-bitlbee-auth (nick user host command args)
  "Authenticate to a bitlbee server."
  (when (and (string= command "JOIN")
             (circe-server-my-nick-p nick))
      (when (string= circe-server-network "bitlbee")
         (format "PRIVMSG #bitlbee :identify %s"

(defun irc ()
  "Connect to IRC."
  (circe "" "6667" "freenode")
  (circe "sarg" "23523" "IRCnet" muh-passwd)
  (circe "localhost" "6668" "bitlbee"))


There's a mailing list for circe. You can subscribe via the web interface.

Attributions and Thanks

This page was written in GNU Emacs. The fontified Emacs Lisp code was generated by htmlize. The screenshot was created using The Gimp. No humans were harmed in the creation of this page.

The project, webpage and mailinglist is hosted on Savannah—many thanks to GNU for providing this great service!

Other Clients

There's another IRC client named Circe, written in Python. That client is totally unrelated to this one. The channel #circe on Freenode is related to that client. If you have questions about Circe for Emacs, visit #emacs.