Telex is an account-centric chat server with an IRC-compatible edge.
It keeps the useful shape of IRC—small servers, ordinary IRC clients, channels, text-first conversation, and operator ownership—while treating an account, a client installation, a network connection, and a read cursor as different things.
Status: pre-alpha. Telex is running in a small real-world deployment, but interfaces and storage formats can still change. Review the configuration and operations guides before exposing it to the internet.
- One Rust daemon, one SQLite database, and no required external services.
- IRC over TCP/TLS and standard IRCv3 WebSocket transports.
- Human accounts with one password across devices and revocable, cursor-only installation credentials.
- Durable channels, authenticated direct messages, history, read markers, reactions, replies, multiline messages, topics, moderation, and retention.
- A transient per-channel Stage for externally encoded text-cell video and optional synchronized AAC audio; Stage packets never become chat history.
- Invite-gated onboarding, narrow account capabilities, and audited operator changes.
- A responsive installable web client that coexists with traditional IRC clients, including opt-in remembered-device login.
- Visibly automated bot and agent accounts with independently revocable app keys and explicit per-channel grants.
- Optional automation command catalogs for client-side leading-
!autocomplete without changing ordinaryPRIVMSGcommand transport. - A structured native gateway and an MCP adapter for integrations that need more than IRC can express.
Telex does not host models, prompts, arbitrary uploads, or automation-provider credentials. It is not a federated or multi-server IRC network and does not claim end-to-end encryption.
Requirements:
- Rust 1.95 or newer
- Node.js 22 or newer for the reference clients and automation examples
Start the loopback-only development listener:
cargo run --lockedThen connect an IRC client to 127.0.0.1:6667 without TLS. The development
defaults allow anonymous use and do not expose a control or WebSocket listener.
Run the main checks:
cargo test --locked --all-targets --all-features
cargo clippy --locked --all-targets --all-features -- -D warnings
cd clients
npm ci
npm test
npm run checkThe optional container lab exercises a production-shaped TLS, onboarding, restart, backup, and recovery lifecycle without publishing ports beyond host loopback.
Copy the public example, replace every
example.net name and path, and decide the admission and retention policies
explicitly:
sudo install -d -m 0750 /etc/telex
sudo install -m 0640 config/examples/public.toml /etc/telex/server.toml
IRC_CONFIG=/etc/telex/server.toml \
target/release/telex-ircd config checkThe checked-in example is documentation, not a safe drop-in production configuration. See configuration, standalone operations, and database recovery before starting a public listener.
cd clients
npm ci
npm run build:web:releaseThe static output is written to clients/web/dist/. The generic
Nginx example shows the expected
same-origin WebSocket and control boundaries. The
web-client guide covers development, deployment,
local state, privacy, and browser testing.
Start with the automation examples index.
The smallest invocation integration is
CommandBot: it receives only a
visible addressed command, has zero preceding context, and replies through the
durable native path. CatalogBot
is the corresponding leading-! example: it publishes !hello, !time, and
!help metadata, reads new human messages, and replies causally.
Automation app keys are native/control credentials, not IRC SASL passwords. The examples connect to the HTTPS control origin (commonly port 8098), obtain a one-use attenuated ticket, and open the structured native session. Traditional IRC libraries on the IRC or IRC-over-WebSocket listeners cannot use an app key.
The examples intentionally separate common shapes:
- explicit command and response;
- discoverable leading-
!commands; - scheduled publication;
- bounded roster lookup;
- recoverable background work;
- model-backed channel participation; and
- external artifact catalogues with HTTPS or DCC transfer.
An automation does not inherit access merely because a channel is public. Its app key, native ticket, channel grant, chatter policy, and current guardrails all apply; the most restrictive decision wins. See automated participants, the native gateway guide, and the MCP adapter for the full boundary.
Stage is a transient text-cell presentation attached to a channel. The daemon relays already-encoded complete frames and optional AAC-LC/fMP4 audio; it does not decode media, retain packets, or turn frames into IRC messages.
The Stage publisher kit can preview or stream a
local file, encode a reusable .tstage archive, play an archive, or schedule a
station playlist. The publishing guide covers
provisioning the narrow stage.publish grant, building the projector, and
using the container image.
The documentation index is organized by task:
- use the server and its reference clients;
- operate a standalone deployment;
- build a client, bot, agent, or content provider; or
- understand and change the implementation.
The architecture describes the shared domain model. The public roadmap records implemented capabilities, known gaps, and deliberate non-goals. Release changes are summarized in CHANGELOG.md.
Read CONTRIBUTING.md before proposing a change. Please report security-sensitive problems privately as described in SECURITY.md rather than opening a public issue.
Telex is licensed under the GNU Affero General Public License, version 3 only. If you operate a modified Telex over a network, the license requires you to offer the corresponding source of that modified version to its users.