Aplicación Kotlin Multiplatform para escanear y gestionar boletos de lotería española usando OCR con inteligencia artificial.
Lotto Scan permite escanear boletos de lotería española con la cámara del dispositivo, extrayendo automáticamente los números mediante OCR (Reconocimiento Óptico de Caracteres) con modelos de IA ejecutados localmente.
- Escaneo OCR - Detección automática de números usando PaddleOCR + ONNX Runtime
- 100% Offline - Los modelos de IA se ejecutan localmente, sin enviar datos a servidores
- Multiplataforma - Android e iOS desde un único código base
- Múltiples loterías - Primitiva, Euromillones, Bonoloto, El Gordo, Lotería Nacional, Quiniela
- Detección inteligente - Extrae serie, fracción, fecha y tipo de sorteo en Lotería Nacional
- Nivel de confianza - Muestra el porcentaje de precisión del OCR
- Edición manual - Permite corregir números si el OCR falla
- Almacenamiento local - Guarda tus boletos con SQLDelight
| Categoría | Tecnología |
|---|---|
| Lenguaje | Kotlin 2.1.0 |
| UI Framework | Compose Multiplatform 1.7.3 |
| Arquitectura | Clean Architecture + MVVM |
| DI | Koin |
| Base de datos | SQLDelight |
| OCR Engine | ONNX Runtime + PaddleOCR |
| Cámara Android | CameraX |
| Cámara iOS | AVFoundation |
| Imágenes | Coil 3 |
| Logging | Napier |
| Testing | kotlin-test, Turbine, coroutines-test |
El proyecto sigue Clean Architecture con patrón MVVM:
shared/src/commonMain/
├── presentation/ # UI Layer
│ ├── screen/ # Compose Screens
│ ├── viewmodel/ # ViewModels con StateFlow
│ ├── component/ # Componentes reutilizables
│ └── theme/ # Temas y estilos
├── domain/ # Business Layer
│ ├── model/ # Entidades de dominio
│ ├── repository/ # Interfaces de repositorio
│ └── usecase/ # Casos de uso
├── data/ # Data Layer
│ ├── repository/ # Implementaciones
│ ├── local/ # SQLDelight DAOs
│ └── mapper/ # Mappers Entity <-> Domain
├── ml/ # Machine Learning
│ ├── OcrProcessor # expect/actual para OCR
│ └── LotteryNumberExtractor
└── di/ # Módulos Koin
UI (Screen) → ViewModel → UseCase → Repository → DataSource
↑
(Flow reactivo para actualizaciones)
| Lotería | Números | Campos adicionales |
|---|---|---|
| Primitiva | 6 números (1-49) | - |
| Euromillones | 5 + 2 estrellas | - |
| Bonoloto | 6 números (1-49) | - |
| El Gordo | 5 + 1 número | - |
| Lotería Nacional | 5 dígitos | Serie, Fracción, Precio, Fecha, Tipo sorteo |
| Quiniela | 15 resultados | - |
- Android: minSdk 24 (Android 7.0+)
- iOS: iOS 15.0+
- JDK: 17+
- Android Studio: Ladybug o superior
- Xcode: 15+ (para iOS)
git clone https://github.com/AlvaroQ/lotto-scan.git
cd lotto-scanexport JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"./gradlew :androidApp:assembleDebugcd iosApp
pod install
open iosApp.xcworkspaceCompilar desde Xcode seleccionando el simulador o dispositivo.
| Comando | Descripción |
|---|---|
./gradlew :androidApp:assembleDebug |
Build Android debug |
./gradlew :androidApp:assembleRelease |
Build Android release |
./gradlew :shared:allTests |
Ejecutar todos los tests |
./gradlew :shared:generateCommonMainLotteryDatabaseInterface |
Generar SQLDelight |
./gradlew clean |
Limpiar proyecto |
cd iosApp && pod install |
Instalar pods iOS |
lotto-scan/
├── androidApp/ # Módulo Android
│ └── src/androidMain/
│ ├── assets/models/ # Modelos ONNX
│ └── res/ # Resources Android
├── iosApp/ # Módulo iOS
│ ├── iosApp/
│ │ └── Resources/models/ # Modelos ONNX
│ ├── Podfile # CocoaPods
│ └── project.yml # XcodeGen
├── shared/ # Código compartido KMP
│ └── src/
│ ├── commonMain/ # Código común
│ ├── androidMain/ # Implementaciones Android
│ ├── iosMain/ # Implementaciones iOS
│ └── commonTest/ # Tests compartidos
├── assets/ # Screenshots para README
├── gradle/ # Gradle wrapper y TOML
└── build.gradle.kts # Build principal
La app utiliza PaddleOCR con ONNX Runtime para el reconocimiento de texto:
| Modelo | Tamaño | Descripción |
|---|---|---|
det.onnx |
~2.5 MB | Detección de regiones de texto |
rec.onnx |
~5 MB | Reconocimiento de caracteres |
dict.txt |
~100 KB | Diccionario de caracteres |
Los modelos se ejecutan 100% localmente en el dispositivo.
# Todos los tests
./gradlew :shared:allTests
# Tests comunes (JVM)
./gradlew :shared:jvmTest
# Tests Android
./gradlew :shared:testDebugUnitTest
# Tests iOS (requiere macOS)
./gradlew :shared:iosSimulatorArm64Test- OCR con PaddleOCR + ONNX
- Soporte Android e iOS
- Detección de múltiples loterías
- Edición manual de boletos
- Almacenamiento local
- Verificación de premios con API
- Notificaciones de sorteos
- Estadísticas de números
- Dark mode mejorado
- Exportar/compartir boletos
MIT License
Copyright (c) 2024 Álvaro Quiroga
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
Álvaro Quiroga - @AlvaroQ
Made with Kotlin Multiplatform

