Est. 1989 Intermediate

ircII

The oldest IRC client still maintained, ircII pairs a text-mode Unix chat program with its own event-driven scripting language for automating and extending the client.

Created by Michael Sandrof

Paradigm Scripting: event-driven, imperative, command/macro language embedded in an IRC client
Typing Dynamic, untyped (values are text; numeric context coerces strings)
First Appeared 1989
Latest Version 20260115 (January 2026)

ircII (pronounced “irk-two” or “i-r-c-two”) is a free, text-mode IRC client for Unix-like systems, written in C and first released in 1989. It is widely cited as the oldest IRC client still actively maintained. What earns ircII a place in a catalog of programming languages is not the client itself but the ircII scripting language: an event-driven macro and command language, interpreted by the client, that lets users define new commands, react to chat events, and program the behavior of their connection. That language became influential enough to be adopted and extended by an entire generation of descendant clients.

History & Origins

ircII was created by Michael Sandrof in 1989, only about a year after Jarkko Oikarinen wrote the original IRC server software in Finland. Where the protocol defined how clients and servers exchanged lines of text, ircII provided a polished, scriptable front end for actually using IRC from a Unix terminal. It quickly became, in the words of contemporaries, “the premiere client” of IRC’s early years and the reference implementation against which other clients measured themselves.

Sandrof extended the client steadily. In 1990 he added the Client-To-Client Protocol (CTCP) in version 2.1, a convention for embedding structured requests—VERSION, PING, TIME, and the famous ACTION (the /me emote)—inside ordinary private messages. In 1991, Troy Rollo contributed Direct Client-to-Client (DCC) in version 2.1.2, enabling peer-to-peer file transfers and direct chats negotiated through the server but carried over a separate connection. Both protocols originated in ircII and were later widely copied; they remain part of how IRC clients interoperate today.

By the mid-1990s, version 2.8.2 had come to be seen as the definitive ircII release. Its stability and feature set were so admired that, in the autumn of 1994, developers who wanted to push the scripting language further forked it into EPIC (the Enhanced Programmable ircII Client). Other Unix clients—BitchX and ScrollZ among them—likewise trace their lineage back to ircII.

Design Philosophy

ircII reflects a distinctly Unix sensibility: do one thing well, stay small and fast, and make the tool programmable by its user. The client has no menus, no sounds, and no pop-up windows—just a status line and a command input bound to a termcap-driven screen. Everything beyond basic chatting is meant to be added through scripting rather than baked into the binary.

The scripting language is built around a few core ideas:

  • Commands are the primitive. Everything the user types either is a message to a channel or begins with a / command. Scripts compose, redefine, and create commands.
  • Aliases extend the command set. An ALIAS binds a name to a block of ircII code, so user-defined commands look and behave like built-ins.
  • The client is event-driven. The ON construct registers handlers that fire when something happens—an incoming message, a join, a CTCP request, a server numeric—turning the client into a reactive program.
  • Values are text. Variables hold strings; arithmetic and comparison coerce as needed. Arguments arrive through positional expandos ($0, $1, …) and $* for “everything.”

Key Features

Aliases

An alias defines a new command as a block of script. Special $ expandos pull in arguments: $0 is the first word, $* is the whole argument list.

alias hi {
    msg $0 Hello there, $0! Welcome.
}

# Used as:  /hi nick

Event Hooks with ON

ON is the heart of ircII automation. It attaches an action to an event, optionally matching a pattern. Here a script greets anyone who joins a channel:

