~/projects-hub/projects/shopping-list-helper
Active
Por Comprar — Shopping List Helper icon
MobileProductivityAndroidHome
KotlinJetpack ComposeMaterial Design 3Room Database

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)), avoiding WorkManager and 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 ↗