Core Features

The fundamentals of the IRC experience in HexDroid.

Multi-Network

  • Multiple simultaneous connections
  • Auto-connect on app startup (per network)
  • Reconnect after a device restart, optionally waiting for Wi-Fi rather than using mobile data
  • Auto-reconnect with exponential backoff
  • Auto-join channels with optional keys
  • Post-connect commands with configurable delay
  • Pin/favourite networks to top of list
  • Drag-and-drop network reordering in sidebar and Networks screen

Secure by Default

  • TLS 1.2 / TLS 1.3 (default on)
  • SASL PLAIN, SCRAM-SHA-256, EXTERNAL
  • TLS client certificates (.pem, .crt+.key, or .p12/.pfx)
  • TOFU certificate pinning learns the server SHA-256 fingerprint on first connect, verifies it on every subsequent connect, refuses mismatches with a clear warning
  • TLS session resumption via shared SSLContext cache
  • SASL credentials in EncryptedSharedPreferences
  • Credentials excluded from Android backup
  • End-to-end message encryption AES-256-GCM (+AGM) and Blowfish/FiSH (+OK). Read the encryption guide

Backup & Restore

  • Export every network and setting, including each channel's own settings, to a single JSON file, portable between devices
  • Server, SASL and proxy passwords can be included, encrypted with a passphrase you choose (Argon2id and AES-256-GCM). Without the passphrase they stay unreadable, and restoring can skip them
  • TLS client certificates are never exported: their keys stay in the device's Keystore
  • See Getting Started → Moving to a new device

Character Encoding

  • Auto-detect per message (UTF-8 fallback)
  • Manual encoding per network
  • windows-1251 Russian/CIS
  • KOI8-R older Cyrillic systems
  • ISO-8859-1/15 Western European
  • Any encoding supported by Java's Charset

Bouncer Support

  • Works with soju, ZNC, kiwibnc, pounce and anything following the user/network convention
  • Per-client buffers on ZNC and per-client history on soju, so each device keeps its own read position
  • Native chathistory playback on both
  • /znc and /bouncerserv (alias /bnc) talk to the bouncer directly
  • soju networks can be imported as profiles, one by one or all at once, and added, edited and deleted from the app
  • Search logs also searches the history soju keeps
  • Mutes are shared with your other soju clients
  • See Getting Started → Bouncers to set one up

Server-Aware Limits

  • Topic, away, quit and kick text is trimmed to the server's TOPICLEN / AWAYLEN / QUITLEN / KICKLEN before sending
  • History requests respect the server's CHATHISTORY size limit and MSGREFTYPES selectors
  • /knock <#channel> [reason] asks for an invite where the server advertises KNOCK
  • The “too many channels” error reads the server's CHANLIMIT figure
  • Bot users are badged [bot] from the BOT mode letter or the bot message tag

IRCv3 Capabilities

HexDroid negotiates capabilities during the connection handshake, and each one can be switched off per network under IRCv3 Capabilities in network settings. Below cover what you actually see in the app.

What you get on a modern server

Server-Side History

  • Recent messages arrive when you join a channel, as before
  • Scrolling to the top fetches the previous page and keeps going as you scroll, so the scrollback is as deep as the server keeps rather than stopping at what arrived on join
  • Conversations that happened while you were offline are picked up on connect, so a private message sent overnight is waiting in the morning instead of appearing only when the sender speaks again
  • Channels you are no longer in are left closed
  • Replayed messages are matched against what you already have by message ID, so nothing is shown twice
  • Needs chathistory; the control simply does not appear on servers without it

Push Notifications

  • Servers supporting the webpush extension can notify you of a highlight or private message while no connection is open
  • Built on UnifiedPush, so you choose the distributor.
  • Push payloads are decrypted on the device; the distributor relays ciphertext it cannot read
  • Off by default, and needs a distributor app installed. Enable under Settings › IRC

Message Reactions

  • React to a recent message with an emoji via /react <emoji> [n]
  • [n] targets the message n lines back (default 1)
  • Remove your reaction with /unreact <emoji> [n]
  • Reaction counts render inline under the message; tap one to add or remove yours
  • See who reacted: long-press a reaction, or pick it from the message menu, for a list of everyone who reacted, with a filter for each reaction. Tap a name for their actions
  • Screen readers read out who reacted with each reaction
  • Requires draft/message-reactions; otherwise sent as a plain notice

