A personal car maintenance tracker for Android — built as a portfolio-quality app that I actually use on my own cars.
Hebrew-first, RTL-ready, Material You design with full Light / Dark / System theme support.
AutoCare.apk — debug build, signed, ready to sideload (Android 8.0+)
Enable Install from unknown sources in your device settings before installing.
- Add multiple cars with make/model dropdowns (35+ brands, 150+ models), photo, color picker, license plate, year, and expiry dates
- Full-bleed photo card catalog with HorizontalPager — peek-based swipe between cars
- Long-press enters edit mode: in-place left/right arrows to reorder, delete button, scroll locked — no bottom sheet
- Car profile with hero photo, transparent top bar, status banner, action tiles, and stats
- Full edit and delete with cascade cleanup of all related records and reminders
- Three record types: Maintenance (periodic service, km required), Repair (one-off fixes, km optional), Wear (tires, brakes, battery, wipers, km optional)
- Attach a receipt or part photo to any record
- Quick-fill suggestion chips per record type
- Cost tracking with running totals and per-type breakdown
- Per-car reminders for: test (MOT) expiry, insurance expiry, and periodic service date
- Three notification windows: 60 days / 30 days / 7 days before expiry
- Escalating schedule per window — e.g. 60-day window fires at: 60 → 30 → 23 → 16 → 9 days, then daily in the last 7
- Last 7 days always active regardless of window choice
- Live "next alert" date shown per reminder based on actual expiry + selected window
- Each reminder individually toggleable per car
- Cost breakdown by record type with a Canvas bar chart
- Total spend, record count, and average cost per service
- Only shown when at least 2 maintenance records exist
- Store test certificate and insurance documents per car (image or PDF) with expiry date
- In-app photo framing: pinch-to-zoom, pan with edge clamping, rule-of-thirds grid, reset button
- Full document history with active/archived badges
- PDF report per car — hero photo, car details, full maintenance table with receipt photos
- JSON backup — full export of all cars and records; import restores everything by car ID
- Theme: System / Light / Dark (persisted via DataStore)
- Language: System / עברית / English (live switching via AppCompatDelegate)
- Notification permission management with a test notification button to verify delivery
Coming soon
| Language | Kotlin |
| UI | Jetpack Compose + Material 3 + Material You (dynamic color) |
| Architecture | MVVM + Clean Architecture (data / domain / presentation) |
| Database | Room v7 — real migrations, data safe on upgrade |
| DI | Hilt |
| Navigation | Navigation Compose |
| Preferences | DataStore |
| Background | WorkManager (12h periodic reminder check) |
| Images | Coil 3 |
| Locale | AppCompatDelegate (live language switching) |
| Min SDK | 26 (Android 8.0) |
| Compile SDK | 35 |
com.hananelsabag.autocare/
├── data/
│ ├── local/ # Room DB, DAOs, entities, type converters
│ ├── preferences/ # DataStore wrappers
│ └── repository/ # Repository implementations
├── domain/
│ └── repository/ # Repository interfaces
├── presentation/
│ ├── components/ # Reusable composables (CarPager, ImageCropSheet, …)
│ ├── navigation/ # Nav graph + Screen sealed class
│ ├── screens/ # One package per screen
│ └── theme/ # Material 3 theme, colors, typography
├── notifications/ # WorkManager worker + notification helper
├── export/ # PDF and JSON exporters + JSON importer
├── di/ # Hilt modules
└── util/ # Extensions, status logic, car data, form utils
Clean Architecture layers are kept strict — the presentation layer never imports Room entities directly from the data layer (with the pragmatic exception that entities serve as domain models to keep the project lean — no mapper boilerplate).
- Clone the repo
- Open in Android Studio Hedgehog or later
- Run on a device or emulator (API 26+)
No API keys or external services required — fully local, fully offline.
Hananel Sabag — Android developer