Por Comprar — Shopping List Helper
100% offline-first native Android mobile application to manage recurring household purchases and plan shopping trips by store.
Last updated:
The Problem
Forgetting recurring household purchases (groceries, toiletries, etc.) and wasting time building the shopping list because it's unclear what's missing for a given store.
The Solution
A local-first, cloud-free application with per-store categories, automatic recurrence rules (every N days) that bring items back once due, and a 'Going shopping' mode that filters only what's pending for one category, sorted by urgency.
Key Learnings
- Lightweight Reactive Flow Pipeline: centralizing Room Flow observation in MainActivity and propagating state to pure composable screens, avoiding external navigation/DI libraries for a focused utility.
- On-Demand Due Calculations: due dates are evaluated deterministically at UI render time (Item.isDue(now)), avoiding battery-draining WorkManager workers.
- Atomic Relational Operations: using Room @Transaction to atomically move items across foreign-key-restricted categories prior to deletion eliminates database integrity corruption.
- Resilient Compose State: form inputs use rememberSaveable to withstand configuration changes and screen rotations without heavyweight ViewModels.
Offline-First Architecture With No Unnecessary Dependencies
Por Comprar is a single-module Android app: Kotlin, Jetpack Compose with Material 3, and Room — no backend, no dependency-injection framework, no navigation library. All state is observed as a reactive Flow from MainActivity and propagated down to pure composable screens, avoiding the complexity of external libraries for a focused utility.
- No background processes: due items are calculated deterministically at render time (
Item.isDue(now)), avoidingWorkManagerand saving battery. - Transactional referential integrity: relocating items and deleting a category happens inside a single Room transaction, backed by a foreign key restriction (
RESTRICT) that prevents orphaned data. - 100% private: no accounts, telemetry, or server communication; all data stays on the device.
Shopping Cycle & Localization
- Automatic recurrence: buying an item with a recurrence rule hides it and brings it back into the list once it’s due again, with no manual intervention.
- Bilingual interface: all UI text lives in English and Spanish string resources, with support for Android 13+’s per-app language setting.
Note: You can explore the source code and build the APK directly from the GitHub repository.
This page is a high-level summary. The GitHub repository is the source of truth for each tool's current features. GitHub ↗