A console IRC client
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
bin Implement serde-based config parser. Generate default config if confi… Jun 13, 2017
ev_loop Remove redundant return types Jun 7, 2017
pkg/archlinux Aur pkgbuild (#98) Apr 11, 2018
rfcs rfcs: Add some IRC and IRCv3 links Mar 25, 2017
src Implement C-x, announce 0.4.3 Sep 1, 2018
term_input Implement C-x, announce 0.4.3 Sep 1, 2018
termbox Use local term_input as dev dep. in termbox Sep 1, 2018
test one more line height test May 6, 2016
.gitignore Remove Cargo.lock files from the repo May 14, 2017
.travis.yml update .travis.yml to fix dbus issue Jan 6, 2018
CHANGELOG.md Implement C-x, announce 0.4.3 Sep 1, 2018
LICENSE Getting ready for the release Jun 11, 2017
README.md Implement C-x, announce 0.4.3 Sep 1, 2018
rustfmt.toml Apply rustfmt Oct 27, 2017
tiny_mac.png Add OSX ss, update README Jun 15, 2017
tinyrc.yml Refactor auto_cmd stuff and nick change handling Jul 15, 2018


tiny - Yet another console IRC client

Travis Build Status MIT licensed crates.io

tiny is an IRC client written in Rust.

tiny in action

tiny in action


  • Clean UI: consecutive join/part/quit messages are shown in a single line, time stamps for a message is omitted if it's the same as the message before. (inspired by irc-core)

  • All mentions to the user are collected in a "mentions" tab, including server and channel information. "mentions" tab solves the problem of missing mentions to you in channels after hours of inactivity.

  • Mentions to the user in a channel is highlighted (the channel tab is also highlighted in the tab list)

  • Simple config file format for automatically connecting to servers, joining channels, registering the nickname etc. See configuration section below.

  • Nick tab-completion in channels

  • Nicks in channels are colored.

  • Disconnect detection and automatic reconnects. You can keep tiny running on your laptop and it automatically reconnects after a sleep etc.

  • Key bindings inspired by terminal emulators and vim. See key bindings section below.

  • Configurable colors

  • SASL authentication

  • Configurable desktop notifications on new messages

  • znc compatible


Install the Rust nightly toolchain, clone the repo, and run cargo install (or cargo install --force if you already have an older version installed).

Arch Linux users can install tiny from the AUR. Note that the supported way to meet the rust-nightly dependency is with the official Rustup package, but you can alternatively install Rustup via the Rust Toolchain Installer. Either way, remember to install the Rust nightly toolchain before running makepkg.

Since version 0.3.0 tiny needs OpenSSL or LibreSSL headers and runtime libraries. See rust-openssl's README for instructions on installing them.

  • OpenSSL or LibreSSL
  • libdbus [Linux only]

tiny is tested on Linux and OSX.


When tiny couldn't find a config file at ~/.tinyrc.yml it creates one with some defaults and exits. Edit that file before re-running tiny to change the defaults. If you want to create the file yourself, the default file looks like this:

# Servers to auto-connect
    - addr: irc.mozilla.org
      port: 6697
      # Optional field, defaults to false:
      tls: true
      # Optional field for server password:
      # pass: 'server_pass'
      hostname: yourhost
      realname: yourname
      nicks: [tiny_user]

      # Optional SASL authentication
      # sasl:
      #   username: 'tiny_user'
      #   password: 'hunter2'

      # Channels to automatically join
          - '#tiny'
          - '#rust'

      # Optional password to identify via NickServ
      # nickserv_ident: 'hunter2'

# Defaults used when connecting to a server via the /connect command
    nicks: [tiny_user]
    hostname: yourhost
    realname: yourname
    join: []

# Where to put log files
log_dir: '/home/$USER/tiny_logs'

# <Color scheme configuration>

A note on nick identification: Some IRC servers such as ircd-seven (used by Freenode) and InspIRCd (used by Mozilla) support identification via the PASS command. This way of identification (rather than sending a message to a service like NickServ) is better when some of the channels that you automatically join require identification. To use this method enter your nick password to the pass field in servers.

Command line arguments

By default (i.e. when no command line arguments passed) tiny connects to all servers listed in the config. tiny considers command line arguments as patterns to be matched in server addresses, so you can pass command line arguments to connect to only a subset of servers specified in the config. For example, in this config:

    - addr: irc.mozilla.org

    - addr: chat.freenode.net

By default tiny connects to both servers. You can connect to only the second server by passing freenode as a command line argument.

You can use --config <path> to specify your config file location.

Key bindings

  • C-a/C-e to move cursor beginning/end in the input field

  • C-k for deleting rest of the line

  • C-w for deleting a word

  • C-left/C-right for moving one word backward/forward

  • page up/page down or shift-up/shift-down or for scrolling

  • C-n/C-p for next/previous tab

  • C-c enter to quit.

  • alt-{1,9} switch to nth tab

  • alt-{char} switch to next tab with underlined char

  • alt-0 switch to last tab

  • alt-left/right move tab to left/right

  • C-x edit current message in $EDITOR


Commands start with / character.

  • /msg <nick> <message>: Send a message to a user. Creates a new tab.

  • /join <channel>: Join to a channel

  • /close: Close the current tab. Leaves the channel if the current tab is a channel. Leaves the server if the tab is a server.

  • /connect <hostname>:<port>: Connect to a server. Uses defaults in the config file for nick, realname, hostname and auto cmds.

  • /connect: Reconnect to the current server. Use if you don't want to wait tiny to reconnect automatically after a connectivity problem.

  • /away <msg>: Set away status

  • /away: Remove away status

  • /nick <nick>: Change nick

  • /names: List all nicks in the current channel. You can use /names <nick> to check if a specific nick is in the channel.

  • /reload: Reload configuration

  • /clear: Clears tab contents

  • /switch <string>: Switch to the first tab which has the given string in the name.

  • /ignore: Ignore join/quit messages in a channel. When enabled channel name will have [i] added to the end to show that it is enabled. Running this command in a server tab applies it to all channels of that server.

  • /notify [off|mentions|messages]: Enable and disable desktop notifications. You can use /notify command without any arguments to see the current mode. Running this command in a server tab applies it to all channels of that server.


tiny is in early stages of development. Some of features that you might think are essential may be missing. Please open an issue for those features (or even better, a pull request!). Remember to add yourself to the list of contributors if you submit a pull request.

Being a Rust n00b, I spent a lot of time trying to convince borrow checker, failing at that, and either adding bunch of ugly hacks (e.g. instead a loop that modifies single element implementing a loop that finds an index and modifying that index after the loop), or using a simpler but less efficient code (e.g. cloning things redundantly to avoid borrow checking). Still, I think the connection manager (conn.rs) and UI parts (tui module) are not too bad. Mess is mostly in lib.rs which implements the main logic (command and message handling etc.).

Any suggestions / code reviews / pull requests are very welcome!

If you're looking to contribute please see open issues. If you don't know where to start, write a comment in the issue you'd like to work on and I'd love to help.


Ömer Sinan Ağacan

Abin Simon

Umur Gedik

Chiu Yue Chun


Nick Econopouly