A Beautiful Kotlin Multiplatform Mobile App showcasing Valorant Agents, Weapons, and Game Data
Features • Screenshots • Tech Stack • Architecture • Accessibility • Getting Started • Testing
Valorant UI is a Kotlin Multiplatform mobile application that brings the world of Valorant to your fingertips! Browse through all Valorant agents, explore their abilities, check out weapon stats, and dive deep into the tactical shooter universe - all with a sleek, modern UI built using Compose Multiplatform.
- 🎯 Agent Gallery - Browse all Valorant agents with beautiful card layouts
- 🔍 Agent Details - Detailed information about each agent including abilities, role, and background
- 🔫 Weapons Showcase - Complete weapon database with stats and skins
- 🎨 Theme Switching - Smooth light/dark mode with wipe animation transition
- 💾 Offline Support - Local caching with SQLDelight for offline access
- 🚀 Smooth Animations - Shared element transitions and fluid animations
- 🌐 Real API Integration - Fetches live data from Valorant API
- 📊 MVI Architecture - Clean, scalable, and testable codebase with unidirectional data flow
- ♿ Fully Accessible - WCAG 2.1 AA & EAA compliant with TalkBack support
| Agents Screen | Weapons Screen | Agent Details | Gun Details |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Full desktop support with native window controls and responsive layouts 💻
Now Available! 🎉
iOS version is fully functional and ready to use!
| Agents (Light) | Agents (Dark) | Agent Details | Gun Details |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Built and tested on Desktop using Codemagic CI/CD 🚀
- Compose Multiplatform - Declarative UI framework
- Material Design 3 - Modern material design components
- Jetpack Compose Navigation - Type-safe multiplatform navigation
- Coil 3 - Image loading with Ktor & OkHttp support
- Lottie - Beautiful animations
- SDP Compose - Scalable size units
- MVI (Model-View-Intent) - Unidirectional data flow with intent-based actions
- Clean Architecture - Separation of concerns across layers
- Repository Pattern - Data abstraction layer
- UseCase Pattern - Business logic isolation
- State Hoisting - Proper state management in Compose
- Koin 4.1.1 - Lightweight DI framework
koin-core- Core DIkoin-android- Android integrationkoin-compose- Compose integration
- Ktor 3.3.1 - Multiplatform HTTP client
ktor-client-core- Core clientktor-client-okhttp- OkHttp engine for Androidktor-client-java- Java engine for Desktopktor-serialization-kotlinx-json- JSON serializationktor-client-content-negotiation- Content negotiationktor-client-logging- Network logging
- SQLDelight 2.1.0 - Type-safe SQL database
sqldelight-android-driver- Android driversqldelight-coroutines-extensions- Coroutines support
- DataStore 1.1.7 - Preferences storage
datastore-preferences- Key-value storagedatastore-core-okio- Multiplatform support
- Kotlinx Coroutines 1.10.2 - Asynchronous programming
- Flow-based reactive streams
- Structured concurrency
- Multiplatform support
- Kotlin Test - Multiplatform testing framework
- Kotlinx Coroutines Test 1.10.2 - Coroutines testing utilities
- Turbine 1.2.1 - Flow testing library
- Compose UI Test - Compose UI testing
- JUnit 4 - Testing framework
- Espresso - Android UI testing
- 54 Tests - Unit, UI, and Integration tests
- Kotlinx Serialization 1.9.0 - JSON serialization/deserialization
- Gradle 8.13.0 - Build system
- Kotlin 2.2.21 - Programming language
- Android Gradle Plugin 8.13.0 - Android build tools
- KSP 2.3.0 - Kotlin Symbol Processing
- Android - Min SDK 24, Target SDK 36 ✅
- iOS - Min iOS 14.1+ ✅
- Desktop - JVM support ✅
- Napier 2.6.1 - Multiplatform logging
- Multiplatform Settings 1.3.0 - Settings management
- Codemagic - iOS build and deployment pipeline
- Automated iOS framework builds
- Simulator testing on cloud
- Cross-platform CI/CD support
┌─────────────────────────────────────────────────────────┐
│ Presentation Layer │
│ ┌─────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ Compose │ │ ViewModels │ │ UI States │ │
│ │ UI │◄─┤ (MVI) │◄─┤ & Intents │ │
│ └─────────────┘ └──────────────┘ └───────────────┘ │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────┐
│ Domain Layer │
│ ┌─────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ Use Cases │ │ Models │ │ Repositories │ │
│ │ (Business │ │ (Entities) │ │ (Interfaces) │ │
│ │ Logic) │ └──────────────┘ └───────────────┘ │
│ └─────────────┘ │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────┐
│ Data Layer │
│ ┌─────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ Repository │ │ Remote API │ │ Local Cache │ │
│ │ Impl │─►│ (Ktor) │ │ (SQLDelight) │ │
│ └─────────────┘ └──────────────┘ └───────────────┘ │
└─────────────────────────────────────────────────────────┘
composeApp/
├── src/
│ ├── commonMain/kotlin/
│ │ ├── data/
│ │ │ ├── remote/ # API service & DTOs
│ │ │ ├── local/ # SQLDelight database
│ │ │ └── repository/ # Repository implementations
│ │ ├── domain/
│ │ │ ├── model/ # Business models
│ │ │ ├── repository/ # Repository interfaces
│ │ │ └── usecase/ # Business logic use cases
│ │ ├── presentation/
│ │ │ ├── viewmodel/ # ViewModels (MVI)
│ │ │ └── uistates/ # UI States & Intents
│ │ ├── ui/
│ │ │ ├── view/ # Compose screens
│ │ │ ├── components/ # Reusable components
│ │ │ ├── theme/ # Theme & styling
│ │ │ └── navigation/ # Navigation setup
│ │ └── di/ # Koin modules
│ │
│ ├── androidMain/kotlin/ # Android-specific code
│ ├── desktopMain/kotlin/ # Desktop-specific code
│ ├── iosMain/kotlin/ # iOS-specific code (Coming soon)
│ │
│ ├── commonTest/kotlin/ # Unit tests
│ │ ├── viewmodel/ # ViewModel tests
│ │ └── repository/ # Repository tests
│ │
│ └── androidInstrumentedTest/ # UI & Integration tests
│ ├── ui/ # Compose UI tests
│ └── integration/ # E2E tests
│
└── build.gradle.kts
- Android Studio Hedgehog (2023.1.1) or newer
- JDK 17 or higher
- Android SDK with API level 36
- Kotlin 2.2.21
- Clone the repository
git clone https://github.com/OmarLkhalil/valorantui.git
cd valorantui-
Open in Android Studio
- Open Android Studio
- Select "Open an Existing Project"
- Navigate to the cloned directory
-
Sync Gradle
./gradlew sync- Run the app
- Select your target device/emulator
- Click the "Run" button or press
Shift + F10
# Build Android APK
./gradlew :app:assembleDebug
# Build Desktop App
./gradlew :composeApp:run
# Build iOS Framework
./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64
# Open iOS project in Xcode
open iosApp/iosApp.xcodeprojThe iOS app was successfully built and tested on Desktop using Codemagic CI/CD platform.
Requirements for iOS development:
- macOS with Xcode installed
- Kotlin Multiplatform Mobile plugin
- CocoaPods (optional)
CI/CD Setup:
- Automated iOS builds via Codemagic
- Simulator testing on cloud infrastructure
- Distribution via App Store Connect (coming soon)
The project includes comprehensive test coverage across all layers:
# Run all unit tests
./gradlew test
# Run Android unit tests
./gradlew :composeApp:testDebugUnitTest
# Run Android UI tests (requires emulator/device)
./gradlew :composeApp:connectedAndroidTest
# Run specific test class
./gradlew :composeApp:testDebugUnitTest --tests "*AgentsViewModelTest"- 27 Unit Tests - ViewModels & Repositories
- 21 UI Tests - Compose UI components
- 6 Integration Tests - End-to-end user flows
- Total: 54 Tests ✅
commonTest/
├── presentation/viewmodel/
│ ├── AgentsViewModelTest.kt (9 tests)
│ └── AgentDetailsViewModelTest.kt (9 tests)
└── domain/repository/
└── AgentsRepositoryTest.kt (9 tests)
androidInstrumentedTest/
├── ui/view/
│ ├── AgentsScreenComposeTest.kt (9 tests)
│ └── AgentDetailsScreenComposeTest.kt (12 tests)
└── integration/
└── AgentsIntegrationTest.kt (6 tests)
This app is built with accessibility in mind and follows WCAG 2.1 Level AA and EAA (European Accessibility Act) guidelines to ensure everyone can use it.
- ✅ WCAG 2.1 Level AA - Web Content Accessibility Guidelines
- ✅ EAA Compliant - European Accessibility Act requirements
- ✅ TalkBack Ready - Full screen reader support for Android
- ✅ Android Accessibility Scanner - Tested and verified
// Every interactive element has proper labels
.semantics {
contentDescription = "Weapon upgrade levels section, 3 levels available"
}- ✅ Clear and descriptive labels for all UI elements
- ✅ Proper heading structure with
heading()semantics - ✅ Logical navigation order
- ✅ Meaningful content descriptions
- ✅ Minimum 48dp touch targets for all interactive elements
- ✅ Adequate spacing between clickable items
- ✅ Easy to tap buttons and cards
// All text uses Theme typography
Text(
text = "Weapon Name",
style = Theme.typography.body16 // Scales with system settings
)- ✅ Supports system font size settings (100% - 300%)
- ✅ No hardcoded font sizes
- ✅ Maintains layout integrity at all scales
- ✅ Minimum 4.5:1 contrast ratio for normal text
- ✅ Minimum 3:1 contrast ratio for large text
- ✅ Works in both Light and Dark themes
- ✅ Theme-based colors ensure consistent contrast
// Icons + Text labels
Row {
Text(text = "🎯") // Icon
Text(text = "Category") // Label
Text(text = "Heavy Weapons") // Value
}- ✅ Information not conveyed by color alone
- ✅ Icons accompany text labels
- ✅ Clear visual hierarchies
// Custom actions for gesture alternatives
customActions = listOf(
CustomAccessibilityAction("Pause auto-rotation") { ... },
CustomAccessibilityAction("Rotate left") { ... },
CustomAccessibilityAction("Rotate right") { ... }
)- ✅ All gestures have accessibility alternatives
- ✅ Custom accessibility actions for complex interactions
- ✅ Keyboard navigation support
- ✅ Proper semantic headings
- ✅ Logical content order
- ✅ Screen reader-friendly navigation
- ✅
mergeDescendantsfor complex components
The app has been tested with:
-
TalkBack (Android Screen Reader)
# Enable TalkBack Settings → Accessibility → TalkBack → On -
Android Accessibility Scanner
- Install from Play Store
- Scan all screens
- Fix issues identified
-
Manual Testing
- Font scaling: 100%, 200%, 300%
- Color contrast verification
- Touch target testing
- Screen reader navigation
| Criterion | Level | Status |
|---|---|---|
| 1.1.1 Non-text Content | A | ✅ |
| 1.3.1 Info and Relationships | A | ✅ |
| 1.4.3 Contrast (Minimum) | AA | ✅ |
| 1.4.4 Resize Text | AA | ✅ |
| 1.4.11 Non-text Contrast | AA | ✅ |
| 2.1.1 Keyboard | A | ✅ |
| 2.4.6 Headings and Labels | AA | ✅ |
| 2.5.5 Target Size | AAA | ✅ |
| 3.2.4 Consistent Identification | AA | ✅ |
| 4.1.2 Name, Role, Value | A | ✅ |
Making apps accessible ensures that everyone, regardless of ability, can:
- Browse and enjoy Valorant content
- Navigate independently with screen readers
- Customize text sizes for comfortable reading
- Use the app with assistive technologies
Accessibility is not optional—it's a fundamental right. ✊
- Grid layout with agent cards
- Beautiful portraits with role indicators
- Smooth shared element transitions
- Pull-to-refresh support
- Offline caching
- Full agent information
- Abilities showcase with icons
- Animated ability descriptions
- Role and background information
- Swipe gestures for navigation
- Complete weapon database
- Weapon stats and damage ranges
- Skin collections
- Interactive 3D preview (Coming soon)
- Filter by category
- Light & Dark mode support
- Smooth wipe transition animation
- Persistent theme preference
- System theme follow option
- Custom color schemes
- Agents listing and details
- Weapons showcase
- Theme switching
- Offline support
- Comprehensive testing
- Full WCAG 2.1 AA Accessibility compliance
- TalkBack and screen reader support
- iOS Support - Full iOS implementation ✅
- Maps information
- Competitive ranks system
- Weapon comparison tool
- Search and filter
- Favorites system
- User authentication
- Match statistics
- Live game updates
- Community features
- Desktop app release
Contributions are welcome! Here's how you can help:
- Fork the project
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Follow Kotlin coding conventions
- Write tests for new features
- Update documentation
- Use meaningful commit messages
- Keep PRs focused and small
This project is licensed under the MIT License - see the LICENSE file for details.
- Valorant API - For providing the awesome API
- Riot Games - For creating Valorant
- Compose Multiplatform - For the amazing UI framework
- JetBrains - For Kotlin and IntelliJ IDEA
Developer - @OmarLkhalil
Email - omarkkhalil12@gmail.com
Project Link - https://github.com/OmarLkhalil/valorantui












