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 and persists server SHA-256 fingerprint on first connect
- SASL credentials in
EncryptedSharedPreferences - Credentials excluded from Android backup
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-1251— Russian/CISKOI8-R— older Cyrillic systemsISO-8859-1/15— Western European- Any encoding supported by Java's
Charset
Bouncer Support
- Dedicated bouncer mode per network
- Skips auto-join (bouncer manages channels)
- ZNC:
znc.in/server-time-iso,znc.in/playback - soju:
soju.im/bouncer-networks,soju.im/read - Ergo / soju: native chathistory playback
- MOTD pass-through for bouncer status
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 |
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 |
| draft/channel-rename | draft | Follows channel renames in real time without user intervention |
| draft/no-implicit-names | draft | Opts out of implicit 353 NAMES on join; uses explicit NAMES request instead |
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 "Load preview" button
- Embedded YouTube video player
- Images capped at 5 MB; Wi-Fi-only mode available
- Disabled by default — opt-in in Settings
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.
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 YouTube previews inline in chat | 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 |