Core Features
The fundamentals of the IRC experience in HexDroid.
Multi-Network
- Multiple simultaneous connections
- Auto-connect on app startup (per network)
- 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 all network configurations to a JSON file
- Import to restore networks and settings
- Portable between devices
- Accessible from Settings > Backup & Restore
- SASL credentials are not exported for security
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
- Bouncer type dropdown (soju, ZNC, Generic, None) composes the correct username syntax automatically
- Per-client buffers on ZNC and per-client history on soju via dedicated Client ID field
/zncand/bouncerserv(alias/bnc) slash commands- BouncerServ and
*statusreplies routed to the server buffer - ZNC:
znc.in/server-time-iso,znc.in/playback - soju:
soju.im/bouncer-networks,soju.im/bouncer-networks-notify,soju.im/read - ZNC/Soju: native chathistory playback
- Skips auto-join (bouncer manages channels)
IRCv3 Capabilities
HexDroid negotiates capabilities during the connection handshake. Each capability can be toggled per network in the IRCv3 Capabilities section of network settings. Badges: graduated = finalized spec · draft = draft spec · vendor = implementation-specific.
Core Message Infrastructure
| Capability | Status | What HexDroid does |
|---|---|---|
| message-tags | graduated | Parses and propagates @tag=value metadata on incoming messages |
| server-time | graduated | Displays accurate timestamps on all messages, including replayed history |
| echo-message | graduated | Uses server-echoed messages as authoritative sent events instead of local echo |
| labeled-response | graduated | Correlates command responses with their triggering requests |
| batch | graduated | Processes grouped message batches (chathistory, netsplit, etc.) atomically |
| utf8only | graduated | Signals UTF-8 capability; enforces UTF-8 output on utf8only networks |
| message-ids | graduated | Tracks unique msgid tags for deduplication of chathistory replays |
| standard-replies | graduated | Parses FAIL/WARN/NOTE replies and surfaces them contextually per buffer |
| draft/multiline | draft | Receives messages that exceed 512 bytes or contain line breaks as a single grouped message instead of one IRC line per visual line. Uses the draft/multiline BATCH type with the +draft/multiline-concat tag for flood-control splits. Both the draft and forward-compat graduated multiline are negotiated. |
History & Read State
| Capability | Status | What HexDroid does |
|---|---|---|
| chathistory | graduated | Requests recent message history on join (Ergo 2.11+, soju 0.7+) |
| draft/chathistory | draft | Same as above for servers on the earlier draft spec |
| draft/event-playback | draft | Replays channel state events (joins, modes) alongside message history |
| draft/read-marker | draft | Syncs read position with the server for multi-client read-state tracking |
| soju.im/read | vendor | soju-specific read-marker sync |
Membership & Presence
| Capability | Status | What HexDroid does |
|---|---|---|
| account-notify | graduated | Updates account name when a user logs in/out of services |
| away-notify | graduated | Tracks away/back state for all channel members in real time |
| chghost | graduated | Updates the user's displayed hostmask when it changes without a rejoin |
| extended-join | graduated | Receives account name and real name in JOIN; displayed in user info panel |
| multi-prefix | graduated | Shows all channel prefixes a user holds (e.g. @+nick for op+voice) |
| userhost-in-names | graduated | Receives full nick!user@host in 353 NAMES reply |
| invite-notify | graduated | Notifies you when another user is invited to a channel you're in |
| monitor | graduated | Watches for a list of nicks coming online/offline |
| draft/extended-monitor | draft | Extended MONITOR with account and away state in notifications |
| pre-away | graduated | Sends AWAY before 001 registration when configured as away |
Messaging
| Capability | Status | What HexDroid does |
|---|---|---|
| account-tag | graduated | Surfaces the sender's services account name as a per-message tag |
| typing | graduated | Shows a typing indicator when a user is composing (with privacy controls) |
| draft/typing | draft | Same as above for servers on the earlier draft spec both are negotiated simultaneously |
| sasl | graduated | Authenticates using PLAIN, SCRAM-SHA-256, or EXTERNAL during handshake |
| setname | graduated | Enables /setname to change your real name on the fly without reconnecting |
| draft/message-reactions | draft | Receives TAGMSG-based emoji reactions; displayed inline on messages |
| draft/relaymsg | draft | Renders RELAYMSG-relayed messages with the original sender identity shown |
Bouncer / Vendor
| Capability | Status | What HexDroid does |
|---|---|---|
| znc.in/server-time-iso | vendor | Parses ZNC's legacy server-time format for accurate timestamps on playback |
| znc.in/playback | vendor | Uses ZNC's playback module to request missed messages |
| soju.im/bouncer-networks | vendor | Enumerates per-network sessions from a single soju connection |
| soju.im/bouncer-networks-notify | vendor | Receives push notifications when the soju network list changes |
| soju.im/no-implicit-names | vendor | Suppresses the automatic 353 NAMES list on JOIN. Skips a full names re-download on every bouncer reconnect. |
| draft/channel-rename | draft | Follows channel renames in real time without user intervention |
| draft/no-implicit-names | draft | Generic-form (non-soju) opt-out of implicit NAMES on join |
Modern Messaging (IRCv3)
Capabilities HexDroid negotiates to bring contemporary chat features to IRC. Each degrades gracefully — on servers that don't advertise the cap, the feature simply stays dormant rather than erroring.
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
- Negotiates both
typinganddraft/typing - Purely transient — never logged or stored
Multiline Messages
- Receives messages over 512 bytes or containing line breaks as a single grouped message
- Uses the
draft/multilineBATCH type with+draft/multiline-concatfor flood-control splits - Negotiates the draft and forward-compat
multilinecaps - Pasted multi-line blocks stay together instead of fragmenting into one line each
Online Notifications (MONITOR)
- Watch for nicks coming online with
/monitor +nick - Server reports current status on add, then notifies on every change
Llist,Sstatus,Cclear;-nickto stop watching- Negotiates
monitoranddraft/extended-monitor - Falls back to a clear message if the server lacks MONITOR
Live Realname & Channel Rename
/setname <realname>updates your realname without reconnecting (setnamecap)- Handles
draft/channel-rename— a renamed channel updates in place, keeping scrollback and read state - No manual re-join needed when a channel is renamed server-side
Relayed Messages
- Understands
draft/relaymsgfor bridged users (Discord, Matrix, Telegram relays) - Relayed nicks are attributed correctly rather than appearing as the bridge bot
- Keeps bridged conversations readable alongside native IRC users
User Experience
Material 3 Interface
- Jetpack Compose + Material Design 3
- Dark, Light, Matrix (green-on-black), and system themes
- Adjustable font size
- Open Sans, Inter, Monospace fonts
- mIRC/ANSI colour code rendering
- 99-colour code picker
- Colourised nicknames
- Landscape split-pane with draggable dividers
Notifications
- Highlight notifications (nick mention)
- Private message alerts
- Custom highlight words (case-insensitive)
- Sound on highlight (optional)
- Vibration: Low / Medium / High
- Silent vs. sound notification channels
- Persistent connection status notification
Usability
- Link previews for images and video
- Nick completion (Tab key or button)
- Clickable URLs and email addresses
- 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
- 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
- Tab key or toolbar button to complete nicks
@mentionpopup insertsnick:at start or@nickinline/-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
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
- 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 instead of the classic 32-bit field, which would otherwise wrap
- 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
IPv6 & Proxy / Tor
- Full IPv6 DCC addressing for SEND, CHAT and passive transfers
- Transfers route through the network's configured SOCKS5 / SOCKS4a proxy
- Works over Tor (via Orbot) alongside the IRC connection
- See Getting Started → Proxy & Tor
Settings Reference
Global settings available in the app's Settings screen.
Appearance
| Setting | Description | Default |
|---|---|---|
| Font size | Chat text size across all buffers | System |
| Font family | Open Sans, Inter, or Monospace | Open Sans |
| Colorise nicks | Consistent colour per nickname | On |
| Custom nick colour | Customise the colour of your nick | Auto |
| Show topic bar | Channel topic above message list | On |
| Hide JOIN/PART/QUIT | Suppress join/part/quit events globally | Off |
| Hide topic on entry | Suppress topic being displayed when joining channels | Off |
| Scrollback limit | Max lines per buffer kept in memory | 800 |
Inline Media
| Setting | Description | Default |
|---|---|---|
| Inline media enabled | Show image and video previews inline in chat (X/YouTube) | Off |
| Wi-Fi only | Only load media previews when connected to Wi-Fi | Off |
Notifications
| Setting | Description | Default |
|---|---|---|
| Notifications enabled | Master toggle for all notifications | On |
| Notify on highlights | Alert when your nick is mentioned | On |
| Notify on PM | Alert on incoming private messages | On |
| Extra highlight words | Additional trigger words (case-insensitive) | — |
| Sound on highlight | Audible alert | Off |
| Vibrate on highlight | Haptic feedback | Off |
| Vibration intensity | Low, Medium, or High | Medium |
Connection
| Setting | Description | Default |
|---|---|---|
| Keep alive in background | Foreground service to maintain connection | On |
| Auto-reconnect | Reconnect on unexpected disconnection | On |
| Reconnect delay | Seconds before first retry | 10 s |
| History limit | Messages fetched via chathistory on join | 50 |
| History counts as unread | Mark replayed history as unread | Off |
| History triggers notifications | Send notifications for replayed messages | Off |
Logging
| Setting | Description | Default |
|---|---|---|
| Logging enabled | Write chat messages to log files on device | Off |
| Log server buffer | Also log server/status messages | Off |
| Retention period | Delete logs older than N days | 14 days |
| Log folder | Custom folder via SAF (default: app-private) | — |
Backup & Restore
| Action | Description |
|---|---|
| Export backup | Save all network configurations and settings to a JSON file |
| Import backup | Restore networks and settings from a previously exported JSON file |
DCC
| Setting | Description | Default |
|---|---|---|
| DCC enabled | Master toggle for all DCC features | Off |
| DCC send mode | Active, Passive, or Auto | Auto |
| Incoming port range | Ports to listen on (for router forwarding) | 5000–5010 |
| DCC download folder | Custom folder for received files | Downloads |