The open-source IRC client and framework for the mobile era.
mIRC taught a generation how to script. IRCap by Carlos Esteve Cremades (since 1997) showed what a truly complete IRC experience could look like. AndroidIRCX carries that spirit forward - open source, built on React Native, and designed so you can learn, hack, extend, and build your own IRC experience from real production code.
📲 Download
| Google Play | Direct APK Download | |
|---|---|---|
| Google Play Store | Direct APK |
🔒 Verified Builds
Every release APK and AAB is scanned with VirusTotal before publishing. Only builds matching the published SHA-256 checksum are official releases.
- **SHA-256 checksum file: ** app-release.apk.sha256
- VirusTotal scanning policy: Every release build is scanned on VirusTotal before publishing.
Verify your download:
# Download the checksum curl -O https://androidircx.com/uploads/app-release.apk.sha256 # Verify APK integrity sha256sum -c app-release.apk.sha256
📱 System Requirements
| Requirements | Android version |
|---|---|
| Minimum | Android 7.0+ (API 24) |
| Recommended | Android 11+ (API 30) |
| Target | Android 15 (API 36) |
💡 Why AndroidIRCX?
Back in the day, mIRC wasn't just an IRC client - it was a platform. Scripts like IRCap turned it into a complete environment with protection systems, away management, writing styles, and channel moderation panels. People learned scripting, built addons, automated bots, and made IRC their own.
AndroidIRCX is built for that same crowd, but open source and for today's platforms.
This is a full-featured, production IRC client - but it's also a learning platform and a * *framework** you can study, fork, and build on top of:
- Learn TCP sockets -- see how raw IRC protocol works over
react-native-tcp-socket, TLS handshakes, proxy tunneling, SOCKS5/Tor - Learn state management - Zustand stores and a large set of custom hooks for complex React Native apps
- Learn cryptography - E2E encryption with libsodium (XChaCha20-Poly1305), SCRAM-SHA-256 authentication (RFC 7677), X.509 certificate generation
- Learn protocol implementation - 390+ IRC numeric handlers, full IRCv3 compliance, CAP negotiation, SASL state machines
- Learn architecture - service-oriented design, EventEmitter patterns, context interfaces, modular handler extraction
- Learn testing - extensive Jest coverage across services, hooks, components, stores, utilities, screens, and end-to-end flows
- Learn CI/CD - GitHub Actions, Docker-based release builds, automated coverage reports
Everything is TypeScript. Everything is documented. Everything is yours to read, modify, and ship.
This isn't a toy project. It's a real app on Google Play with real users - and the entire codebase is GPL-3.0, because the best way to learn is from code that actually works in production.
Quality Standards
AndroidIRCX uses a mandatory CI quality gate for code style, linting, type-safety, and tests.
Required project checks:
- Prettier format verification
- ESLint with zero warnings allowed
- TypeScript
tsc --noEmit - Jest CI test suite
If you want to contribute, see CONTRIBUTING.md. Pull requests are expected to be small enough to review safely and to include local verification evidence.
✨ Features
Multi-Network IRC Client
- Connect to multiple IRC networks simultaneously
- Multiple servers per network with failover
- Background service for persistent connections
- Auto-connect favorites on startup
- Auto-join channels after connect
- Bouncer/ZNC detection and integration
Full IRCv3 Compliance (27 capabilities)
Standard capabilities: server-time, account-notify, extended-join, userhost-in-names, away-notify, chghost, message-tags, batch, labeled-response, echo-message, multi-prefix, monitor, extended-monitor, cap-notify, account-tag, setname, standard-replies, message-ids, bot, sasl
Draft capabilities: typing indicators, chathistory, multiline, read-marker, message-redaction, reply, react, channel-context, rename
Security & Encryption
- E2E Encrypted DMs -- TOFU with key pinning, libsodium XChaCha20-Poly1305
- Encrypted Channels -- shared channel keys distributed via encrypted DM
- SASL Authentication -- PLAIN, SCRAM-SHA-256 (RFC 7677), EXTERNAL (client certificates)
- Client Certificates -- RSA-2048 X.509 generation, NickServ CERT integration
- Key Verification -- fingerprints, QR codes, NFC exchange, file export
- App Lock -- PIN and biometric authentication
- Secure Storage -- secrets in device Keychain, never in plain AsyncStorage
Smart Command System
- 70+ command aliases (IRC, ZNC, IRCop, NickServ/ChanServ helpers)
- Context-aware autocomplete with scoring
- Command history (last 30 with dedup)
- IRC services panel (NickServ, ChanServ, HostServ, OperServ) with auto-detection across major IRCds
Media & Communication
- DCC file transfers and DCC chat
- Voice messages, camera capture, video recording
- Media encryption with context-bound AAD
- Image/video preview and playback
- Link previews
User Interface
- Configurable layout (tabs and userlist dockable to any edge)
- Real-time typing indicators (multi-user)
- Message search, reactions, read markers
- 3 themes (Dark, Light, IRcap) + custom theme editor
- Message format editor
- RAW command logging with 7 category filters
- Picture-in-Picture mode
- Landscape and portrait support
Protection & Moderation
- Flood protection, anti-deop
- Clone detection
- Blacklist and ignore lists
- Ban mask types (0-9) with kick/ban reasons
- Away system with auto-answer, announce, presets
Built-in Scripting Engine
- Write scripts to automate IRC tasks
- 50+ script hooks for events
- Time-based access (rewarded ads) or unlimited with Pro purchase
- Inspired by the mIRC scripting tradition
- Quick example:
module.exports = { onMessage: (msg) => {}, onCommand: (text) => text }; - Common API:
api.log(),api.sendMessage(),api.sendCommand(),api.setTimer() - Full scripting API/docs: https://github.com/AndroidIRCx/AndroidIRCx/wiki/Scripting
Internationalization
- 9 languages: English, French, German, Italian, Portuguese, Romanian, Russian, Serbian (Latin + Cyrillic), Spanish
- Transifex Native integration
🛠️ Tech Stack
| Framework | React Native 0.84.1, React 19.2.3 |
| Language | TypeScript 5.9.3 |
| State | Zustand 5.0.11 |
| Networking | react-native-tcp-socket (raw TCP/TLS) |
| Encryption | libsodium, node-forge, @noble/curves |
| Storage | AsyncStorage + Keychain (react-native-keychain) |
| UI/Lists | FlashList, Reanimated, react-native-vector-icons |
| Testing | Jest 30.3, Testing Library |
| CI/CD | GitHub Actions, Docker |
| Notifications | @notifee/react-native |
| Media | vision-camera, react-native-video, audio-recorder |
| i18n | Transifex Native (9 languages) |
| Analytics | Firebase Crashlytics, Firebase App Check |
🏗️ Architecture
AndroidIRCX follows a service-oriented architecture with clear separation of concerns:
App.tsx -- main UI orchestrator
|
+-- Zustand Stores
| connectionStore, tabStore, uiStore, messageStore, callStore
|
+-- Custom Hooks
| Connection lifecycle, tab management, message sending,
| encryption, DCC, settings, deep links, ads, UI state, and more
|
+-- Components
| AppLayout, MessageArea, MessageInput, ChannelTabs,
| UserList, HeaderBar, settings sections, media and certificate modals
|
+-- Screens
| Settings, network config, theme editor, scripting,
| key management, privacy, backup, purchases, channel list, help screens
|
+-- Services
| IRCService -- core protocol handler
| irc/ -- extracted protocol modules for commands, numerics,
| send commands, SCRAM-SHA-256 auth, CTCP, batch/label,
| multiline, and CAP negotiation
| ConnectionManager, SettingsService, TabService,
| EncryptedDMService, MediaEncryptionService,
| ScriptingService, WebRTCCallService, and more
|
+-- Utils
IRCFormatter, MessageParser, encodings, tab utils
Key Design Patterns
- Context Interfaces -- extracted handler modules receive typed context objects, not full service references. This keeps modules testable and decoupled.
- EventEmitter Communication -- services talk via events, never cross-service direct mutation
- Lazy Initialization -- handlers instantiated on first use
- Write Batching -- messages batched (10/2s), tabs debounced (500ms)
- StorageCache -- LRU cache with TTL over AsyncStorage
- Progressive Loading -- critical data first, message history deferred per-tab
📁 Project Structure
AndroidIRCX/
+-- src/
| +-- components/ UI components, settings sections, modals
| +-- hooks/ Custom React hooks
| +-- screens/ App screens and help screens
| +-- stores/ Zustand stores
| +-- services/ Core app services
| | +-- irc/ IRC protocol modules, numerics, CAP, send commands
| +-- config/ App config + IRCd service detection
| +-- themes/ Dark, Light, IRcap
| +-- types/ Type definitions
| +-- utils/ Utility modules
| +-- i18n/ Translation resources
| +-- core/ ServiceContainer (DI)
| +-- interfaces/ Service type interfaces
| +-- presets/ IRcap preset definitions
|
+-- __tests__/ Unit, integration, and journey tests
+-- android/ Android native code
+-- scripts/ Build and translation scripts
+-- patches/ patch-package patches
+-- .github/workflows/ CI/CD workflows
+-- Dockerfile Docker-based release builds
+-- App.tsx Main component
+-- package.json v1.8.10, GPL-3.0-or-later
🚀 Getting Started
Prerequisites
- Node.js >= 20
- Yarn
- Android SDK / Android Studio
- React Native CLI
Setup
# Clone the repo git clone https://github.com/AndroidIRCx/AndroidIRCx.git cd androidircx # Install dependencies yarn install # Start Metro bundler yarn metro # Run on Android device/emulator yarn android
Development Commands
yarn test # Run the Jest suite yarn type-check # TypeScript check (tsc --noEmit) yarn lint # ESLint yarn pre-push-check # type-check + lint # Translation management yarn tx:pull # Pull translations from Transifex yarn tx:push # Push source strings yarn tx:merge-sr # Merge missing Serbian keys
Running Tests
# All tests with coverage yarn test --coverage # IRC protocol tests only (685+ tests) npx jest --testPathPatterns="IRCService" --no-coverage # Specific service npx jest --testPathPatterns="services/EncryptedDMService" --no-coverage # Specific hook npx jest --testPathPatterns="hooks/useConnectionManager" --no-coverage
📚 For Developers & Learners
Want to understand TCP sockets?
Start with src/services/IRCService.ts -- the connect() method shows raw TCP socket creation, TLS
upgrade, proxy tunneling (SOCKS5/HTTP/Tor), and buffer processing. Then look at processBuffer() to
see how IRC protocol lines are parsed from a TCP byte stream.
Want to learn real-world React Native architecture?
Look at the hooks in src/hooks/ -- they extract complex business logic from components.
useConnectionLifecycle.ts shows how to wire up event listeners for a real-time protocol.
useLazyMessageHistory.ts shows on-demand data loading patterns.
Want to implement a network protocol?
The src/services/irc/ directory is a textbook implementation of the IRC protocol:
numerics/-- 15 modules handling 390+ server response codescommands/-- 18 handlers for every incoming IRC commandsendCommands/-- 10 modules for user-initiated commandscap/CAPHandlers.ts-- IRCv3 capability negotiation state machineScramAuth.ts-- SCRAM-SHA-256 challenge-response auth (RFC 7677/5802)
Want to learn cryptography in practice?
src/services/EncryptedDMService.ts-- TOFU key exchange, key pinning, XChaCha20-Poly1305src/services/MediaEncryptionService.ts-- file encryption with context-bound AADsrc/services/irc/ScramAuth.ts-- SCRAM-SHA-256 with HMAC, PBKDF2, salted hashingsrc/services/CertificateManagerService.ts-- X.509 certificate generation with node-forge
Want to add your own IRC command?
- Create a handler in
src/services/irc/sendCommands/ - Register it in
IRCSendMessageHandlers.ts - Add an alias in
CommandService.ts - Write tests in
__tests__/
That's it. The context interface pattern means your handler receives only what it needs -- no god objects, no tight coupling.
📖 Wiki Guides
For end-user setup guides, feature walkthroughs, and troubleshooting, see the wiki:
- Wiki Home: https://github.com/AndroidIRCx/AndroidIRCx/wiki
- Getting Started: https://github.com/AndroidIRCx/AndroidIRCx/wiki/Getting-Started
- Networks and Servers: https://github.com/AndroidIRCx/AndroidIRCx/wiki/Networks-and-Servers
- Connecting: https://github.com/AndroidIRCx/AndroidIRCx/wiki/Connecting
- User Management: https://github.com/AndroidIRCx/AndroidIRCx/wiki/User-Management
- IRC Services and Commands: https://github.com/AndroidIRCx/AndroidIRCx/wiki/IRC-Services-and-Commands
- Channel Operations: https://github.com/AndroidIRCx/AndroidIRCx/wiki/Channel-Operations
- Channels and Tabs: https://github.com/AndroidIRCx/AndroidIRCx/wiki/Channels-and-Tabs
- DCC and File Transfers: https://github.com/AndroidIRCx/AndroidIRCx/wiki/DCC-%26-File-Transfers
- Security and Encryption: https://github.com/AndroidIRCx/AndroidIRCx/wiki/Security-and-Encryption
- SASL EXTERNAL Certificates: https://github.com/AndroidIRCx/AndroidIRCx/wiki/SASL-EXTERNAL-Certificates
- Commands and Scripting: https://github.com/AndroidIRCx/AndroidIRCx/wiki/Commands-and-Scripting
- Scripting (Full API): https://github.com/AndroidIRCx/AndroidIRCx/wiki/Scripting
- App Features: https://github.com/AndroidIRCx/AndroidIRCx/wiki/App-Features
- Advanced Settings: https://github.com/AndroidIRCx/AndroidIRCx/wiki/Advanced-Settings
- Troubleshooting: https://github.com/AndroidIRCx/AndroidIRCx/wiki/Troubleshooting
🔧 Configuration
Quick Connect
- Tap the network name in the header to connect
- Tap the dropdown -> "Connect to Default" for one-click connection
- Connect Another Network for simultaneous multi-network connections
Adding a Network
- Dropdown -> "Choose Network" -> tap [+] in the header
- Configure: Network Name, Nickname, Alt Nick, Real Name, Auto-Join Channels
- Add servers with hostname, port, SSL/TLS settings
- Optional: SASL (PLAIN/SCRAM-SHA-256/EXTERNAL), proxy, client certificate
- Save
Client Certificate Authentication (SASL EXTERNAL)
AndroidIRCX supports passwordless authentication with X.509 client certificates:
- Generate -- Settings -> Network -> SASL EXTERNAL -> Generate New (RSA-2048, SHA-256)
- Register --
/msg NickServ CERT ADD <fingerprint>or use/certadd - Connect -- SASL EXTERNAL authenticates automatically
Commands: /certfp (view fingerprint), /certadd [service] (register with
NickServ/CertFP/HostServ)
SCRAM-SHA-256 Authentication
For networks that support it, SCRAM-SHA-256 provides challenge-response authentication without sending your password in cleartext. Configure SASL with mechanism "SCRAM-SHA-256" in network settings.
⚙️ CI/CD
Tests (on every push/PR)
GitHub Actions runs the Jest suite with coverage, uploaded to Codecov.
Release Builds (Docker)
Automated Docker-based builds on push to master:
Dockerfile -> reactnativecommunity/react-native-android
-> yarn install
-> prepare-secrets.sh (inject signing keys)
-> assembleRelease + bundleRelease (armeabi-v7a, arm64-v8a)
-> upload artifacts
🤝 Contributing
AndroidIRCX is open source and contributions are welcome.
Areas where you can help:
- IRC protocol -- new IRCv3 capabilities, IRCd-specific features
- Testing -- more edge cases, integration tests
- Translations -- add or improve translations via Transifex
- UI/UX -- accessibility, new themes, layout improvements
- Documentation -- guides, tutorials, examples
- Security -- audit, improvements, new encryption features
Before submitting a PR:
yarn pre-push-check # Must pass type-check + lint yarn test # Must pass all tests
🔐 Security
- TLS/SSL -- full encrypted connection support
- SASL -- PLAIN, SCRAM-SHA-256, EXTERNAL (client certificates)
- E2E Encryption -- libsodium XChaCha20-Poly1305 with context-bound AAD
- Secure Storage -- device Keychain for secrets (AsyncStorage fallback with warning)
- App Lock -- PIN and biometric with auto-lock on background/launch
- Kill Switch -- emergency disconnect and optional data wipe
- Play Integrity -- Google Play Integrity verification
📝 IRC Protocol Compliance
| Standard | Coverage |
|---|---|
| RFC 1459 | Full compliance |
| RFC 2812 | Extended numeric support (390+ handlers) |
| IRCv3 | 27 capabilities requested, full implementation |
| SASL | PLAIN + SCRAM-SHA-256 (RFC 7677) + EXTERNAL |
| DCC | SEND, CHAT |
| CTCP | Full (VERSION, TIME, PING, ACTION, etc.) |
🎨 Credits & Inspiration
IRCap (c) Carlos Esteve Cremades, 1997-2026 - the legendary mIRC script that inspired AndroidIRCX's away system, protection features, writing styles, and the IRcap theme. If you used mIRC in the 2000s, you probably know IRCap. Its futuristic design and complete feature set set the bar for what an IRC experience should be.
IRcap theme for AndroidIRCX by ARGENTIN07, based on the original IRCap theme.
Translations: ARGENTIN07 and Cubanita83 (Spanish), Yusbastian Lemon (Indonesian). See the full credits in the app's Credits screen.
As an open-source creator, I deeply respect the work of Linus Torvalds and Richard Stallman for the free/open-source software movement. Their vision and persistence were a direct inspiration for building this app as open source.
📄 License
GNU General Public License v3.0 or later (GPL-3.0-or-later)
Copyright (C) 2025-2026 Velimir Majstorov
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.
🤖 AI Usage Disclaimer
This project was built with modern tools, including AI-assisted development.
Like robotics in manufacturing, autopilot systems in agriculture, and autocomplete in software, AI is a tool -- no more, no less.
AI did not build this project on its own. Every decision, architectural choice, security consideration, and final line of code was reviewed, validated, and maintained by a human engineer with more than 25 years of professional experience.
AI did not replace engineering judgment; it accelerated routine work so more time could be spent on architecture, quality, and usability.
If you prefer software created without automation or AI assistance, that choice is fully respected. At the same time, refusing tools has never stopped progress -- it has only determined who participates in shaping it.
This project exists to contribute something real to open source, with practical value and long-term maintenance. You are welcome to:
- use it or study it
- fork it or improve it
- or simply ignore it
All are valid choices.
Builders shape the future in silence. Spectators explain it when the work is already done.
In the end, technology moves forward with or without permission. The only question is who chose to be part of it.
Some build loudly. Others build correctly.
Those who recognize the work will understand. Time will explain the rest.
🜂🜃🜂
mIRC and IRCap set the standard. AndroidIRCX is the open-source platform that carries it forward.