Typing Indicators

  • Shows when others are composing a message in a channel or query
  • Sends your own typing state as you type, stopping when you send or clear the input
  • Sent as the +typing client tag over message-tags; respects a server's CLIENTTAGDENY policy
  • Purely transient - never logged or stored

File Uploads (Filehost)

  • Attach button in the chat input when the server offers a soju.im/FILEHOST upload endpoint (soju; others via additional-isupport)
  • Uploads use your existing connection credentials - nothing extra to configure
  • The returned URL lands in the input so you can add text before sending
  • Refuses plaintext http:// filehosts on TLS connections
  • For non proxied (Tor/SOCKS) networks so the upload can never leak outside the proxy
  • Toggleable per network under IRCv3 Capabilities

Message Deletion

  • Long-press one of your own messages › Delete message to remove it for everyone
  • Uses IRCv3 draft/message-redaction (REDACT); the server relays the deletion to all clients
  • Deleted messages become (“message deleted by …”) rather than silently vanishing
  • Applied only when the server confirms, so a rejected delete never leaves your view out of sync
  • Available on servers that advertise the cap

Account Registration

  • A guided Register account dialog (overflow menu) walks through register → email verify → done via IRCv3 draft/account-registration no NickServ syntax to learn
  • Fields adapt to the server: email required, custom account names
  • Optionally save the password so SASL logs you in automatically next time
  • /register and /verify <code> drive the same flow from the command line; the account is remembered from the server's prompt
  • Registration failures come back as plain-language hints, not bare error codes
  • Falls back to a NickServ pointer on servers without the capability

Display Names & Metadata

  • Users who set a display-name have it shown beside their nick, Discord-style; a color tints their nick
  • Tap a nick to see their avatar and status. Avatars also show in the member list and in notifications, and follow the same rules as other remote images: previews on, HTTPS only, never on proxied profiles
  • Values are sanitised on arrival: control characters and colour codes stripped, length capped
  • A metadata editor (overflow menu, or /metadata) sets your own display name, status, colour, avatar and more; /metadata <nick> list reads someone else's
  • Display names, avatars and away status follow a nick change and are cleared when the person quits, so they never carry over to whoever takes the nick next
  • Uses IRCv3 draft/metadata-2; subscriptions are set up automatically on connect

HexDroid negotiates around fifty capabilities in total, and each can be switched off per network. See the full capability list for what it does with every one.

User Experience

Material 3 Interface

  • Jetpack Compose + Material Design 3
  • Dark, Light, Matrix (green-on-black), Terminal (amber), and system themes
  • Adjustable font size, chat line spacing and line height within a message
  • Open Sans, Inter, Monospace, or a custom font file, set separately for the interface and the chat area
  • Timestamps and sender nicks take square, round, angle or curly brackets, or none, with a live sample; timestamps can have their own colour
  • mIRC/ANSI colour code rendering
  • 99-colour code picker
  • Colourised nicknames
  • Landscape split-pane with draggable dividers

Notifications

  • Highlights on your nick, private messages, and custom keywords you define
  • Separate silent and sound notification channels; vibration Low / Medium / High
  • Conversation notifications: one notification per channel or private chat, holding its recent messages with each sender's name and avatar: their IRCv3 avatar when they have set one, otherwise a coloured initial. A channel's notification shows who last highlighted you. Android lists them as conversations, so you can make one a priority conversation
  • Bubbles on Android 11 and later: open a conversation in a floating bubble to read and reply without leaving what you are doing
  • Mute a single channel or private chat from Channel settings in the chat menu; push notifications for it are muted too
  • Push notifications without a background connection, on servers that support it. See the Push Notifications card above
  • See Getting Started → Staying connected to set them up

Usability

  • Link previews for images and video
  • Nick completion (@..) or nicklist mention
  • Clickable URLs and email addresses
  • Per-conversation drafts unsent text stays with the channel you typed it in, and comes back with the cursor where you left it
  • Long-press to copy message text
  • Swipe left on buffer to close / part
  • Channel topic bar (optional)
  • Lag indicator in toolbar
  • Guided intro tour for new users
  • /msg and /notice print where you typed them, as >nick< message, rather than opening a window for a one-off line
  • CTCP requests and the replies sent back to them are shown together, in the conversation you are reading
  • Settings are searchable by name, description, category or a common alternate term, in any language the app ships
  • Configurable scrollback limit (default 800)
  • Choose which channel events show: joins, parts, quits, nick changes, topic changes, kicks and mode changes, one by one or all at once, for every channel or just one
  • Smart filter: joins, parts, quits and nick changes show only for people who spoke in the last 5, 10, 30 or 60 minutes. If someone speaks soon after joining, their join appears at the time it happened
  • Channel settings (chat menu): mute notifications, add highlight words for that channel, and give it its own event settings

