A modern, cross-platform messaging application built with Kotlin Multiplatform and Compose Multiplatform, targeting Android, iOS, and Desktop.
This application is a comprehensive implementation of a cross-platform chat solution, built to demonstrate mastery of Kotlin Multiplatform (KMP) and Compose Multiplatform (CMP).
It implements industry-standard practices including:
-
Kotlin Multiplatform (KMP) architecture for shared business logic.
-
Compose Multiplatform (CMP) for 100% shared UI across platforms.
-
Multi-module Gradle setup following best practices.
-
Offline-first architecture with robust data synchronization.
-
Real-time messaging using WebSockets.
- Features
- Roadmap (Extended Features)
- Backend
- Screenshots
- Tech Stack
- Architecture
- Quick Start
- Documentation
- Contributing
- Acknowledgment
- License
- Changelog
-
๐ Secure Auth โ Registration, Login, and Session Management with auto-refresh.
-
๐ง Email Verification โ Deep linking support for verifying email addresses.
-
๐ Password Recovery โ "Forgot Password" flow via email and deep links.
-
๐ธ Profile Management โ Native photo picking (Android/iOS/Desktop) and image uploads.
-
โก Real-time Chat โ WebSockets for instant message delivery.
-
๐ก Offline-First โ Local database caching (Room/SQLite) allows full app usage without internet.
-
๐ Pagination โ Efficient data loading for chat history and lists.
-
๐ Push Notifications โ Firebase Cloud Messaging (Android/iOS) and local notifications ( Desktop).
-
๐ฑ Cross-platform Sync โ Seamless state synchronization across all 5 platforms.
-
๐ Multilingual โ Full support for English and Arabic (RTL).
-
๐ Theming โ 100% responsive UI with Light and Dark modes.
-
๐ค Dynamic Typography โ Cairo font for Arabic, Plus Jakarta Sans for Latin scripts.
-
๐ฅ๏ธ Desktop Support โ Native Windows, macOS, and Linux apps.
-
๐ฆ Distribution โ Installers via Conveyor.
Having established the core foundation, I am now focused on integrating advanced features to further refine the architecture and tackle complex, real-world engineering challenges.
- Local Data Encryption
- Android: Encrypt data using Android Keystore System
- iOS: Secure storage via Keychain Services
- Desktop: Integration with Windows Credential Manager, macOS Keychain, and Linux Secret Service
- Voice Messages
- Audio recording implementation
- Waveform visualization
- Scrubbing and playback controls
- Background playback support
- Image Attachments
- Multiple image selection (up to 10)
- Automatic compression
- Upload progress indicators
- Full-screen interactive viewer
- Typing Indicators
- Visual cues for single user typing
- "Several people are typing" support
- Smart Verification
- Auto-detection of unverified users during login
- Automatic trigger for verification emails
- Admin Roles
- Group creator assignment as Admin
- Moderation
- Member removal functionality
- Group Management
- Cascade deletion logic (if Admin leaves)
- Warning dialogs for destructive actions
This application is powered by a custom backend service. You can visit the backend repository here: Chirp Backend API
Note: These screenshots showcase key features but do not represent every screen in the application.
Register
|
Register + Success
|
Login (Tablet)
|
Empty Chat
|
Chat List
|
Inside Chat (Desktop)
|
Chat Members (Desktop)
|
| Category | Technology | Version |
|---|---|---|
| Language | Kotlin | 2.2.0 |
| UI Framework | Compose Multiplatform | 1.9.0-beta01 |
| Compose BOM | Jetpack Compose BOM | 2025.07.00 |
| Android Gradle Plugin | AGP | 8.11.1 |
| KSP | Kotlin Symbol Processing | 2.2.0-2.0.2 |
| Category | Library | Purpose |
|---|---|---|
| Dependency Injection | Koin | Multiplatform DI |
| Networking | Ktor Client | REST & WebSockets |
| Database | Room | Local persistence (Offline-first) |
| SQLite | SQLite Bundled | 2.5.2 |
| Preferences | DataStore | Key-value storage |
| Async | Coroutines + Flow | Concurrency |
| Date/Time | kotlinx-datetime | Multiplatform dates |
| Images | Coil 3 | Image loading & Caching |
| Permissions | moko-permissions | Cross-platform permissions |
| Push | Firebase Cloud Messaging | Notifications |
| Tool | Purpose |
|---|---|
| Gradle | Build system with Kotlin DSL |
| Version Catalog | Centralized dependency management |
| Convention Plugins | Reusable build logic in build-logic/ |
| Conveyor | Desktop app packaging |
Chirp follows a multi-module clean architecture with clear separation of concerns:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ composeApp โ
โ (Android + iOS + Desktop entry) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโ
โผ โผ โผ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ feature:auth โ โ feature:chat โ โ core โ
โ โโpresentation โ โ โโpresentation โ โ โโpresentation โ
โ โโdomain โ โ โโdomain โ โ โโdomain โ
โโโโโโโโโโโโโโโโโโโ โ โโdata โ โ โโdata โ
โ โโdatabase โ โ โโdesignsystem โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
Key Principles:
- Unidirectional Data Flow โ State flows down, events flow up
- Repository Pattern โ Abstract data sources behind interfaces
- Dependency Injection โ Koin for multiplatform DI
- Platform Abstraction โ expect/actual for platform-specific code
๐ Learn more: Architecture Documentation
| Requirement | Version | Notes |
|---|---|---|
| JDK | 17 | Required for Gradle |
| Android Studio | Latest | With SDK Platform 36 |
| Xcode | Latest | macOS only, for iOS |
# Clone the repository
git clone https://github.com/IronManYG/Chirp.git
cd Chirp
# Build all modules
.\gradlew.bat build # Windows
./gradlew build # macOS/Linux # Android (debug APK)
.\gradlew.bat :composeApp:assembleDebug
# Desktop
.\gradlew.bat :composeApp:run
# iOS โ Open iosApp in Xcode and run # Compose Multiplatform packaging
.\gradlew.bat :composeApp:packageDistributionForCurrentOS
# Conveyor (cross-platform installers)
conveyor make ๐ Detailed setup: Installation Guide
| Document | Description |
|---|---|
| Installation | Environment setup, IDE configuration, first build |
| Usage | Run, build, and test commands for all platforms |
| Architecture | Module design, DI, navigation, build conventions |
| Project Structure | Module breakdown, directory layout, entry points |
| Configuration | BuildKonfig, Firebase, Room schemas, signing |
| Testing | Test commands, source locations, best practices |
| Internationalization | i18n, RTL support, typography, adding locales |
| Deep Links & Auth | Auth flows, deep link routing, diagrams |
| Notifications | FCM setup for Android and iOS |
| Contributing | Contribution guidelines, code style, PR process |
We welcome contributions! Please read our Contributing Guide before submitting a PR.
# Before opening a PR
.\gradlew.bat build # Build all
.\gradlew.bat test # Run tests
.\gradlew.bat :composeApp:lint # Lint check This project was built as part of the CMP Android & iOS Course by Philipp Lackner, created in collaboration with JetBrains.
Special thanks to Philipp Lackner and JetBrains for the comprehensive curriculum and resources.
Thank you for checking out Chirp!
If you have any questions or suggestions, feel free to open an issue or reach out to the maintainer. Happy coding!
This project is licensed under the MIT License.
Note: A
LICENSEfile should be added to the repository root.
See CHANGELOG.md for a detailed history of changes.
Built with โค๏ธ using Kotlin Multiplatform and Compose Multiplatform









