Convos is an everyday private chat app for the surveillance age. Built on the open-source, censorship-resistant, post-quantum secure XMTP protocol.
🚧 This is an active conversion from iOS to Android. See CONVERSION_PROGRESS.md and ANDROID_CONVERSION_TODO.md for details.
Current Status: ~20% complete
- ✅ Project structure and build system
- ✅ Database layer (Room)
- ✅ Domain models
- 🚧 Business logic and repositories
- ⏳ UI implementation
- ⏳ XMTP integration
- Android Studio Ladybug | 2024.2.1 or newer
- JDK 17+
- Android SDK with:
- Minimum SDK: 26 (Android 8.0)
- Target SDK: 35 (Android 15)
- Compile SDK: 35
convos-android/
├── app/ # Android app module
│ ├── src/
│ │ ├── main/
│ │ │ ├── kotlin/ # App-level Kotlin code (UI, ViewModels)
│ │ │ ├── res/ # Android resources
│ │ │ └── assets/ # Config files
│ │ └── ...
│ └── build.gradle.kts
├── core/ # Core business logic module
│ ├── src/
│ │ ├── main/kotlin/ # Core logic, database, domain models
│ │ └── test/ # Unit tests
│ └── build.gradle.kts
├── gradle/
│ └── libs.versions.toml # Version catalog for dependencies
├── build.gradle.kts # Root build file
└── settings.gradle.kts # Gradle settings
cd /path/to/convos-android
# Open in Android StudioAndroid Studio will automatically prompt you to sync Gradle. Click "Sync Now" or run:
./gradlew buildThe project has 3 flavors × 2 build types = 6 variants:
Flavors (Environments):
local- Local development (localhost API)dev- Development serverprod- Production
Build Types:
debug- Debug build with loggingrelease- Release build with ProGuard
Example variants:
localDebugdevDebugprodRelease
In Android Studio:
- View → Tool Windows → Build Variants
- Select your desired variant (e.g.,
localDebug)
Click the Run button (
# Run local debug variant
./gradlew installLocalDebug
# Run on specific device
adb devices # List devices
./gradlew installLocalDebug
adb shell am start -n com.convos.android.local/.MainActivityConfiguration is managed through JSON files in app/src/main/assets/:
config.local.json- Local environmentconfig.dev.json- Dev environmentconfig.prod.json- Production environment
Each flavor automatically loads its corresponding config file.
- Language: Kotlin
- UI: Jetpack Compose + Material 3
- Database: Room (SQLite with WAL mode)
- Networking: Retrofit + OkHttp
- Async: Kotlin Coroutines + Flow
- Image Loading: Coil 3
- Serialization: kotlinx.serialization
- Logging: Timber
- XMTP: XMTP Android SDK (to be integrated)
app module:
- UI layer (Jetpack Compose screens)
- ViewModels
- Navigation
- Dependency injection setup
core module:
- Domain models (Conversation, Message, Inbox, etc.)
- Database layer (Room entities, DAOs, database)
- Business logic (repositories, use cases)
- XMTP client integration
- API client
- Utilities and extensions
The app uses Room with:
- Write-Ahead Logging (WAL) for concurrent access
- Type converters for custom types (enums, dates, JSON)
- Foreign key constraints
- Indexes for performance
Main entities:
DBConversationEntity- ConversationsDBMessageEntity- MessagesDBInboxEntity- User inboxesDBConversationMemberEntity- Conversation memberships (junction table)
- ViewModels - Hold UI state and business logic
- StateFlow - Reactive state updates
- Flow - Reactive data streams from database
- Coroutines - Asynchronous operations
The project follows Kotlin coding conventions:
- Use
camelCasefor variables and functions - Use
PascalCasefor classes - Use
SCREAMING_SNAKE_CASEfor constants - Prefer immutability (
valovervar) - Use data classes for models
- Prefer sealed classes/interfaces for polymorphism
# Run unit tests
./gradlew test
# Run instrumented tests (requires device/emulator)
./gradlew connectedAndroidTest
# Run specific module tests
./gradlew :core:test- Logcat: View → Tool Windows → Logcat
- Database Inspector: View → Tool Windows → App Inspection → Database Inspector
- Layout Inspector: Tools → Layout Inspector
# Clean build
./gradlew clean
# Build release APK
./gradlew assembleRelease
# Build release AAB (for Play Store)
./gradlew bundleRelease
# Check dependencies
./gradlew dependencies
# Check for outdated dependencies
./gradlew dependencyUpdatesEach flavor requires its own google-services.json:
- Download from Firebase Console for each environment
- Place in appropriate flavor directory:
app/src/local/google-services.jsonapp/src/dev/google-services.jsonapp/src/prod/google-services.json
This project is currently in active development during the iOS-to-Android conversion. Please coordinate with the team before making major changes.
libs.versions.toml- Dependency versionsConvosDatabase.kt- Database schemaConvosApplication.kt- Application initializationMainActivity.kt- Main entry point
./gradlew clean
# File → Invalidate Caches... → Invalidate and Restart# Uninstall app to clear database
adb uninstall com.convos.android.local
# Or clear app data manually in device settings- Ensure JDK 17+ is selected (File → Project Structure → SDK Location)
- Check
local.propertieshas correct SDK path - Sync Gradle files
- Clean and rebuild
- Android Developer Documentation
- Jetpack Compose
- Kotlin Documentation
- Room Database
- XMTP Documentation
See LICENSE file for details.