Adventure Log is a cross-platform travel journal application built with Kotlin Multiplatform Mobile (KMM) and Compose Multiplatform. The app allows users to document their journeys, organize adventures by collections, and explore their memories through rich visual interfaces.
- Cross-Platform Experience: Share code between Android & iOS with Kotlin Multiplatform
- Rich Adventure Management: Track locations, add notes, photos, and categorize your adventures
- Beautiful UI: Modern Material 3 design with fluid animations and transitions
- Offline Support: Access your adventures even without network connectivity
- Dark Mode: Comfortable viewing experience in all lighting conditions
- Modular Navigation: Feature-based navigation system for scalable routing
Adventure Log implements a Clean Architecture approach combined with modular design principles, creating a codebase that is maintainable, testable, and scalable.
- Separation of Concerns: Each layer has its distinct responsibility
- Dependency Rule: Dependencies point inward, with inner layers knowing nothing about outer layers
- Testability: Business logic isolated from UI and external frameworks
- Modularity: Feature-based modules with clear boundaries
AdventureLog/
βββ composeApp/ # Main application entry point
β
βββ core/ # Shared core modules
β βββ common/ # Common utilities, extensions, base classes
β βββ data/ # Data layer implementation
β βββ designsystem/ # Design system components and theming
β βββ domain/ # Business logic and use cases
β βββ model/ # Domain models
β βββ network/ # Network communication
β βββ permissions/ # Permission handling
β
βββ feature/ # Feature modules
βββ adventures/ # Adventure listing and management
βββ collections/ # Collections management and organization
βββ detail/ # Adventure details
βββ home/ # Home screen and dashboard
βββ login/ # Authentication
βββ settings/ # Application settings
βββ ui/ # Shared UI components and utilities
-
Presentation Layer (UI)
- Compose UI components
- ViewModels with UI State
- Screen navigation
-
Domain Layer
- Use Cases
- Domain Models
- Repository Interfaces
-
Data Layer
- Repository Implementations
- Remote/Local Data Sources
- Data Models & Mappers
- Code Sharing Strategy:
- shared: Business logic, data management, view models
- platform-specific: Native UI elements, platform integrations
-
UI Framework
- Compose Multiplatform: UI toolkit for Android and iOS
- Material 3: Latest Material Design components and theming
- Coil: Image loading library with Compose integration
-
Architecture & Navigation
- Compose Navigation: Jetpack navigation for Compose
- Lifecycle Components: ViewModel and lifecycle-aware components
-
Dependency Injection
- Koin: Pragmatic lightweight dependency injection for Kotlin
-
Async & Reactive
- Kotlin Coroutines: Asynchronous programming
- Kotlin Flow: Reactive streams built on coroutines
-
Networking
- Ktor: Kotlin multiplatform HTTP client
-
Development Tools
- Compose Hot Reload: Rapid UI development
Adventure Log implements a sophisticated modular navigation system that:
- Centralizes Route Definitions: Avoiding circular dependencies
- Modularizes Feature Navigation: Each feature manages its own routes
- Supports Deep Linking: Parameter-based navigation between features
The navigation system is organized to provide clear separation between features while maintaining the ability to navigate seamlessly throughout the application.
The application uses Koin for dependency injection with a modular approach:
- App Module: Coordinates the inclusion of all feature modules
- Feature Modules: Each feature has its own DI module
- Core Modules: Provide shared dependencies across features
This approach promotes modularity while ensuring proper dependency management across the application.
Adventure Log implements a unidirectional data flow pattern:
- UI Events: Captured by Composables and passed to ViewModels
- State Updates: Processed by ViewModels and exposed as StateFlow
- UI Rendering: Based on current state
The app uses sealed classes to represent different UI states, providing type-safe state management throughout the application.
- Android Studio Hedgehog or newer
- Xcode 14 or newer (for iOS development)
- JDK 11+
- Kotlin 1.9.0+
-
Clone the repository
git clone https://github.com/DesarrolloAntonio/AdventureLog-Client.git cd AdventureLog-Client
-
Open in Android Studio and sync the project
-
Run the
composeApp
configuration on an Android device or emulator
-
Generate the Kotlin framework
./gradlew :composeApp:embedAndSignAppleFrameworkForXcode
-
Open the Xcode project in the
iosApp
directoryopen iosApp/iosApp.xcodeproj
-
Build and run on an iOS device or simulator
The project uses a typical KMM setup with Gradle, supporting:
- Android target configuration
- iOS target configuration (arm64, simulatorArm64)
- Shared dependencies in commonMain
- Platform-specific dependencies in respective sourcesets
- Feature Isolation: Each feature module works independently
- API Boundaries: Clean interfaces between modules
- Shared Resources: Common components live in core modules
- Deep Linking: Direct navigation to content via parameters
- Back Stack Management: Proper handling of navigation history
- Nested Navigation: Complex navigation flows within features
- 90%+ Shared Code: Most business logic and UI shared across platforms
- Platform-Specific Adapters: Native functionality wrapped in platform modules
- Expect/Actual Pattern: For platform-specific implementations
Track our development progress and upcoming features on our GitHub Project Board.
- Unit Tests:Test individual components and business logic (Coming)
- Integration Tests: Verify interactions between components (Coming)
- UI Tests: Test user interfaces and workflows (Coming)
- Feature Development: New features start in their own modules
- Core Enhancements: Core module changes consider all dependent features
- Navigation Updates: Navigation changes require careful consideration of deep links
- Kotlin Multiplatform Official Documentation
- Compose Multiplatform Getting Started
- Clean Architecture by Robert C. Martin
- Koin Documentation
This project is licensed under the MIT License - see the LICENSE file for details.
- DesarrolloAntonio - Project Lead
- Contributors welcome!
Built with β€οΈ using Kotlin Multiplatform & Compose