User / Channel Actions

  • Nick action sheet: WHOIS, query, mention, DCC, ignore/unignore
  • Channel mode panel with descriptions
  • Ban/quiet/except/invex list management
  • IRCop tools: kick-ban, force join/part, broadcast

Nick & Command Completion

  • @mention popup inserts nick: at start or @nick inline; an @ inside an email address is left alone
  • Tab completes the word before the cursor against the member list on a physical keyboard; repeat presses cycle the matches, Shift+Tab goes back
  • /-completion bar for all slash commands
  • NickServ/ChanServ shorthand: ns, cs, as, hs, ms, bs

Inline Media Previews

  • In-line image previews with a "Load preview" button
  • Embedded YouTube video player
  • Inline X / Twitter video playback from X post links (HLS via Media3 / ExoPlayer)
  • Images capped at 5 MB; Wi-Fi-only mode available
  • Disabled by default opt in under Settings › Media Previews

Readline Marker

  • Thin line marks where you stopped reading
  • Only appears when scrolling up past visible messages
  • Resets automatically when you reach the bottom

Ignore List

  • Per-network ignore list
  • Nicks or nick!user@host masks such as *!*@example.com, matched without regard to case
  • Choose what each entry drops: channel messages, private messages, notices, CTCP, invites, DCC offers, and joins, parts and quits
  • /ignore <mask> [types] or via Settings UI
  • Ignored messages silently hidden; an ignored CTCP request gets no automatic reply

Chat Logging

  • Optional per-session logging (off by default)
  • Configurable retention (default 14 days)
  • Custom folder via Android SAF
  • Server buffer logging (optional)
  • /find keyword searches the loaded scrollback
  • Search logs (chat menu) searches the log files themselves: one conversation, one network or all of them. Every word must appear, quotes match a phrase and from:nick keeps one person's messages. Each result shows the lines around it and can open the conversation at that line. On soju, the bouncer's stored history is searched too
  • Optional raw protocol log per network for debugging, with passwords hidden
  • Copy debug info (About) gathers the version, each network's state and capabilities, recent errors and, if you choose, recent raw lines with passwords hidden, for a bug report

DCC File Transfers

DCC SEND, CHAT & Passive

  • DCC send/receive files from other users. /dcc send <nick> opens a file picker, as do the nick menu and the Transfers screen
  • SDCC TLS-encrypted transfers (SSEND) and chats (SCHAT), working with KVIrc and between HexDroid users; peers with self-signed certificates are accepted
  • DCC CHAT direct peer-to-peer text sessions. A secure chat shows the certificate fingerprint so you can check with the other person that nobody is in the middle
  • DCC chat messages notify like private messages, and you can reply straight from the notification
  • /dcc accept, /dcc reject and /dcc close manage chats from the keyboard. See Commands › DCC
  • Passive / Reverse DCC HexChat-compatible token handshake; useful behind NAT
  • Turbo DCC (TSEND) no per-packet ACKs for faster throughput
  • Full IPv6 DCC addressing for SEND, CHAT and passive transfers
  • Progress tracking in the Transfers screen
  • Incoming port range configurable for NAT/firewall forwarding
  • A connection to an unreachable address gives up after 30 seconds
  • Received files saved to Downloads (or custom folder via SAF)
  • DCC disabled by default enable in Settings

Security note

DCC establishes direct connections between clients. Only accept files from users you trust.

Passive DCC means you initiate the connection to the sender works better behind NAT/CGNAT.

Large Files (> 4 GB)

  • Files larger than 4 GB use 64-bit (8-byte) DCC acknowledgements
  • Smaller transfers keep the standard 4-byte acks
  • Both big- and little-endian ack widths are accepted for mIRC compatibility
  • Streamed transfers of unknown size (size 0) also use 64-bit acks

Resume Interrupted Transfers

  • A failed download remembers its partial bytes (peer + filename + size + path)
  • Re-offering the same file shows a Resume button beside Accept / Reject
  • Honours incoming DCC RESUME on your outgoing sends, replying DCC ACCEPT from the agreed offset
  • Partial state survives restarts, is pruned after 30 days, and tolerates corruption

Proxy/Tor

  • Transfers and chats route through the network's configured SOCKS5 / SOCKS4a proxy
  • Works over Tor (via Orbot) alongside the IRC connection
  • See Getting Started > Proxy & Tor