v1tzor/StudyAssistant
73.8
Strong · 21 September 2026
141.7k
lines of production code
Kotlin
primary language
4
measurements over time
What this system is
StudyAssistant is a cross-platform mobile application for Android and iOS, built with Kotlin Multiplatform, that helps students manage their academic schedules, homework, and daily goals. It features an integrated AI assistant for chat and schedule extraction, alongside a system for sharing schedules and homework with peers. The app supports offline-first data persistence via SQLDelight, reliable background reminders, and monetization through ad-based rewards that grant AI usage quotas.
How it got here
2024 — Initial scaffolding and multi-platform foundation
50 changes.
The project was initialized with core documentation and build configurations, establishing a Kotlin Multiplatform architecture using Decompose, SQLDelight, and Ktor. Significant effort focused on implementing platform-specific networking, database persistence, and dependency injection for both Android and iOS, while introducing foundational features like scheduling, user profiles, and analytics.
2025–2026 — AI assistant and backend infrastructure
32 changes.
This period focused on building the AI Assistant feature, including local database schema migrations, chat history persistence, and quota management. It also involved establishing a new Ktor-based backend with Docker deployment, security hardening, and API endpoints for AI completions, schedule extraction, and ad rewards. Significant effort was dedicated to cross-platform reliability, such as Android WorkManager integration, iOS predictive back gestures, and comprehensive test coverage for both client and server components.
Features
AI Assistant feature scaffolding and localization
This change introduces the structural foundation for the AI Assistant feature within the chat module. It adds the necessary API contracts (ChatContentProviderFactory, ChatDecomposeFeatureFactory, and ChatFeatureContract) to define the feature's configuration and navigation outputs. The implementation layer includes dependency injection setup via Kodein, wiring up domain services like AiAssistantRepository, AdRewardRepository, and various schedule/todo repositories, along with presentation modules for the assistant's UI state. Additionally, it provides the full set of user-facing strings in English, Russian, Belarusian, Kazakh, and Chinese, covering assistant interactions, quota management, and confirmation dialogs for AI-suggested changes.
shared/features/chat · high confidence
Add SQL schema and queries for base and custom schedules
The database layer now supports persistent storage for two distinct schedule types: recurring base schedules and one-off custom schedules. New SQLDelight definitions introduce the \baseScheduleEntity\ table, which stores recurring patterns defined by week, day of week, and valid date ranges, along with queries to fetch schedules by ID, specific dates, or time ranges. Additionally, the \customScheduleEntity\ table is added to store individual custom schedule entries by date, with corresponding queries for retrieval and deletion. These changes enable the application to manage and query both recurring and ad-hoc schedule data locally.
shared/core/database/src/commonMain/sqldelight/ru/aleshin/studyassistant/sqldelight/schedules · high confidence
Add local database schema for application settings
The app now persists user preferences locally using SQLDelight, introducing four new tables: general settings (theme, language, setup status), calendar settings (week view type, holidays), notification settings (class start/end times, exceptions), and analytics settings (reporting period). This change enables offline-first storage for configuration data, ensuring settings are available without network connectivity.
shared/core/database/src/commonMain/sqldelight/ru/aleshin/studyassistant/sqldelight/settings · high confidence
Added database models and mappers for AI chat history
The application now includes the necessary data structures and mapping logic to persist and retrieve AI chat interactions locally. New model classes (AiChatEntity, AiChatHistoryEntityDetails) and a mapper (AiChatLocalMapper) have been added to the shared database layer, enabling the storage of chat sessions and their associated messages for the AI assistant feature.
shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/mappers/ai, shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/models/ai · high confidence
Added database schema and queries for Employee and Subject entities
The application now supports persistent storage for employee and subject data. New SQL definitions introduce the \employeeEntity\ table, which stores detailed employee profiles including contact information (emails, phones, locations, websites) and work hours, along with queries to fetch employees by organization or ID. Additionally, the \subjectEntity\ table is introduced to manage academic subjects, storing details such as name, teacher assignment, office location, and color coding, with corresponding queries to retrieve subjects by organization, teacher, or name.
shared/core/database/src/commonMain/sqldelight/ru/aleshin/studyassistant/sqldelight/subjects · high confidence
Added error mappers for AI and sharing backend responses
New mapper functions have been introduced in the remote layer to translate backend API errors into specific domain exceptions. The \BackendAiErrorMapper\ converts HTTP status codes and JSON error bodies (such as quota exceeded, rate limits, and invalid requests) into corresponding \AiServiceException\ types. Similarly, the \BackendShareErrorMapper\ maps sharing-related backend errors (like invalid, expired, claimed, or consumed codes) to specific \ShareException\ variants, ensuring that users receive precise error feedback for AI service and sharing failures.
shared/core/remote/src/commonMain/kotlin/ru/aleshin/studyassistant/core/remote/mappers · high confidence
Added local database schema for AI chat history, messages, and settings
The application now persists AI assistant interactions locally using new SQLDelight schema definitions. This includes tables for chat history (AiChatHistoryEntity) and individual messages (AiChatMessageEntity) with support for CRUD operations, as well as an AI settings table (AiSettingsEntity) that initializes default quota limits and reset tracking. This change enables the app to store and retrieve chat sessions and manage AI usage quotas on the device.
shared/core/database/src/commonMain/sqldelight/ru/aleshin/studyassistant/sqldelight/ai · high confidence
Added organization data mapping logic
A new mapper file has been introduced to handle the conversion between the application's internal domain models for organizations (such as BaseOrganizationEntity, OrganizationDetailsEntity, and OrganizationShortEntity) and the underlying SQLDelight database entities. This change enables the persistence and retrieval of organization details, including contact information, locations, and schedule intervals, by serializing complex types like lists and JSON strings into the database format.
shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/mappers/organizations · high confidence
Added profile data mapping between local and SQL entities
A new mapper file (ProfileLocalMapper.kt) has been introduced in the user database mappers module to handle the conversion between the local domain model (ProfileEntity) and the SQLDelight-generated entity (ProfileSqlEntity). This enables the application to correctly persist and retrieve user profile details such as username, avatar, city, birthday, and sex.
shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/mappers/user · high confidence
Added support for rescheduling notifications and sharing homework/schedule data
The app now includes a new Android broadcast receiver that automatically reschedules notifications when the device boots, the package is replaced, or system time/date/timezone settings change. Additionally, new data mappers have been introduced to enable sharing of homework assignments and class schedules, allowing users to convert these entities into a format suitable for remote transmission and back.
shared/core/data/src/androidMain/kotlin/ru/aleshin/studyassistant/core/data/messages, shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/mappers/share · high confidence
Android app now supports Huawei and RuStore store flavors with platform-specific services
The Android app now builds for Huawei and RuStore store flavors, each with its own application entry point and service implementations. The Huawei flavor uses a generic review service, while the RuStore flavor integrates the RuStore SDK for in-app reviews. Both flavors use AppMetrica for analytics and a custom Tracer-based crash reporting system. The main app module has been updated to handle deep links, request notification permissions on Android 13+, and register broadcast receivers for boot completion and alarm scheduling. The application class now sets up notification channels and strict mode checks.
androidApp/src · high confidence
Android background reminder workers for classes, homework, and workload
The app now uses Android WorkManager to reliably schedule and deliver notifications for class start/end times, upcoming homework, and high workload warnings, even when the app is not in the foreground. New workers in the data layer (EndClassesReminderWorker, HomeworksReminderWorker, StartClassesReminderWorker, WorkloadWarningWorker) fetch schedule and task data, apply calendar settings and holiday exceptions, and push notifications via NotificationScheduler/NotificationCreator. A NotificationRescheduleWorker coordinates these services based on user notification settings, starting or stopping each reminder type as configured. This ensures reminders are delivered consistently on Android without relying on the app being active.
shared/core/data/src/androidMain/kotlin/ru/aleshin/studyassistant/core/data/workers · high confidence
Android-specific dependency injection for reminders and notifications
The Android data layer now includes a dedicated platform module that registers Android-specific services for the reminder and notification system. This module binds WorkManager and AlarmManager as singletons and provides implementations for workload warnings, homework, start/end class, and general notification scheduling, enabling the app to schedule and manage local reminders on Android devices.
shared/core/data/src/androidMain/kotlin/ru/aleshin/studyassistant/core/data/di · high confidence
Employee profile screen added with adaptive layout and localization
The Users feature now includes a new Employee Profile screen that displays employee details such as post, work schedule, birthday, subjects, and contact information. The implementation supports adaptive layouts, switching between compact and expanded modes based on window size, and includes full localization for English, Russian, Belarusian, Kazakh, and Chinese. Navigation is supported to an employee editor and back, with error handling for network issues and other failures.
shared/features/users · high confidence
Initial Android home screen widgets for schedule, homeworks, todos, and goals
This change introduces the Android widget module, registering four new home screen widgets (Schedule, Homeworks, Todos, Goals) via the AndroidManifest and wiring their dependencies through Kodein DI. It provides the full presentation layer for these widgets, including Glance-based action callbacks for completing todos and refreshing data, a state codec for persisting widget state with versioning, UI mappers that convert domain entities into widget-specific models, and a theming system that supports dynamic colors on Android 12+ and respects the app's light/dark mode settings.
widget · high confidence
Initial Ktor backend configuration and logging setup
The backend now includes its primary configuration file (application.conf) and logging setup (logback.xml). The application is configured to run on port 8080 (overridable via PORT) with specific thread pool sizes for connections, workers, and calls. Database connectivity is defined via environment variables (DATABASE\_URL, DATABASE\_USER, DATABASE\_PASSWORD) with a connection pool size of 5 and specific timeout settings. Security settings for HMAC secrets and payload encryption are exposed as environment variables. The system enforces rate limits for user registration (10 per network per day, 1000 global) and sharing features (e.g., 20 items per share, 24-hour homework lifetime). AI integration is configured for OpenRouter and DeepSeek, including API key injection, token limits (e.g., 16384 for OpenRouter), and timeout/retry policies. OpenRouter requests are routed through a SOCKS proxy (default 127.0.0.1:10808). Logging is set to INFO level for the root logger and WARN for Netty and Exposed, outputting structured logs to stdout.
backend/ktor/src/main/resources · high confidence
Initial Ktor backend deployment infrastructure
This change introduces the foundational deployment configuration for the Ktor-based backend service. It includes a multi-stage Dockerfile using Eclipse Temurin 17, Docker Compose files for local development, staging, and production environments, and environment variable examples for configuring database connections, secrets, and AI provider integrations (DeepSeek, OpenRouter). Additionally, it adds a PostgreSQL initialization script to set up specific database roles and permissions, along with Gradle wrapper files and dependency verification metadata to ensure reproducible builds.
backend/ktor · high confidence
Introduce preview feature scaffolding and assets
The preview feature module now includes its core API contracts and initial UI assets. This change adds the \PreviewContentProviderFactory\ and \PreviewDecomposeFeatureFactory\ interfaces to define how the feature integrates with the app's dependency injection and navigation systems, along with a \PreviewFeatureContract\ that specifies the \Intro\ and \Setup\ configuration states and navigation outputs. Additionally, it introduces the initial drawable resources, including a schedule illustration (\il\_schedule.xml\) and a textbox icon (\ic\_textbox.xml\), to support the feature's visual presentation.
shared/features/preview · high confidence
Introduces new database entity models and mappers for employees, schedules, and subjects
The database layer now includes new data classes and mapping logic to support employee, schedule, and subject data structures. Specifically, it adds \EmployeeLocalMapper\ for converting between local and SQLDelight employee entities, defines base and custom schedule entities (including details) to handle recurring and one-off class schedules, and establishes base and detailed subject entities that link to teachers and contact information. These changes provide the underlying data models required for the application's core scheduling and organizational features.
shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/mappers/employee, shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/models/schedule, shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/models/subjects · high confidence
Introduction of Ktor-based remote networking layer
The application now utilizes a new Ktor HTTP client implementation for remote communication. This change introduces platform-specific engine configuration via \HttpEngineFactory\, integrates the \Konnection\ library for network connectivity checks through \NetworkConnectionChecker\, and defines the backend API endpoint structure (including AI completions, schedule/homework sharing, and installation registration) in \StudyAssistantKtor\.
shared/core/remote/src/commonMain/kotlin/ru/aleshin/studyassistant/core/remote/ktor · high confidence
Introduction of dedicated database entities for class and class details
The database layer now includes specific serialization models for storing class-related data: ClassEntity, which holds core identifiers and metadata like event type, subject, teacher, and time slots, and ClassDetailsEntity, which enriches this with full organization, subject, teacher, and location objects. These new data classes replace or supplement previous storage structures, enabling the app to persist and retrieve detailed class information with associated context directly from the local database.
shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/models/classes · high confidence
New AI chat data handlers for completion, conversation, and settings
The app introduces a new set of internal data handlers in the core data layer to manage AI chat interactions. AiCompletionHandler now manages API calls for AI completions, including quota tracking and error handling for quota limits. AiConversationHandler orchestrates chat logic, handling user messages, retries, tool rounds, and message persistence via local and remote data sources, while supporting a defined set of AI tools (e.g., get\_profile, create\_todo). AiSettingsHandler manages AI-specific settings, including automatic quota reset logic based on time. FunctionArgumentsHandler provides utilities for encoding and decoding function arguments as JSON. These changes collectively enhance the reliability and structure of AI chat features.
shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/handlers · high confidence
New Analytics feature with period-based insights and multi-language support
This change introduces the Analytics feature, providing users with a dedicated view to analyze their study habits over selected time periods (week, month, year, or custom range). The implementation includes the feature's API contracts, dependency injection wiring, and domain logic for calculating metrics such as workload, completion rates, and task structure. It also adds full localization support for the analytics interface in English, Russian, Belarusian, Kazakh, and Chinese.
shared/features/schedule · high confidence
New Android platform-specific UI implementations and icon assets
This update adds Android-specific implementations for core UI behaviors, including applying application language settings, managing dark mode via CompositionLocal, controlling navigation and status bar colors, and providing native views for QR code generation/scanning and voice input. Additionally, a new set of vector icons is added to the shared resources to support the updated interface.
shared/core/ui · high confidence
New Info feature for managing organizations, employees, and subjects
This change introduces the Info feature, providing users with screens to view and manage organizations, employees, and subjects. The implementation includes domain logic for fetching and filtering this data, a navigation structure based on Decompose, and localized UI strings in English, Russian, Belarusian, Kazakh, and Chinese. Users can now access detailed information about their educational institutions, including contact details, staff lists, and course subjects.
shared/features/info · high confidence
New Ktor-based backend with AI, ad-reward, and scheduling capabilities
The application now uses a Ktor/Netty backend instead of the previous server implementation. This new backend exposes REST endpoints for AI chat completions (POST /api/v1/ai/completions) and schedule extraction (POST /api/v1/ai/schedule), integrating DeepSeek for chat and OpenRouter for schedule extraction, with configurable quotas, rate limits, and request-size caps. It also introduces an ad-reward system (POST /api/v1/ad-rewards/challenges and /complete) that issues and processes challenges to grant AI quota resets or schedule-import benefits, backed by new database tables (ad\_reward\_challenges, ai\_reward\_grants) and installation-hash-based security. The module wiring (Application.kt) registers all features—database, security, health, installation, AI, ads, and sharing—under a unified Ktor application structure.
backend/ktor/src/main/kotlin · high confidence
New centralized dependency injection module for remote services
A new \CoreRemoteModule\ has been introduced to centralize the dependency injection configuration for the app's remote layer. This module defines and binds the shared \HttpClient\ (configured with specific timeouts and JSON serialization), connection checking, and key remote APIs and data sources including AI assistance, ad rewards, installation tracking, schedule extraction, and content sharing. It also includes a platform-specific \CoreRemotePlatformModule\ to handle platform-dependent bindings, ensuring a consistent and structured foundation for network communication across the application.
shared/core/remote/src/commonMain/kotlin/ru/aleshin/studyassistant/core/remote/di · high confidence
New data mappers for organization entities
Added new data mappers in the shared core data module to handle serialization and deserialization of organization-related domain entities. Specifically, the changes introduce mapping logic for MediatedOrganization, NumberedDuration, Organization, OrganizationShort, and ScheduleTimeIntervals, enabling conversion between domain models, remote POJOs, and local database entities for these organization structures.
shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/mappers/organizations · high confidence
New data repository implementations for core domain features
The data layer now includes a comprehensive set of new repository implementations in the core data module, providing the concrete data access logic for previously defined domain interfaces. These additions cover AI assistant chat history and settings, ad reward challenges, daily goals, homework management and sharing, schedule import and sharing, employee and organization profiles, and various application settings (general, calendar, notification, analytics). This change establishes the local and remote data sources required to support these features.
shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/repositories · high confidence
New database dependency injection module for core data sources
The application now includes a new \CoreDatabaseModule\ that configures the Kodein dependency injection container for the SQLDelight-based database layer. This module binds the SQL driver, column adapters for complex types (lists, entities), and the core \Database\ instance, along with singletons for all local data sources (AI, employee, goals, organizations, schedules, settings, sharing, profile, subjects, homework, and todos). A platform-specific \expect\ module is also introduced to allow platform-specific database initialization.
shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/di · high confidence
New database entity models for user profiles and contact information
The database layer now includes new entity models to store user profile details and contact information. Specifically, \ProfileEntity\ has been added to persist core user attributes such as UID, username, avatar, city, birthday, sex, and update timestamp, while \ContactInfoEntity\ provides a serializable structure for storing labeled contact values. These changes establish the underlying data structures required for the user profile feature within the shared database module.
shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/models/users · high confidence
New domain entities for AI assistant, daily goals, and analytics
The core domain layer now includes a comprehensive set of data models to support new and enhanced features. For the AI assistant, entities like AiAssistantMessage, AiChat, and AiSettings define the structure for chat history, tool calls, and usage quotas. Daily goals are modeled with Goal, GoalDetails, and DailyGoalsProgress, while analytics are supported by DailyAnalysis and DailyWorkload entities. These additions provide the foundational data structures required for the AI chat interface, goal tracking, and workload assessment features.
shared/core/domain · high confidence
New installation ID provider and reminder manager interfaces
The app now includes a new \InstallationIdProviderImpl\ that manages unique device installation IDs by fetching them from secure local storage or registering with a remote data source, while also integrating with the analytics service to set up user IDs. Additionally, several new \expect\ class declarations have been added for reminder managers (\EndClasses\, \Homeworks\, \StartClasses\, \WorkloadWarning\) and a \NotificationScheduler\, establishing the cross-platform interface layer for scheduling and managing various types of notifications and reminders.
shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/managers · high confidence
New local data sources for AI, goals, schedules, and settings
The database layer now includes new local data source interfaces and implementations for AI chat history and settings, daily goals, base and custom schedules, organizations, employees, avatars, and various application settings (analytics, calendar, general). These sources provide the local persistence and reactive Flow-based retrieval required for the app's offline-first strategy and detailed data views.
shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/datasource · high confidence
New local database schema for organizations with hide functionality
A new SQLDelight schema file defines the \organizationEntity\ table, introducing local persistence for organization data. The schema includes fields for contact details (emails, phones, locations, webs, offices) and a new \is\_hide\ flag, enabling the application to locally store and filter organizations based on visibility preferences. Queries are provided to fetch all organizations, retrieve specific ones by ID, and specifically fetch only non-hidden organizations, supporting the new ability to hide organizations from the user's view.
shared/core/database/src/commonMain/sqldelight/ru/aleshin/studyassistant/sqldelight/organizations · high confidence
New local mappers for schedule and class entities
Added three new Kotlin files in the shared database module to handle mapping between local SQLDelight entities and domain entities for schedules and classes. Specifically, BaseScheduleLocalMapper, CustomScheduleLocalMapper, and ClassLocalMapper now provide bidirectional conversion functions (e.g., mapToBase, mapToEntity, mapToDetails) to persist and retrieve schedule data, including associated class details, from the local database.
shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/mappers/schedules · high confidence
New modular Settings feature with General, Notifications, Calendar, AI, and About tabs
The application now includes a dedicated Settings feature, implemented using the Decompose architecture. This feature provides a tabbed interface allowing users to manage General settings (including language, theme, and data deletion), configure Notifications (for class start/end, homework, and workload warnings), adjust Calendar preferences, interact with the AI assistant, and view About app details. The implementation introduces new domain models, dependency injection modules, and localized string resources for English, Russian, Belarusian, Kazakh, and Chinese.
shared/features/settings · high confidence
New remote API implementations for AI, sharing, ads, and installation
The shared remote API layer now includes new Ktor-based backend clients for several core features. AI capabilities are supported via \AiRemoteApi\ for completions and \ScheduleExtractionRemoteApi\ for extracting schedules, with the latter enforcing a 210-second timeout. User data sharing is enabled through \BackendShareApi\, which handles creating and claiming schedule/homework shares with retry logic for confirmations. Additionally, \AdRewardRemoteApi\ introduces a challenge-based ad reward system, and \InstallationRemoteApi\ provides device registration. All new clients utilize the \StudyAssistantKtor\ backend endpoints, handle installation tokens, and manage network connectivity checks.
shared/core/remote/src/commonMain/kotlin/ru/aleshin/studyassistant/core/remote/api · high confidence
New remote data models for AI, sharing, and organization structures
The remote data layer now includes a comprehensive set of serialization models to support new backend capabilities. This adds structured data classes for the AI assistant, including chat message types (user, assistant, system, tool), tool call definitions, and backend completion responses with usage and quota tracking. It also introduces models for the new schedule and homework sharing features, defining request and response payloads for creating share links, claiming tokens, and transporting schedule or homework data. Additionally, new models define the structure for organizations (including time intervals and employee details), base schedules, and specific classes, alongside error handling and installation registration responses.
shared/core/remote/src/commonMain/kotlin/ru/aleshin/studyassistant/core/remote/models · high confidence
New schedule data mappers for local, remote, and import workflows
This change introduces a new set of data mappers in the shared core data module to handle schedule entities across different layers. It adds mappers for converting between domain models and local database entities (BaseSchedule, CustomSchedule, Class), as well as mappers for serializing/deserializing mediated schedule data for remote communication (MediatedBaseSchedule, MediatedClass). Additionally, it includes mappers for the AI-based schedule import feature, handling the conversion of import requests and draft entries to and from remote payload objects.
shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/mappers/schedules · high confidence
New shared editor feature with multi-entity support and localization
The shared editor feature now provides a unified interface for managing schedules, classes, subjects, employees, organizations, homework, and user profiles. This update introduces the core API contracts (EditorConfig, EditorOutput) and implementation resources, including UI icons and full localization strings for Belarusian, Kazakh, Russian, and Chinese, enabling users to edit and configure these entities within the application.
shared/features/editor · high confidence
New user data mappers for profile, contact info, and employee records
The application now includes dedicated data mappers in the shared core data layer to handle serialization and deserialization of user-related entities. Specifically, new mappers have been added for ContactInfo, Employee, MediatedEmployee, and Profile data, enabling the conversion between domain models, local database entities, and remote API payloads. This supports the underlying architecture for storing and syncing user profiles, employee details, and contact information across local and remote data sources.
shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/mappers/users · high confidence
Production deployment and security hardening for the Ktor backend
This change introduces a comprehensive production deployment configuration for the StudyAssistant Ktor backend. It adds hardened Nginx reverse-proxy settings, including strict rate limiting, connection controls, and security headers for API endpoints. The deployment is secured with a preflight script that validates file permissions, verifies backend image signatures via Cosign, and ensures required secrets are present. Operational reliability is improved with systemd services and timers for automated PostgreSQL backups, hourly cleanup tasks, and health checks, alongside scripts for safe deployments and rollbacks.
backend/ktor/deploy · high confidence
Tasks feature scaffolding and localization
The Tasks feature module now includes its core API contracts and localized resources. The API defines the feature's configuration states (Overview, Homeworks, Todos, Share) and output navigation events, wired through Decompose and Content Provider factories. The implementation module adds the necessary UI assets (icons for deadlines, timers, progress, etc.) and full string localization for English, Russian, Belarusian, Kazakh, and Chinese to support the upcoming task management screens.
shared/features/tasks · high confidence
iOS HTTP engine implementation added
The iOS-specific HTTP client engine factory has been implemented to use the Ktor Darwin engine, enabling network requests on iOS devices.
shared/core/remote/src/iosMain/kotlin/ru/aleshin/studyassistant/core/remote/ktor · high confidence
iOS platform support and AI assistant data mapping added
The app now supports iOS, with new platform-specific implementations for core utilities such as dependency injection, device information, and file handling. Additionally, the data layer now includes comprehensive mappers for the AI assistant feature, enabling the conversion of AI chat messages, tool calls, and function responses between domain, local database, and remote backend formats.
shared · high confidence
iOS predictive back gesture support added
The iOS navigation layer now supports predictive back gestures, allowing users to initiate navigation back with a swipe that provides visual feedback before completing the action. This is implemented via a new \PredictiveBackGesture.ios.kt\ file that integrates with the Decompose library's experimental stack animation APIs, providing an iOS-like slide and fade animation during the back gesture.
shared/core/common/src/iosMain/kotlin/ru/aleshin/studyassistant/core/common/navigation · high confidence
iOS-specific dependency injection for reminder and notification managers
The iOS data layer now includes a platform-specific DI module that binds concrete implementations for workload warnings, homework reminders, start/end class reminders, and the notification scheduler. The notification scheduler is wired to the iOS UserNotifications framework (UNUserNotificationCenter), enabling native push notification scheduling on iOS devices.
shared/core/data/src/iosMain/kotlin/ru/aleshin/studyassistant/core/data/di · high confidence
Removals
Removal of legacy auth implementation scaffolding
The auth feature module has removed its previous implementation scaffolding, including the AndroidManifest files, the Kodein DI holder, and the presentation-layer screen models and contracts for Login, Register, and Forgot Password screens. This cleanup eliminates the unused boilerplate code that was part of the earlier auth architecture, streamlining the module by discarding these specific implementation details.
shared/features/auth · high confidence
Removal of legacy date extension functions and DateManager interface
The custom date utility functions in \shared/core/common/src/commonMain/kotlin/extensions/Date.kt\ (such as \shiftDay\, \isCurrentDay\, and time conversion helpers) and the \DateManager\ interface in \managers/DateManager.kt\ have been removed. This eliminates the previous custom logic for handling \Instant\ and \LocalDateTime\ operations, requiring consumers of these utilities to adopt the standard \kotlinx.datetime\ API or new implementations.
shared/core/common/src/commonMain/kotlin/extensions · high confidence
Architecture
Centralized data-layer dependency injection via new CoreDataModule
The application now uses a unified Kodein DI module, \CoreDataModule\, to wire up the data layer. This new module consolidates bindings for a wide range of repositories (including AI assistant, schedule, homework, and notification settings), handlers, and managers, while importing platform-specific, database, and remote sub-modules. Additionally, the legacy \ScreenDependencies\ interface has been removed and replaced with a platform-expect module (\coreDataPlatformModule\) to handle platform-specific DI needs, streamlining how data dependencies are provided to the rest of the app.
shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/di · high confidence
New Decompose-based architecture foundation in shared core
The shared core module now provides the foundational classes and utilities for a new component-based architecture using the Decompose and Essenty libraries. This includes base component classes (BaseComponent, FeatureComponent) that manage lifecycle and navigation, a Compose-aware store system (BaseComposeStore) for state management with built-in state restoration, and extension functions to integrate these stores with Jetpack Compose UI. Additionally, dependency injection scopes (FeatureComponentScope, FeatureControllerScope) are introduced to manage object lifecycles tied to Decompose components, and common utility extensions for Compose, dates, and database queries are added to support this new structure.
shared/core/common/src/commonMain/kotlin/ru · high confidence
Profile feature migrated to Decompose architecture with adaptive UI support
The profile feature has been restructured to use the Decompose navigation and component model, introducing new API interfaces (ProfileContentProviderFactory, ProfileDecomposeFeatureFactory) and implementation controllers that wire up domain interactors and presentation stores. The profile screen now supports adaptive layouts, switching between compact and expanded modes based on window size and posture, and includes localized strings for English, Russian, Belarusian, Kazakh, and Chinese, along with corresponding UI icons for settings, notifications, calendar, and editing.
shared/features/profile · high confidence
Behavioural changes
Added ProGuard rules for release builds
A new ProGuard configuration file has been added to the Android app to optimize and obfuscate the release APK. The rules preserve critical classes required by SQLDelight, Kotlin, Google API clients, and authentication libraries, while suppressing warnings for specific OkHttp and SLF4J components to ensure stable builds.
androidApp · high confidence
Added default Xcode workspace configuration files
The iOS project now includes the standard Xcode workspace data file (contents.xcworkspacedata) and an empty workspace settings file (WorkspaceSettings.xcsettings). These additions establish the basic workspace structure required for the project to open correctly in Xcode, ensuring the workspace references the project itself and initializes with default settings.
iosApp/iosApp.xcodeproj/project.xcworkspace · high confidence
Android HTTP client now uses OkHttp with automatic keep-alive pings
The Android implementation of the HTTP engine factory has been updated to use OkHttp instead of the default engine. This change configures a 20-second ping interval to maintain persistent connections, which helps keep the network connection alive and can improve reliability for long-running requests or background tasks on Android.
shared/core/remote/src/androidMain/kotlin/ru/aleshin/studyassistant/core/remote/ktor · high confidence
Android notification system enhanced with persistent timers and silent mode
The Android notification infrastructure in the core common module has been significantly upgraded to support more complex reminder behaviors. Notifications can now display a persistent countdown chronometer and automatically expire after a specified timeout, enabling accurate long-running timers. A new silent mode allows notifications to be shown without sound or vibration, and the system now respects Android notification categories for better integration with the OS. Additionally, the notification creation process now safely checks for permission grants before attempting to display alerts, preventing crashes on devices where permissions have been revoked.
shared/core/common/src/androidMain · high confidence
Android reminder scheduling now uses WorkManager and AlarmManager
The Android-specific implementations for class start/end, homework, and workload warning reminders have been replaced with new managers that schedule background tasks using Android's WorkManager and AlarmManager. This change ensures that reminders are reliably triggered even when the app is in the background or the device is in Doze mode, providing a more robust notification experience for users.
shared/core/data/src/androidMain/kotlin/ru/aleshin/studyassistant/core/data/managers · high confidence
Database schema overhaul and migration to version 16
The local database schema has been significantly restructured through a series of migrations (1–16). This includes the introduction of new tables for AI chat history, offline change tracking, shared homeworks/schedules, and analytics settings, alongside the removal of the daily AI responses table. Existing tables like employee, subject, and schedule have been redesigned to use UUID-based primary keys and include caching flags, while the profile entity has been simplified. Additionally, AI settings have been refactored to track quota limits and rewarded resets, and general settings now include setup and review request flags.
shared/core/database/src/commonMain/sqldelight/migrations · high confidence
Database schema updates for AI caching, ad rewards, and integrity constraints
The database schema has been updated with several new migrations to support new features and improve data integrity. Migration V10 protects the Flyway history table from unauthorized access by the application user. Migrations V11 introduces new tables for ad-based reward challenges and AI reward grants, enabling users to earn AI usage through specific actions. Migration V12 adds columns to cache AI response payloads and nonces, while V13 adds a reservation generation counter to track AI request versions. Additionally, migrations V1 through V9 establish the foundational tables for rate limiting, schedule/homework sharing, and AI usage tracking, and progressively add integrity constraints (such as hash size checks and payload size limits) and indexes to ensure data consistency and query performance across all tables.
backend/ktor/src/main/resources/db · high confidence
Platform-specific database and secure storage implementations added
The app now includes native database driver factories and secure storage implementations for Android and iOS. On Android, the database uses SQLite via SQLDelight with foreign key constraints enabled, while user avatars are stored in the app's private files directory. Secure data, such as installation tokens, is now encrypted using AES-256-GCM via the Android KeyStore, replacing legacy unencrypted storage. On iOS, the database driver is configured with foreign key constraints, avatars are saved to the Application Support directory, and secure storage utilizes the iOS Keychain with 'When Unlocked This Device Only' accessibility to protect sensitive tokens. Dependency injection modules for both platforms wire these new platform-specific components.
shared/core/database/src/androidMain, shared/core/database/src/iosMain · high confidence
Replaces auth-specific error handling with a platform-specific network connection module
The dependency injection module previously responsible for binding authentication error handlers and wrappers has been renamed and relocated to the Android-specific remote core module. This change removes the auth-specific bindings and instead registers a platform-specific network connection instance (Konnection) for Android, shifting the focus from local auth error management to establishing the underlying remote connectivity layer on the platform.
shared/core/remote/src/androidMain/kotlin/ru/aleshin/studyassistant/core/remote/di · high confidence
Updated Xcode build schemes for StudyAssistant and iosApp targets
The Xcode project configuration has been updated to include new build schemes for the StudyAssistant and iosApp targets. These schemes define how the app is built, tested, launched, profiled, analyzed, and archived, ensuring that the correct buildable products are referenced and that debugging and launch behaviors (such as log streaming for iosApp) are properly configured for development workflows.
iosApp/iosApp.xcodeproj/xcshareddata · high confidence
iOS app restructured with AppMetrica analytics, Yandex ads, and deep linking
The iOS application entry point has been replaced by a new \StudyAssistantApp\ that initializes a richer platform configuration, wiring in AppMetrica for analytics, a stubbed Crashlytics service, and a Review service. The main UI view now passes context for navigation and deep links to the shared Kotlin code, enabling URL handling via the \studyassistant\ scheme. Additionally, the app now supports Yandex advertising through configurable banner and rewarded IDs, and includes a new \UUIDProvider\ for generating unique identifiers.
iosApp/iosApp · high confidence
iOS remote dependency injection module refactored to use Konnection
The iOS-specific remote dependency injection module has been moved from the common module to the iOS-specific remote package and renamed to CoreRemotePlatformModule.ios.kt. The module no longer provides CoroutineManager or DateManager; instead, it now provides a singleton instance of dev.tmapps.konnection.Konnection for iOS remote connectivity.
shared/core/remote/src/iosMain/kotlin/ru/aleshin/studyassistant/core/remote/di · high confidence
Test coverage
Added host-based database migration and query tests; Added test infrastructure and coverage for AI quota, DeepSeek gateway, and schedule image handling; Added tests for AI completion routes and request validation; Added tests for AI domain services and tool catalog; Added tests for AI schedule extraction API and service logic; Added tests for DeepSeek schedule extraction mapper; Added tests for HTTP security and monitoring plugins; Added tests for OpenRouter schedule extraction gateway and JSON schema; Added tests for remote API implementations; Added tests for secret configuration and installation registration; Added tests for sharing payload validation and database integration; Added unit tests for data layer components; Added unit tests for date, time, navigation, and dependency injection utilities; Added unit tests for security primitives.
Dependencies
Gradle wrapper upgraded to version 9.7.0
The Gradle wrapper has been updated from version 8.7 to 9.7.0, including the addition of a SHA-256 checksum for distribution verification. This change ensures that builds use the newer Gradle release and validates the integrity of the downloaded distribution archive.
gradle · high confidence
Initial dependency and build configuration for backend and shared modules
This change introduces the foundational build configuration for the application's backend and shared components. The backend (Ktor) is set up with Kotlin 2.4.10, Ktor 3.5.2, Exposed 1.4.0, HikariCP 7.1.0, PostgreSQL 42.7.13, and Flyway 13.2.0 for database migrations. The shared modules (core and features) are configured for Kotlin Multiplatform with Compose, utilizing SQLDelight for local storage, Ktor Client for networking, and various analytics and UI libraries. iOS dependencies are also defined, including YandexMobileAds 8.3.0 and AppMetricaCore 6.6.0.
(dependencies) · high confidence
Housekeeping
Initial project scaffolding and documentation
The repository is initialized with core documentation files including the Apache 2.0 License, README, Code of Conduct, and Security Policy. A local.properties.example template is added to guide developers on required configuration keys for AppMetrica, Tracer, and backend URLs. The .gitignore is updated to exclude Kotlin build artifacts, IDE settings, and sensitive configuration files such as service account JSONs and build outputs.
(repo-wide) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 41 → 74 (+32.6)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 90 → 89 (-0.6)
- Architecture 100 → 96 (-4.3)
- Maturity 73 → 77 (+3.6)
- Readiness 0 → 61 (+61.1)
- Security 92 → 92 (-0.2)
- Domain Modelling 70 → 100 (+30.3)
Resolved (254)
- Base.completeOrCancelGoal (cognitive 21) (shared/features/tasks/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/tasks/impl/domain/interactors/GoalsInteractor.kt)
- Base.completeOrCancelGoal (cyclomatic 16) (shared/features/tasks/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/tasks/impl/domain/interactors/GoalsInteractor.kt)
- Base.cycleUpdateActiveClass (cognitive 19) (shared/features/schedule/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/schedule/impl/presentation/ui/overview/store/OverviewWorkProcessor.kt)
- Base.fetchGoalsByDate (cyclomatic 17) (shared/features/tasks/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/tasks/impl/domain/interactors/GoalsInteractor.kt)
- Base.updateUserSubscriptionInfo (cognitive 38) (shared/src/commonMain/kotlin/ru/aleshin/studyassistant/domain/interactors/AppUserInteractor.kt)
- DailyHomeworksDetailsViewKt.DailyHomeworksDetailsView (cyclomatic 17) (shared/features/tasks/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/tasks/impl/presentation/ui/homeworks/views/DailyHomeworksDetailsView.kt)
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- Duplicated block (10 lines × 2) (shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/mappers/organizations/OrganizationDataMapper.kt)
- Duplicated block (10 lines × 2) (shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/mappers/schedules/BaseScheduleDataMapper.kt)
- Duplicated block (10 lines × 2) (shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/mappers/schedules/ClassDataMapper.kt)
- Duplicated block (10 lines × 2) (shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/mappers/users/EmployeeDataMapper.kt)
- Duplicated block (10 lines × 2) (shared/core/data/src/commonMain/kotlin/ru/aleshin/studyassistant/core/data/repositories/BaseScheduleRepositoryImpl.kt)
- Duplicated block (10 lines × 2) (shared/core/database/src/commonMain/kotlin/ru/aleshin/studyassistant/core/database/datasource/schedules/BaseScheduleLocalDataSource.kt)
- Duplicated block (10 lines × 2) (shared/features/editor/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/editor/impl/presentation/ui/daily/views/DetailsClassView.kt)
- Duplicated block (10 lines × 2) (shared/features/editor/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/editor/impl/presentation/ui/employee/views/EmployeeNameInfoField.kt)
- Duplicated block (10 lines × 2) (shared/features/editor/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/editor/impl/presentation/ui/root/EditorFeatureComponent.kt)
- Duplicated block (10 lines × 2) (shared/features/editor/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/editor/impl/presentation/ui/schedule/views/WeekScheduleBottomSheet.kt)
- Duplicated block (10 lines × 2) (shared/features/schedule/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/schedule/impl/domain/interactors/ScheduleInteractor.kt)
- Duplicated block (10 lines × 2) (shared/features/schedule/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/schedule/impl/presentation/ui/details/views/CommonScheduleView.kt)
- Duplicated block (10 lines × 2) (shared/features/schedule/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/schedule/impl/presentation/ui/share/views/LinkedSubjectsView.kt)
- …and 234 more
New (465)
- AiAssistantMessageKt.lastConfirmedTurnEndIndex (cognitive 17) (shared/core/domain/src/commonMain/kotlin/ru/aleshin/studyassistant/core/domain/entities/ai/AiAssistantMessage.kt)
- AiCompletionRequestValidator.validate (cyclomatic 17) (backend/ktor/src/main/kotlin/ru/aleshin/studyassistant/backend/ai/api/validation/AiCompletionRequestValidator.kt)
- AiQuotaRepositoryImpl.reserve (cognitive 22) (backend/ktor/src/main/kotlin/ru/aleshin/studyassistant/backend/ai/infrastructure/AiQuotaRepositoryImpl.kt)
- AiQuotaRepositoryImpl.reserve (cyclomatic 16) (backend/ktor/src/main/kotlin/ru/aleshin/studyassistant/backend/ai/infrastructure/AiQuotaRepositoryImpl.kt)
- AnalyticsGridKt.analyticsDetailsItems (cognitive 16) (shared/features/analytics/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/analytics/impl/presentation/ui/analytics/views/layouts/AnalyticsGrid.kt)
- AssistantComposeStore.handleEvent (cognitive 17) (shared/features/chat/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/chat/impl/presentation/ui/assistant/store/AssistantComposeStore.kt)
- AssistantComposeStore.handleEvent (cyclomatic 23) (shared/features/chat/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/chat/impl/presentation/ui/assistant/store/AssistantComposeStore.kt)
- Base.createNotify (cognitive 21) (shared/core/common/src/androidMain/kotlin/ru/aleshin/studyassistant/core/common/notifications/NotificationCreator.kt)
- Base.createNotify (cyclomatic 19) (shared/core/common/src/androidMain/kotlin/ru/aleshin/studyassistant/core/common/notifications/NotificationCreator.kt)
- Base.updateClass (cognitive 21) (shared/features/chat/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/chat/impl/domain/tools/AiToolCallProcessor.kt)
- Base.updateClass (cyclomatic 22) (shared/features/chat/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/chat/impl/domain/tools/AiToolCallProcessor.kt)
- ClassTooLong: AiToolCallProcessor (shared/features/chat/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/chat/impl/domain/tools/AiToolCallProcessor.kt)
- ClassTooLong: AnalyticsReportCalculator (shared/features/analytics/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/analytics/impl/domain/calculators/AnalyticsReportCalculator.kt)
- ClassTooLong: ScheduleImportHandler (shared/features/schedule/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/schedule/impl/domain/common/ScheduleImportHandler.kt)
- Critical CVE: [GHSA redacted] (backend/ktor/gradle/verification-metadata.xml)
- DeepSeekAiCompletionGateway.completeWithinDeadline (cognitive 18) (backend/ktor/src/main/kotlin/ru/aleshin/studyassistant/backend/ai/infrastructure/deepseek/DeepSeekAiCompletionGateway.kt)
- DeepSeekAiCompletionGateway.completeWithinDeadline (cyclomatic 18) (backend/ktor/src/main/kotlin/ru/aleshin/studyassistant/backend/ai/infrastructure/deepseek/DeepSeekAiCompletionGateway.kt)
- DeepSeekMapper.mapResponse (cyclomatic 18) (backend/ktor/src/main/kotlin/ru/aleshin/studyassistant/backend/ai/infrastructure/deepseek/mappers/DeepSeekMapper.kt)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- DetailsComposeStore.handleEvent (cyclomatic 16) (shared/features/schedule/impl/src/commonMain/kotlin/ru/aleshin/studyassistant/schedule/impl/presentation/ui/details/store/DetailsComposeStore.kt)
- …and 445 more
Changes since last survey
- 77 commits — 53 feature/other, 24 fixes
By area
- shared/features — 27 commits
- backend/ktor — 19 commits
- (repo) — 10 commits
- .github/workflows — 6 commits
- shared/core — 6 commits
- (root) — 4 commits
- androidApp/src — 2 commits
- config/images — 1 commit
- fastlane/metadata — 1 commit
- iosApp/iosApp — 1 commit
Notable commits
- fix: fix(backend): cap extraction reasoning at 4096 tokens and raise request timeout to 180s
- fix: fix(backend): harden production response metadata
- fix: fix(backend): mapping schedule
- fix: fix(backend): nginx bug
- fix: fix(backend): reject non-canonical installation credentials
- fix: fix(backend): sync AiToolCatalogTest with implemented tools
- fix: fix(backend): timeout settings
- fix: fix: AI chat recovery, schedule import, editor and banner bugs
- fix: fix: ads rewarded bug
- fix: fix: ai cache bug
- fix: fix: bugs in ui, business logic and backend
- fix: fix: config images
- fix: fix: date time bug & chat logic
- fix: fix: import loading title font
- fix: fix: markdown render
- fix: fix: minor bugs
- fix: fix: minor bugs
- fix: fix: minor bugs
- fix: fix: quota value
- fix: fix: responseFormat
- …and 57 more
Architecture
- Containers 0 added · 0 removed · contexts 0 added · 1 removed · edges 0 added · 0 removed
Removed bounded contexts (1)
- impl
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
v1tzor/StudyAssistant was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit fea4593851878431bf2cf78b9e17f85c45574669 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-fa71c66cabd8.