How javier-abraham/appuntes works
AppUntes is a single Android app module built in Kotlin with Jetpack Compose, Material 3, Room, Navigation Compose, WorkManager, Retrofit/Gson, and a likely DataStore-backed onboarding flow. The architecture is classic MVVM with a repository boundary between UI and data sources.
The app entry points are AppUntesApplication and MainActivity. MainActivity is the Compose host, while core/navigation/NavGraph.kt and Screen.kt centralize route definitions and screen wiring. This is the main structural boundary for how users move through the app.
The presentation layer lives under presentation/ and is split by feature: home, materias, tareas, calendario, perfil, and onboarding. Each feature screen is a Compose UI, and the stateful screens rely on dedicated ViewModels such as HomeViewModel, MateriasViewModel, and TareasViewModel.
Domain objects are kept separate from persistence entities in domain/model/. Materia and Tarea represent the app’s core business data at the UI/domain boundary, while the data layer uses Room entities under data/local/entity/. This separation suggests mapping between “clean” models and database schema.
Local storage is handled by Room in data/local/. AppDatabase is the database container, and MateriaDao / TareaDao are the access points for CRUD and query operations. This is the primary source of truth for academic data on-device.
The repository layer in data/repository/ (MateriaRepository, TareaRepository) sits between ViewModels and the data sources. In practice, this is where the app likely decides whether to read/write local Room data and, if needed, coordinate synchronization or business rules before state reaches the UI.
There is also a remote/data-sync side under data/remote/. RetrofitInstance, ApiService, SupabaseConfig, and SupabaseRepository indicate a network integration path built around Retrofit and a Supabase backend. This is the repo’s external service boundary, even though the exact endpoints aren’t shown in the tree.
The app’s feature set implies two important data flows: first, user interactions in Compose screens update ViewModels, which call repositories, which then persist through Room; second, remote-backed operations go through Retrofit/Supabase classes before being reflected back into the local/UI state.
Cross-cutting app behavior is isolated in core/util/NotificationHelper.kt, which likely supports the automatic reminders described in the README and is the main hook for user-facing notifications. This is the most visible non-UI background service in the codebase.
The onboarding experience is a separate presentation module, and the README mentions DataStore for first-run state. Even though the DataStore files are not visible in the tree, onboarding is clearly treated as a distinct startup concern rather than a normal feature screen.
Theme support exists in two places: presentation/theme/ and ui/theme/. That duplication suggests either a migration path or legacy packaging, and it matters for architecture diagrams because theming is not centralized in a single package.
Resource-wise, the app is a standard Android application with launcher assets, values, and XML support files. The presence of file_paths.xml and backup/data extraction XML hints at platform features around file sharing and Android backup behavior, but these are supporting concerns rather than primary subsystems.
Testing is split into JVM unit tests and Android instrumented tests under src/test and src/androidTest. The repo includes ViewModelTests.kt, which aligns with the MVVM boundary by testing presentation logic separately from the Android runtime.
Main entry points: NavGraph.kt Nav graph · TareaRepository.kt Tarea repo · MateriaRepository.kt Materia repo · AppDatabase.kt Room DB
Components 20
App shell
Android entry points and top-level runtime wiring.
- App class · Initializes app-wide state and services.
app/src/main/java/com/appuntes/AppUntesApplication.kt - Main activity · Launch activity that hosts the UI.
app/src/main/java/com/appuntes/MainActivity.kt
Core
Shared navigation and utilities.
- Nav graph · Central route wiring for feature screens.
app/src/main/java/com/appuntes/core/navigation/NavGraph.kt - Screen routes · Shared navigation destinations and labels.
app/src/main/java/com/appuntes/core/navigation/Screen.kt - Notifications · Notification and reminder support.
app/src/main/java/com/appuntes/core/util/NotificationHelper.kt
Presentation
Compose screens and feature ViewModels.
- Home VM · State and actions for the home screen.
app/src/main/java/com/appuntes/presentation/home/HomeViewModel.kt - Home screen · Primary landing screen.
app/src/main/java/com/appuntes/presentation/home/HomeScreen.kt - Materias VM · State and actions for subjects.
app/src/main/java/com/appuntes/presentation/materias/MateriasViewModel.kt - Materias UI · List, create, and detail subject screens.
app/src/main/java/com/appuntes/presentation/materias/MateriasScreen.kt - Tareas VM · State and actions for tasks.
app/src/main/java/com/appuntes/presentation/tareas/TareasViewModel.kt - Tareas UI · Task list and creation screens.
app/src/main/java/com/appuntes/presentation/tareas/TareasScreen.kt - Calendar · Calendar-focused feature screen.
app/src/main/java/com/appuntes/presentation/calendario/CalendarioScreen.kt - Profile · User profile and app settings screen.
app/src/main/java/com/appuntes/presentation/perfil/PerfilScreen.kt - Onboarding · First-run introduction and setup.
app/src/main/java/com/appuntes/presentation/onboarding/OnboardingScreen.kt
Data
Local, remote, and repository boundaries.
- Materia repo · Coordinates subject data access and rules.
app/src/main/java/com/appuntes/data/repository/MateriaRepository.kt - Tarea repo · Coordinates task data access and rules.
app/src/main/java/com/appuntes/data/repository/TareaRepository.kt - Room DB · Local source of truth for app data.
app/src/main/java/com/appuntes/data/local/AppDatabase.kt - Remote API · Network boundary for backend sync.
app/src/main/java/com/appuntes/data/remote/ApiService.kt
Connections 23
- App class → Main activity: launches · Application boots the Compose entry activity.
- Main activity → Nav graph: hosts · Activity sets up navigation and screen content.
- Nav graph → Screen routes: uses · Navigation is driven by shared route definitions.
- Nav graph → Home screen: navigates to · Routes to the home feature.
- Nav graph → Materias UI: navigates to · Routes to subject management screens.
- Nav graph → Tareas UI: navigates to · Routes to task management screens.
- Nav graph → Calendar: navigates to · Routes to calendar screen.
- Nav graph → Profile: navigates to · Routes to profile screen.
- Nav graph → Onboarding: navigates to · Routes to first-run onboarding.
- Home screen → Home VM: binds · Home UI observes and updates ViewModel state.
- Materias UI → Materias VM: binds · Subject UI observes and updates ViewModel state.
- Tareas UI → Tareas VM: binds · Task UI observes and updates ViewModel state.
- Home VM → Materia repo: reads · Home aggregates data through repositories.
- Home VM → Tarea repo: reads · Home aggregates data through repositories.
- Materias VM → Materia repo: manages · Subject operations flow through repository boundary.
- Tareas VM → Tarea repo: manages · Task operations flow through repository boundary.
- Materia repo → Room DB: persists · Subject data is stored in Room.
- Tarea repo → Room DB: persists · Task data is stored in Room.
- Materia repo → Remote API: syncs · Subject repository can coordinate backend operations.
- Tarea repo → Remote API: syncs · Task repository can coordinate backend operations.
- Room DB → Materia: maps to · Room entities are mapped to domain models.
- Room DB → Tarea: maps to · Room entities are mapped to domain models.
- Notifications → Tarea repo: uses · Notifications are likely driven by task data.