version 0.3.0 · GPL-3.0-or-later

obby-client

Write the interface. This handles IRC.

An IRCv3 engine with the client model built in, for Rust, C, TypeScript, Python and Dart. It does no I/O: you feed it bytes and the time, it tells you what happened and what to send. Works against any IRC server.

crates.io npm PyPI pub.dev CI

Why

One core, five languages The protocol is written once, in Rust, so a fix reaches your desktop, web and mobile clients at the same time.
The state, not just a parser Channels, members, conversations and scrollback are kept for you, with the parts everyone gets wrong: casemapping, deduplicated replays, merged history.
It runs where you run No sockets, no timers, no threads, no async runtime. A browser tab, a terminal, a Flutter app: same engine, your transport. TypeScript and Dart also ship a driver that owns the loop for you.
It speaks what the server speaks Every capability it negotiates has a handler: SASL, batches, history, reactions, redaction, metadata, WHOIS, multiline, renames, and on an Obby server the bots, invitations, voice signalling and end-to-end encryption.

Reference

The whole interface

// bytes and time go in
client.handleConnected();
client.handleBytes(chunk);
client.tick(monotonicMs, unixMs);

// bytes, events and the next wake-up come out
client.pollTransmit();
client.pollEvents();
client.pollTimeout();
// every command is a method
client.join("#obby");
client.sendMessage("#obby", "hello");
client.setTyping("#obby", "active");
client.fetchHistory("#obby", null, 50);

// and the model is always readable
client.model().channels;

In a page, with no build step

<script type="module">
  import init, { ObbyClient } from
    "https://cdn.jsdelivr.net/npm/obby-client/obby_wasm.js";
  await init();
</script>

Examples

For agents