on join * {
    if (\[$1] != \[#secret]) {
        msg $1 Welcome to $1, $0!
    }
}

The event’s own arguments fill $0, $1, and so on—for a JOIN, that is the nickname and the channel.

Variables, Control Flow, and Functions

ircII provides assignment, conditionals, and loops, along with a large library of built-in functions invoked with $func(...):

# Assignment
@ count = 0

# Conditional and loop
while (count < 3) {
    echo Line number ${count + 1}
    @ count = count + 1
}

# Built-in functions
echo Lowercase: $tolower(HELLO)
echo Third word: $word(2 alpha beta gamma delta)

CTCP and DCC

Because ircII originated CTCP and DCC, its scripting language exposes them directly. Scripts can answer CTCP requests, send /me actions, and initiate or accept DCC file transfers and direct chats—capabilities that made ircII a capable automation platform well before dedicated bot software was common.

Evolution

After the classic 2.x series, ircII moved to date-based version numbers (for example 20030314), a scheme it still uses. A buffer-overflow vulnerability in older builds prompted security fixes in the early-2000s releases. The project later added OpenSSL support for encrypted TLS connections to IRC servers, keeping it usable on modern networks that expect secure links.

Much of ircII’s lasting impact, though, flowed through its forks. EPIC in particular treated the scripting language as a first-class concern, expanding it over decades to satisfy script authors and eventually adding UTF-8 support, modularity, and the option to embed other scripting languages entirely. The ircII dialect thus seeded a whole branch of Unix IRC clients whose scripts were broadly portable across the family.

Current Relevance

ircII is still maintained—an unusual distinction for software with roots in 1989. Recent releases, including 20260115 in January 2026, continue under maintainer Matthew R. Green, distributed under the BSD-3-Clause license. It is packaged by most Linux distributions and the BSDs, and remains a practical choice for users who want a fast, keyboard-driven client that works well over SSH and inside terminal multiplexers like screen and tmux.

In an era dominated by graphical and web-based chat, ircII’s audience is smaller than it once was, but it endures among Unix traditionalists, low-bandwidth users, and anyone who values a chat client they can fully program. Its scripting language—and the larger family of dialects it spawned—stands as one of the earliest widely used examples of an application embedding a small, event-driven language so that ordinary users could automate and reshape the tool.

Why It Matters

ircII demonstrated, very early, the power of giving an application its own embedded scripting language. Long before “scriptable” was a checkbox feature, ircII users were writing aliases and ON hooks to build bots, custom commands, and elaborate interfaces. The CTCP and DCC protocols it pioneered became permanent fixtures of IRC, and its scripting dialect propagated through EPIC, BitchX, ScrollZ, and others. As the oldest IRC client still maintained, ircII is both a living artifact of the early internet and a quiet milestone in the history of end-user programmability.

Timeline

1989
Michael Sandrof releases the first version of ircII as a text-mode IRC client for Unix, written in C, with a built-in command and scripting language
1990
Sandrof implements the Client-To-Client Protocol (CTCP) in version 2.1, allowing clients to exchange structured messages such as VERSION, PING, and ACTION
1991
Troy Rollo implements Direct Client-to-Client (DCC) in version 2.1.2, adding peer-to-peer file transfer and direct chat negotiated over IRC
1994
Version 2.8.2 becomes widely regarded as the definitive ircII release; in the autumn EPIC is forked from this codebase to extend the scripting language
1990s
The ircII scripting language is adopted and expanded by most third-generation Unix clients, including BitchX, ScrollZ, and EPIC, making it a de facto standard for IRC automation
2002
By the early 2000s ircII releases had adopted date-based version numbers (e.g., 20020912); multiple buffer-overflow vulnerabilities reported in builds of this era were subsequently fixed
2026
Release 20260115 ships in January, maintained by Matthew R. Green, keeping ircII the oldest IRC client still in active maintenance

Notable Uses & Legacy

Free and Open Source Software Communities

Through the 1990s and 2000s ircII was the default client for developers logging into FOSS project channels from Unix shells, often inside a screen or tmux session for persistent connections.

IRC Bots and Automation

Operators wrote ircII scripts using ALIAS definitions and ON event hooks to build channel bots, auto-greeters, flood protection, and logging long before dedicated bot frameworks were common.

Derivative Clients

EPIC, BitchX, and ScrollZ began as forks of ircII and inherited its scripting language, so scripts written for ircII influenced and frequently ran on an entire family of Unix clients.

Remote and Low-Bandwidth Access

Because it is fast, lightweight, and termcap-based, ircII remains usable over SSH and on minimal terminals where graphical clients are impractical.

ICB Networks

Beyond IRC, ircII can also connect to ICB (Internet Citizen's Band) servers, giving users of that older chat network a scriptable, full-featured client.

Language Influence

Influenced By

IRC Unix shell C

Influenced

EPIC BitchX ScrollZ

Running Today

Run examples using the official Docker image:

docker pull
Last updated: