Project Report
Project Report
A Project Report
Submitted by:
(21EBKCS056)
In partial fulfillment of the requirements of the degree
of
BACHELOR OF TECHNOLOGY
IN
This is to certify that the project titled “Recurrent Expense Tracker using
Kotlin Multiplatform” is the bona fide work carried out by AJAY SINGH
(21EBKCS008) & KRISHAN SINGH SHEKHAWAT (21EBKCS056)
students of B Tech (CSE) of B.K.Birla Institute of Engineering &
Technology, Pilani affiliated to Bikaner Technical University, Bikaner,
Rajasthan (India) during the academic year 2024-2025, in partial fulfillment of
the requirements for the award of the degree of Bachelor of Technology
(Computer Science and Engineering and that the project has not formed the
basis for the award previously of any other degree, or any other similar title.
We are also grateful to our teacher, Mr. Himanshu Verma, for their constant
support and guidance. Finally, we would like to express our sincere thanks to
all our friends and others who helped us directly and indirectly in completing
this work.
Thank you,
Chapter 1: Introduction 1
7.1 Finding 17
7.2 Analysis 18
Chapter 9: Conclusion 24
Chapter:10 References 26
References 44
Appendices 46
Chapter 1: Introduction
Overview:
Recurring expense tracking is an important aspect of personal financial management.
Many people incur regular costs, such as rent, insurance premiums, subscription
services (Netflix, music streaming, etc.), that recur on a fixed schedule. Monitoring
these fixed outflows is crucial for budgeting and avoiding missed payments. As noted
by financial experts, “Tracking your expenses regularly can give you an accurate
picture of where your money is going”. In particular, identifying fixed expenses (like
rent and insurance) vs variable expenses helps users allocate funds more effectively.
Without appropriate tools, recurring charges can accumulate unexpectedly (e.g.,
forgotten subscriptions), potentially causing financial stress. Tools that automate or
simplify tracking these recurring costs can therefore improve financial awareness and
control.
Personal finance apps and budgeting tools are widely used to manage spending, and
many now highlight recurring payments. For example, budgeting strategies like the
50/30/20 rule categorize expenses (needs, wants, savings) and explicitly include
recurring payments such as utilities and subscriptions. Mobile apps and services
(such as Rocket Money, Truebill, Mint, etc.) offer features to identify and manage
subscriptions and recurring bills. A subscription tracker app, for instance, can “keep
tabs on recurring monthly charges” by analyzing the payment source. These
solutions often aim to reduce waste (unused subscriptions) and ensure bills are not
overlooked.
Despite many general budgeting tools, there is ongoing demand for simple,
privacy-respecting apps focusing specifically on recurring expenses. The Recurring
Expense Tracker project by Dennis Bauer addresses this need as a lightweight,
cross-platform solution. The app’s description highlights its focus: “A Material You
recurring expense tracker, allowing you to keep track of your monthly spending…
[for] recurring expenses like rent, insurance, subscriptions, etc.”. The user interface
is based on Android’s modern Material You design. Notably, it is a Kotlin
Multiplatform application, sharing core logic across Android, iOS, and desktop
platforms..
This report presents an in-depth analysis of the Recurring Expense Tracker project.
It covers the motivation and related tools, the application architecture and codebase,
user experience and setup, illustrative visuals (screenshots), and a critical discussion
of strengths and limitations.
Wherever possible, factual claims are supported by citations to project
documentation and relevant sources.. The report is structured with clear academic
headings and concise paragraphs to facilitate comprehension.
2. Need for Recurring Expense Tracking and Existing Solutions
The app is structured in several modules: an app module for Android, an iOS app
for iOS, and common/shared modules containing business logic. According to
GitHub stats, the codebase is predominantly Kotlin (99.8%), with only a tiny
Swift component (0.2%). – likely for iOS-specific UI setup. The project has
active development, with 39 releases (latest v0.17.0 on May 4, 2025) and 967
commits. The F-Droid repository indicates recent feature additions like support
for 170+ currencies (added in May 2025), showing ongoing enhancements.
“Kotlin Multiplatform core sharing logic across Android, iOS, desktop; Compose
Multiplatform UI with Material3; Dependency Injection via Koin; Room Database
for reactive data with Coroutines & Flow; Home Screen Widgets on Android for
payment reminders.”..
Overall, the project aims for simplicity and extensibility. The developer encourages
contributions and has set up localization (via Weblate) and donation channels.. The
report will next examine the architecture and codebase in detail, followed by user
experience and analysis of advantages and limitations.
4. Architecture and Technology Stack
The Recurring Expense Tracker’s architecture follows modern mobile app patterns,
leveraging Kotlin Multiplatform and dependency injection. The core business logic
(data models, repository, database access, etc.) resides in a shared Kotlin module that
is compiled for each platform. The UI layer is implemented using Compose
Multiplatform, meaning the Android and Desktop interfaces are written in declarative
Compose (Material 3) code. On iOS, the presence of Swift code (0.2%) suggests a
minimal SwiftUI or UIKit entry point that calls into the shared Compose UI
(Compose Multiplatform can interop with iOS) or a native fallback. In either case, UI
components closely mirror across platforms to maintain consistency.
interface ExpenseDao {
@Insert(onConflict =
OnConflictStrategy.REPLACE) suspend
fun insert(expense: ExpenseEntity) }
This typical DAO setup uses Kotlin Coroutines and
Flow<List<ExpenseEntity>> so that the UI can observe changes reactively.
The database is initialized via Room and injected where needed. The use of the
Room is confirmed by project metadata..
● Architecture Pattern (MVVM): The app likely follows a
Model-View-ViewModel approach. The shared logic (models, repository) acts
as the Model, Compose UI functions as View, and platform-specific
ViewModels (possibly using ViewModel on Android) mediate between them.
Koin modules would supply ViewModel instances with the repository.
● Other Libraries: As per the F-Droid metadata, libraries include Jetpack
Compose (UI framework), AndroidX Core, etc.. Coroutines and Flow are
used for asynchronous tasks (as indicated in the README snippet). The
Android manifest requests minimal permissions (network state, notifications,
boot complete, biometrics) for its features, indicating limited dependencies.
● Android Glance Widgets: A unique feature is the use of Jetpack Glance to
create home-screen widgets on Android. These widgets display upcoming
payment reminders outside the main app (as shown in Figure 3 below). Glance
is a Compose-based framework specifically for app widgets, confirming a
modern implementation.
● Multiplatform Targets: The project targets Android API 15.0+ and desktop
platforms. The iOS target is present, but publishing is not done (requires an
Apple account). Kotlin’s multiplatform build (Gradle) compiles a shared
framework for each platform, as indicated in the README..
In summary, the Recurring Expense Tracker uses a shared Kotlin codebase for core
logic and a Compose-based UI for native look and feel. The architecture is modular
and follows best practices (dependency injection, reactive flows). Key features and
libraries are summarized as follows:
● Core: Kotlin Multiplatform, shared logic across Android, iOS, and Desktop.
● UI: Compose Multiplatform with Material3 (Android/desktop) and minimal
Swift code (iOS)...
● DI: Koin for multiplatform dependency management..
● Database: Room + SQLite with Kotlin Coroutines & Flow..
● Widgets: Android home-screen widgets via Glance (reminders)..
● Language Distribution: ~99.8% Kotlin, 0.2% Swift..
● Libraries: Jetpack Compose, AndroidX Core, (others not explicitly listed
but typical coroutines/Flow, Koin, etc.).
Data Collection:
The project’s repository is organized into multiple modules and directories. Notable
elements include:
Although the GitHub interface is not fully visible without login, we infer from the
Android
and iOS apps that the common code is placed under shared. This code likely
contains:
● The ExpenseEntity data class is annotated with @Entity for Room (e.g.,
fields: id, name, price, currency, recurrencePeriod, firstPayment, color,
reminderDays).
● ExpenseDao interface with Room queries (as shown above).
● ExpenseRepository class that provides functions like
getAllExpenses(): Flow<List<ExpenseEntity>> and
addExpense(expense: ExpenseEntity), encapsulating DAO calls.
● ViewModels or state holders (Kotlin classes) are used by UI composables
to obtain and expose data. For example, a HomeViewModel may call the
repository and expose a Flow<List<Expense>> to the UI.
● AppModule.kt (or similar) defining Koin modules, binding singletons: the
● Room database, DAO, repository, and view models (e.g., single {
ExpenseData(get())
}, factory { ExpenseRepository(get()) }, viewModel { HomeViewModel(get())
}).
An example of a DAO (simplified) might be
@Dao
interface ExpenseDao {
@Query("SELECT * FROM expense ORDER BY nextPayment
ASC") fun getAllExpenses(): Flow<List<ExpenseEntity>>
@Insert(onConflict =
OnConflictStrategy.REPLACE) suspend fun
insert(expense: ExpenseEntity)
}
@Composable
While we do not have the exact code, this pseudocode illustrates how the data
(collected from the ViewModel) feeds into UI components. The ExpenseCard could
display the name, amount, and next payment info, as seen in the screenshot (Figure
1). The plus-icon button on the Home screen likely triggers a navigation to an
“Add/Edit Expense” screen, which could be another composable with text fields and
controls.
On the settings side, the project likely uses Jetpack Preferences or a Compose-based
preferences screen. The screenshot (Figure 5) shows toggles and dropdowns, which
are standard Compose Switch and DropdownMenu components bound to a settings
DataStore or repository.
Setting up and using Recurring Expense Tracker is straightforward. For end users, the
primary platforms are Android (via Google Play or F-Droid) and desktop. For
Android, the app is published on Google Play (with an “Everyone” rating, ~500+
downloads) and also on F-Droid (open-source repository). For iOS and desktop, no
official releases are available; users must compile from source.
Installation: On Android, users can install it like any other app: either via F-Droid or
the Play Store. The F-Droid page provides a download link and metadata, indicating
it supports Android 8.0+. After installation, the app requests only minimal
permissions (notification, boot complete, etc.) as seen in the F-Droid listing. This
implies a privacy-focused design. No user accounts or internet permissions are
required. On a desktop, one would clone the repository and use an IDE
(IntelliJ/Android Studio) to run the desktop target. The README notes that for iOS,
an Apple developer account is needed for publishing; currently, the app “can only be
used when compiled locally.
Launching the App: Upon first opening, the app shows the Home screen, which
provides an overview of recurring expenses. The title bar says “Recurring Expense
Tracker”. Below the title, the current total recurring spend is summarized by period:
Monthly, Weekly, and Yearly. Initially, these totals are $0. The main area lists added
expenses as colored cards: each card shows the expense name, and on the right, the
price plus recurrence (e.g., “$399.00 / 1Y” meaning $399 per year). If no expenses
exist yet, this list is empty.
Adding/Editing Expenses: Users can add a new expense by tapping the floating “+”
button. This opens an Edit Expense screen (Figure 4). Fields include Name, an
optional Description, Price, Currency dropdown, Recurrence (interval and unit, e.g.,
“1 Month(s)”), First Payment date picker, and a Color selection. There is also a toggle
for an Upcoming payment reminder with a configurable number of days before the
payment (default 3). The user enters values and taps Save. For example, one might
enter Name = “Netflix Premium”, Price = 17.99 USD, Recurrence
= 1 Month, First Payment = Feb 1, 2025. After saving, this expense appears on the
Home screen with its monthly cost ($17.99) and underlying yearly total ($215.88)
reflected in the summary.
If the user taps an existing expense card, the Edit screen appears again (pre-filled),
allowing updates or deletion (the trash icon). All inputs immediately update the local
database via the shared logic. Because Flow is used, the Home screen list and
summary update reactively without reloading the app.
Overview Tabs: At the bottom of the app are three navigation tabs. Home, Upcoming,
and Settings. The Home tab shows the summary and current expenses. The
Upcoming tab (Figure 2) shows a chronological list of individual upcoming
payments, grouped by month. For example, it lists “May 2025 – $59.98” at the top,
followed by specific entries like “Mobile Phone: $34.99 on May 10, 2025 (in 6
days)”. This lets users see exactly when each payment is due. The Upcoming list is
computed from the current date and each expense..
recurrence. The total at the top ($59.98) reflects the sum of the due payments in the
current month (May 2025). Future months (June, July, etc.) follow. This feature helps
with short-term planning.
Interactive Example: The Figure shows the Edit Expense screen after entering
Netflix details. The fields illustrate the user flow: the user types text, picks dates and
colors, then saves. The figure caption explains each area. Figure 5 shows the Settings
screen with toggles for theme, default tab, currency preferences, etc.
Widgets and Notifications: Beyond the in-app UI, Recurring Expense Tracker
offers home-screen widgets on Android. Figure 3 shows an example Android home
screen with an “Upcoming Pay…” widget. This Glance-based widget lists the next
few payments (Netflix
$17.99 on May 1, Mobile Phone CHF34.99 on May 10, etc.), updating in real-time.
This allows users to see upcoming bills at a glance without opening the app.
Additionally, the app sends system notifications for reminders. Figure 6 illustrates a
notification shade on Android: two notifications (from “Expenses”) stating that
“Another Subscription – Next payment in 2 days” and “Netflix – Next payment in 3
days”. Tapping these would presumably open the app to the corresponding items.
These reminders rely on the user’s configured lead time and boot-completed service
to schedule alerts.
Overall, the user interaction model is intuitive: enter recurring expenses once, then
passively view summaries and get reminders. The UI uses Material You styling
(responsive layouts, card views with dynamic colors) and standard Compose
controls. The developer’s goal of simplicity is evident: the app has few screens,
minimal text, and focuses on core functionality. By keeping inputs and outputs clear
(see the annotated figures below), the app avoids overwhelming the user while still
providing all needed data. The home/ upcoming/settings navigation is typical for
mobile apps, making the learning curve low.
Edit/Add Expense screen for an entry. Fields include Name (“Netflix”) and
Description (“Premium”), Price (17.99 USD), Recurrence (1 Month), and First
Payment date (Feb 1, 2025). A color dot can be chosen for the expense. The
Upcoming payment reminder toggle (on) and Days before payment field specify
notification lead time (default 3 days). The Save button commits the entry.
Settings screen with configuration options. Sections include General (theme mode,
default tab), Currency (default currency, show converted), Security (biometric lock),
Notifications (enable payment reminders), and Backup (create/restore). These allow
the user to customize the app’s behavior and appearance.
To efficiently run the machine learning algorithms and ensure the system's optimal
performance,
the following hardware specifications are recommended:
Processor: A high-performance processor is essential for handling complex
computations involved in training and evaluating machine learning models.
The recommended processor is an Intel Core i7 or equivalent.
RAM: Memory plays a crucial role in managing the computational tasks and
data processing requirements of machine learning models. A minimum of 16
GB of RAM is recommended to provide sufficient memory for loading and
manipulating large datasets, training models, and running multiple processes
simultaneously without performance degradation.
Storage: Solid-state drives (SSDs) are preferred for their speed and reliability. An
SSD
with at least 256 GB of storage is recommended to store the datasets, software,
and model files. SSDs offer faster read/write speeds compared to traditional
hard drives, which enhances the overall performance of the system during data
loading and model training.
Graphics Card: A dedicated graphics card is beneficial for GPU-accelerated
training of machine learning models, particularly for deep learning
applications. The recommended graphics card is an NVIDIA GTX 1060 or
equivalent.
Operating System: The choice of operating system depends on compatibility
with the software tools and libraries used in the project. Both Windows 10 and
Linux (preferably Ubuntu) are suitable options.
Peripheral Devices: In addition to the core hardware components, peripheral
devices such as a high-resolution monitor, a reliable keyboard, and a mouse
are essential for a comfortable and efficient working environment.
Network Connectivity: Stable and high-speed internet connectivity is
important for downloading datasets, software updates, and libraries
Code Snippets (Supporting Examples)
Below are illustrative code snippets that reflect how certain features are implemented.
These are representative examples, not copied verbatim from the repository.
This Expense Entity defines the database table fields. Each expense record
stores its name, amount, currency, recurrence interval, first payment date,
color, and reminder. The room uses this class to create the SQLite table.
// Example DAO interface with Flow for
reactive queries @Dao
interface ExpenseDao {
@Insert(onConflict =
OnConflictStrategy.REPLACE) suspend fun
insert(expense: ExpenseEntity)
}
val expenses =
repo.getExpenses().stateIn(viewModelScope,
SharingStarted.Lazily, emptyList())
}
val expenses by
viewModel.expenses.collectAsState() Scaffold(
floatingActionButton = { AddExpenseFab() }
){
Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {
SummaryWidget(expenses) // shows Monthly/Yearly totals
Spacer(modifier = Modifier.height(8.dp))
LazyColumn {
items(expenses
) { expense ->
ExpenseCard(expense)
In this Compose snippet, the HomeScreen collects the expense list from the
ViewModel and displays a summary (e.g., total monthly) and a scrollable list of
ExpenseCard composables (each showing one expense). The AddExpenseFab() is
the floating action button to add a new entry.
Each snippet above exemplifies key parts of the implementation: data models, data
access, business logic, and UI. Together, they show that the app uses standard
patterns (Room for data, Flow/Coroutines for reactivity, ViewModel for UI data,
Compose for interface).
Strengths and Key Features
In the academic context, one can view the app as a practical application of
cross-platform mobile architecture. It effectively demonstrates how KMP and
Compose can be used to build a consistent user experience across devices... The
architecture choices (MVVM, DI, Room) align with current best practices in
mobile development.
Limitations and Areas for Improvement
Despite its strengths, the project has limitations and potential improvements:
In summary, the main limitations are feature scope (no automatic import or
budgeting beyond fixed expenses), and distribution constraints on non-Android
platforms. These reflect design trade-offs (simplicity and privacy) but point to
future work. Potential improvements include adding sync capabilities,
expanding the feature set (charts, categories), improving UX details, and
releasing desktop/iOS builds.
In this project the major task of this project is to create a record of the daily
transactions. In this project, we use Agile methodology. Project management using
the agile technique entails segmenting a project into stages, working continuously
with stakeholders, and making improvements at each level. The teams collaborate
with other teams and project stakeholders as they go through planning, doing, and
evaluating cycles. The methodology emphasises how crucial it is to maintain close
communication with stakeholders throughout the project to guarantee success.
Teams frequently utilise the agile methodology for project management because it
enables them to react fast to market changes or client input without upsetting
long-term objectives. It requires little planning and ships frequently in tiny
increments, enabling teams to get feedback on each change and inexpensively
incorporate it into plans. Teams become more flexible and sensitive to changes as
a result of this method, which is crucial in a dynamic business environment.
Expense Tracker is a mobile application that allows users to track their expenses.
The application will have a two-tier architecture, with a database tier for storing
financial data and a user interface for interacting with the system. The system is
designed to operate offline, with different categories for users to select from and
enter the amount and mode of payment. The system will analyze the information
and provide analytics on which category the user spent the most of their money.
The user interface will allow users to store and observe their past expenses.
Conclusion