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
SSLContextcache - 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 to a single JSON file, portable between devices
- SASL credentials and client certificates are not exported, for security
- See Getting Started → Moving to a new device
Character Encoding
- Auto-detect per message (UTF-8 fallback)
- Manual encoding per network
windows-1251Russian/CISKOI8-Rolder Cyrillic systemsISO-8859-1/15Western European- Any encoding supported by Java's
Charset
Bouncer Support
- Works with soju, ZNC, kiwibnc, pounce and anything following the
user/networkconvention - Per-client buffers on ZNC and per-client history on soju, so each device keeps its own read position
- Native chathistory playback on both
/zncand/bouncerserv(alias/bnc) talk to the bouncer directly- 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/KICKLENbefore sending - History requests respect the server's
CHATHISTORYsize limit andMSGREFTYPESselectors /knock <#channel> [reason]asks for an invite where the server advertisesKNOCK- The “too many channels” error reads the server's
CHANLIMITfigure - Bot users are badged
[bot]from theBOTmode letter or thebotmessage 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
- 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
+typingclient tag overmessage-tags; respects a server'sCLIENTTAGDENYpolicy - Purely transient - never logged or stored
File Uploads (Filehost)
- Attach button in the chat input when the server offers a
soju.im/FILEHOSTupload endpoint (soju; others viaadditional-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-registrationno 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
/registerand/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-namehave it shown beside their nick, Discord-style; acolortints their nick - Tap a nick to see their avatar and status; avatars 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> listreads someone else's - 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
- 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
/msgand/noticeprint 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)
- Hide JOIN/PART/QUIT globally
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
@mentionpopup insertsnick:at start or@nickinline- 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
- Case-insensitive nick matching
/ignore nickor via Settings UI- Ignored messages silently hidden
Chat Logging
- Optional per-session logging (off by default)
- Configurable retention (default 14 days)
- Custom folder via Android SAF
- Server buffer logging (optional)
/find keywordsearches scrollback & logs- Optional raw protocol log per network for debugging, with passwords hidden
DCC File Transfers
DCC SEND, CHAT & Passive
- DCC send/receive files from other users
- DCC SSEND Encrypted file transfers
- DCC CHAT direct peer-to-peer text sessions
- 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
- 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 RESUMEon your outgoing sends, replyingDCC ACCEPTfrom the agreed offset - Partial state survives restarts, is pruned after 30 days, and tolerates corruption
Proxy/Tor
- Transfers route through the network's configured SOCKS5 / SOCKS4a proxy
- Works over Tor (via Orbot) alongside the IRC connection
- See Getting Started > Proxy & Tor