Android client for RCQ — privacy-first messenger with 9-digit IDs, no phone, no email, end-to-end encrypted by default.
Status: Pre-alpha, active development Build: ✅ GREEN (
assembleDebugpassing) DB: v13 | Branch:phase-1-core-messaging| Date: 2026-05-31
| Milestone | Focus | Status | Date |
|---|---|---|---|
| Phase 0 | Critical bug fixes | ✅ DONE | 2026-05-25 |
| Phase 1 | Core messaging + E2EE | ✅ DONE | 2026-05-26 |
| Build fix | 123 compile errors | ✅ DONE | 2026-05-28 |
| Phase 1 audit | WS fixes, runtime bugs | ✅ DONE | 2026-05-29 |
| Phase 2 | Delivery states, typing, reactions, search | ✅ DONE | 2026-05-30 |
| Stealth | ProxyManager, SingBox, PanicPIN | ✅ DONE | 2026-05-30 |
| JIMM UI | Retro JIMM/QIP visual redesign (~46%) | 🔄 ACTIVE | 2026-05-31 |
| Bug sprint | DMs, dark mode, timeouts, groups, navbar | ✅ DONE | 2026-05-31 |
| Next | JIMM P5 sounds, P7 emoticons, statusMessage | 📋 NEXT | — |
DB version: 13 · Functional progress: ~75%
| Commit | What changed |
|---|---|
084a836 |
Navbar hidden under gesture nav buttons → navigationBarsPadding(); all groups now show (removed broken memberIds filter) |
933c602 |
Startup splash: 8-petal ICQ flower + connection probe, auto-enables bypass if server unreachable |
0333e30 |
HTTP timeout 60s→10s; dark mode persisted to DataStore; incoming DMs: TOFU no longer drops silently, fallback placeholder; JIMM toggle restored |
0b65680 |
Full JIMM/QIP redesign: flat 50dp NavBar, compact typography, status-dot list items |
763a718 |
JIMM retro mode, status-grouped contacts, group server-side search with debounce |
699c8aa |
Stealth: BypassMode AUTO/MANUAL/OFF, sing-box persistence across restarts |
Stack: Kotlin + Jetpack Compose · Hilt DI · Room DB v9 · libsignal-android 0.33.0 · OkHttp WebSocket · Retrofit · Kotlinx Serialization · WebRTC
crypto/ Signal Protocol E2EE (Double Ratchet, X3DH, PersistentSignalProtocolStore)
data/
api/ Retrofit service + DTOs
db/ Room v9 (users, contacts, chats, messages, groups, stories, calls, pets, signal_keys)
ws/ WebSocketManager — exponential backoff, 40+ typed events
repository/ UserRepository, ChatRepository, GroupRepository, StoryRepository, ...
di/ Hilt AppModule
ui/
auth/ WelcomeScreen, AccountRecoveryScreen
chat/ ChatScreen, ChatsScreen + components (MediaMessageBubble, ReplyPreview)
contacts/ ContactsScreen, AddContactScreen, CreateGroupScreen
calls/ CallScreen, CallsScreen
stories/ StoriesScreen, StoryViewerScreen
profile/ ProfileScreen
settings/ SettingsScreen
games/ GamesScreen
market/ MarketplaceScreen
audio/ AudioRoomsScreen
| Migration | Change |
|---|---|
| v6→v7 | E2EE fields on messages (ciphertext, signalType, isEncrypted) |
| v7→v8 | signal_keys table for persistent Signal Protocol storage |
| v8→v9 | Phase 1 fields on messages (kind, mediaId, reactions, etc.), profile fields on contacts, new chats schema, pets recreated with game fields |
export ANDROID_HOME=/opt/android-sdk
./gradlew assembleDebug # debug APK
./gradlew compileDebugKotlin # Kotlin only (fast check)
./gradlew kspDebugKotlin # Room/Hilt annotation processing
./gradlew test # unit testsAll messages use Signal Protocol (Double Ratchet + X3DH) via libsignal-android:0.33.0, fully compatible with the iOS RCQ client. Keys are persisted in Room via PersistentSignalProtocolStore. Sessions survive app restarts.
Security issues → security@rcq.app (disclose responsibly before filing a public issue).
| File | Content |
|---|---|
docs/RCQ_API_SPEC.md |
Complete API specification |
PHASE_1_PLAN.md |
Phase 1 E2EE plan |
DIAGNOSIS.md |
Known runtime issues |
TODO.md |
Feature checklist |
MIGRATION_PLAN.md |
Full roadmap |
License: GNU AGPL-3.0 · See NOTICE for third-party attributions.