A native Android IRC client with a Telegram-style chat UI.
motd is built in Kotlin with Jetpack Compose and Material 3. It speaks IRCv3 and works best paired with a soju bouncer — capabilities are detected over CAP and enabled automatically — but it connects fine to plain networks too, falling back to local-only history and a persistent socket.
Each frame is split diagonally between the Ayu Light and Ayu Dark themes. See them in motion on the landing page.
| Chat list | Conversation | File uploader |
![]() |
![]() |
![]() |
- Telegram-style chat — unified chat list, grouped bubbles, day separators, event pills, inline images, and link previews
- Infinite scrollback —
draft/chathistorypaging through a bouncer, local-only history on plain networks - Cross-device read state —
draft/read-markersync - Multi-network — several networks over one bouncer connection (
soju.im/bouncer-networks) - Push or persistent socket — UnifiedPush +
soju.im/webpushwith on-device decryption, or a foreground service - Modern composer — nick autocomplete, replies, reactions, typing indicators, and slash commands
- Full-text search — across all history or one buffer, with jump-to-message
- Theming — Material You dynamic color plus curated editor/terminal palettes (Ayu, Gruvbox, Catppuccin, Modus, and more)
- Hardened transport — TLS with SASL PLAIN/EXTERNAL, client certificates, IRCv3 STS pinning, and optional SOCKS5/Tor/VLESS obfuscation
- F-Droid: io.github.trevarj.motd
- GitHub: APKs on the releases page
Both share the same signing key, so either install updates from the other. Requires Android 8.0+ on a 64-bit ARM device (the embedded obfuscation transport is arm64-v8a-only). Push delivery is UnifiedPush — see the ntfy setup guide.
Direct: add a network with host irc.libera.chat, port 6697, TLS on,
and SASL PLAIN with your NickServ credentials (or SASL NONE).
Through a bouncer: point the network at your soju bouncer and authenticate with your bouncer account; motd negotiates capabilities and manages your upstream networks from a single connection. For CLoak, follow the CLoak guide.
For SOCKS5, Tor, or VLESS + REALITY, see the obfuscation guide.
The Nix flake pins the toolchain (JDK 21 + Android SDK); run everything under
nix develop. Quick start:
git submodule update --init --recursive
nix develop -c ./gradlew :app:assembleDebug- Architecture
- Building and testing
- All runbooks — releasing, F-Droid updates, backups
- E2E harness — screenshots regenerate with
nix develop -c ./test/e2e/headless.sh showcase - F-Droid packaging
Questions, bug reports, and feedback: join
#motd on Libera.Chat, or open an
issue.
Copyright 2026 Trevor Arjeski. Licensed under the GNU GPL v3.0 or later. Third-party licensing is recorded in THIRD_PARTY_NOTICES.md.
This project has been developed with assistance from large language models; contributions are reviewed, tested, and maintained by the project maintainer, who remains responsible for the published code and releases.



