A premium, offline-first personal finance tracker for Android.
Built with Kotlin · Jetpack Compose · Room · Hilt · Material Design 3
Pockit is a beautifully crafted, 100% offline expense tracking application built with financial privacy at its core. No accounts, no cloud sync, no tracking — every transaction stays exclusively on your device.
The app combines Clean Architecture with an iOS-inspired design language — dark mode first, emerald green accents, and fluid animations throughout — delivering a premium financial experience.
- Real-time balance overview with animated counters
- Monthly income vs. expense summary
- Category spending breakdown via interactive pie chart
- Quick-action buttons for recurring payments, reports, and history
- Recent transaction preview
- Floating action button for one-tap income/expense entry
- Add income or expense in seconds
- 12 expense categories and 6 income categories with distinct semantic colors
- Optional notes for every transaction
- Amount validation and error handling
- Daily, weekly, biweekly, monthly, quarterly, and yearly frequencies
- Set due dates and toggle active/paused status
- Notification reminders for upcoming bills
- Monthly income/expense trends via animated line chart
- Category distribution via donut chart
- Bar chart comparing income vs. expenses over 12 months
- Scrollable monthly summary cards with transaction counts
- PDF report generation for any date range
- Full search across amounts, notes, and categories
- Quick-filter chips (All, Food, Bills, Shopping, Salary)
- Chronological list with category icons and color coding
- 100% offline — no internet permission required
- No authentication, no accounts, no sign-up
- All data stored locally via Room database
- No analytics SDKs, no crash reporting, no telemetry
| Layer | Technology |
|---|---|
| Language | Kotlin 2.0.0 |
| UI | Jetpack Compose (BOM 2024.06) |
| Architecture | MVVM + Clean Architecture |
| Database | Room 2.6.1 |
| DI | Hilt 2.51.1 |
| Navigation | Navigation Compose 2.7.7 |
| Async | Kotlin Coroutines + Flow |
| Data Persist. | DataStore Preferences |
| Animations | Compose Animation |
| Charts | Custom Canvas-based components |
| Min SDK | 26 (Android 8.0) |
| Target SDK | 34 (Android 14) |
The project follows Clean Architecture with strict layer separation:
com.expensetracker.app/
├── core/ # Theme, constants, extensions, utilities
├── data/ # Room database, DAOs, entities, repository implementations
├── domain/ # Domain models, repository interfaces, use cases
├── di/ # Hilt dependency injection modules
├── navigation/ # NavGraph, screen routes, bottom nav items
├── presentation/ # ViewModels and Compose screens
│ ├── splash/ # Animated splash with auto-transition
│ ├── onboarding/ # 3-page introduction carousel
│ ├── dashboard/ # Home screen with balance, charts, quick actions
│ ├── transaction/ # Add income/expense form
│ ├── analytics/ # Charts and spending trends
│ ├── reports/ # Monthly reports and PDF generation
│ ├── history/ # Searchable, filterable transaction list
│ ├── recurring/ # Recurring expense management
│ ├── categories/ # Browse expense and income categories
│ └── settings/ # App info, theme, currency, data management
└── ui/
└── components/ # Reusable composables (cards, charts, logo, etc.)
- Separation of concerns — UI logic, business logic, and data access are fully isolated
- Repository pattern — Domain layer never depends on data layer implementations
- Unidirectional data flow — ViewModels expose
StateFlowconsumed by Compose screens - Immutable UI state — Every screen has a single, immutable data class representing its state
| Screen | Description |
|---|---|
| Splash | Animated logo with auto-transition |
| Onboarding | 3-page introduction carousel with skip option |
| Dashboard | Balance card, stats, pie chart, recent txns |
| Add Transaction | Type toggle, amount input, category grid, notes |
| Analytics | Line chart, category breakdown, monthly summary |
| Reports | Bar chart, monthly report cards, PDF export |
| History | Searchable, filterable transaction list |
| Recurring | Recurring expense list with add dialog |
| Categories | Browse all expense and income categories |
| Settings | Theme, currency, data management, privacy info |
- Background: Matte Black (
#0D0D0D), Dark Surface (#121212) - Cards: Dark Card (
#1A1A1E), Elevated (#222228) - Accent: Emerald Green (
#059669), Emerald Glow (#33059669) - Semantic: Income Green (
#059669), Expense Red (#FF5252) - Text: Soft White (
#F5F5F5), Muted White (#A0A0A8), Dim White (#6B6B75) - 12 distinct category colors for visual differentiation
- Full light mode palette with matching semantics
- System font family (San Francisco on iOS, Roboto on Android)
- Strong hierarchy with large display heads
- Consistent letter spacing on labels
- Premium cash amount styling
- Spring-based card press interactions
- Fade + slide navigation transitions (300ms)
- Animated value counters (800–1000ms)
- Chart rendering animations (800–1000ms)
- Staggered card entrance on dashboard
- Android Studio Hedgehog (2023.1.1) or later
- JDK 17
- Android SDK 34
# Clone the repository
git clone https://github.com/umairxdev/Expense_Tracker.git
# Open in Android Studio
# File > Open > select the project directory
# Sync Gradle and run
./gradlew assembleDebug# Debug build (unoptimized, suitable for development)
./gradlew assembleDebug
# Release build (minified with R8, ready for distribution)
./gradlew assembleRelease
# Release App Bundle
./gradlew bundleReleaseNote: Ensure your Android SDK path does not contain spaces. Configure it via
File > Settings > Appearance & Behavior > System Settings > Android SDK.
| Permission | Purpose |
|---|---|
POST_NOTIFICATIONS |
Recurring bill reminders (Android 13+) |
SCHEDULE_EXACT_ALARM |
Precise bill due-date notifications |
USE_EXACT_ALARM |
Alarm scheduling for reminders |
No internet or network permissions are declared. The app functions entirely offline.
Contributions are welcome and appreciated. Here's how to get started:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow Kotlin Coding Conventions
- Use Compose best practices (state hoisting, stable types, composable previews)
- Maintain clean architecture boundaries
- Write meaningful commit messages
- Add unit tests for new business logic
Distributed under the MIT License. See LICENSE for more information.
Built with craftsmanship in Kotlin · 100% offline · 100% private
No Firebase. No servers. No tracking. Just you and your money.