Skip to content

AndroidIRCx/AndroidIRCx

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

156 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

AndroidIRCX

Build GitHub Release Downloads GitHub License

OpenSSF Best Practices CodeQL Dependabot Coverage

GitHub Stars Contributors GitHub Issues Last Commit

Google Play

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

Get it on Google Play

Google Play Direct APK Download
Google Play QR APK Download QR
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.


✨ 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 codes
  • commands/ -- 18 handlers for every incoming IRC command
  • sendCommands/ -- 10 modules for user-initiated commands
  • cap/CAPHandlers.ts -- IRCv3 capability negotiation state machine
  • ScramAuth.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-Poly1305
  • src/services/MediaEncryptionService.ts -- file encryption with context-bound AAD
  • src/services/irc/ScramAuth.ts -- SCRAM-SHA-256 with HMAC, PBKDF2, salted hashing
  • src/services/CertificateManagerService.ts -- X.509 certificate generation with node-forge

Want to add your own IRC command?

  1. Create a handler in src/services/irc/sendCommands/
  2. Register it in IRCSendMessageHandlers.ts
  3. Add an alias in CommandService.ts
  4. 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:


πŸ”§ 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

  1. Dropdown -> "Choose Network" -> tap [+] in the header
  2. Configure: Network Name, Nickname, Alt Nick, Real Name, Auto-Join Channels
  3. Add servers with hostname, port, SSL/TLS settings
  4. Optional: SASL (PLAIN/SCRAM-SHA-256/EXTERNAL), proxy, client certificate
  5. Save

Client Certificate Authentication (SASL EXTERNAL)

AndroidIRCX supports passwordless authentication with X.509 client certificates:

  1. Generate -- Settings -> Network -> SASL EXTERNAL -> Generate New (RSA-2048, SHA-256)
  2. Register -- /msg NickServ CERT ADD <fingerprint> or use /certadd
  3. 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.

Linux GNU


πŸ“„ 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.

πŸœ‚πŸœƒπŸœ‚


AndroidIRCx

AndroidIRCx.com


mIRC and IRCap set the standard. AndroidIRCX is the open-source platform that carries it forward.