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.
| Google Play | Direct APK Download | |
|---|---|---|
| Google Play Store | Direct APK |
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| Requirements | Android version |
|---|---|
| Minimum | Android 7.0+ (API 24) |
| Recommended | Android 11+ (API 30) |
| Target | Android 15 (API 36) |
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.
- 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
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
- 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
- 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
- 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
- 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
- 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
- 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
- 9 languages: English, French, German, Italian, Portuguese, Romanian, Russian, Serbian (Latin + Cyrillic), Spanish
- Transifex Native integration
| 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 |
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
- 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
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
- Node.js >= 20
- Yarn
- Android SDK / Android Studio
- React Native CLI
# 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 androidyarn 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# 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-coverageStart 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.
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.
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)
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
- 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.
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
- 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
- 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
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)
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.
GitHub Actions runs the Jest suite with coverage, uploaded to Codecov.
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
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- 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
| 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.) |
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.
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/.
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.