KitchenKeep
An offline grocery list app with a store mode, reusable templates, spending breakdowns, and restock suggestions.
A mobile app designed and built by Hassan Ur Rahman.
Overview
KitchenKeep is an Android grocery list app for households that shop regularly and want their lists and spending in one place. You keep several shopping lists, add items with quantities, units, notes, and prices, sort them into categories, and tick them off in a large-tile Store Mode while you shop.
Everything is stored on the device, with no account and no network calls. Each checked-off item is logged to a purchase history, which powers spending breakdowns by category and month and suggests items you regularly buy when they are due again. Item entry autocompletes from a built-in catalogue of about a thousand products, including South Asian names.
Key features
Multiple shopping lists
Create, rename, and delete lists, with items grouped by category and swipe-to-delete with undo.
Store Mode
A focused in-store view with large tiles, a progress bar, search, and unchecked items kept above checked ones.
Price capture at checkout
Checking off an unpriced item asks for its price, pre-filled with the last price you paid.
Spending tracker
Totals of what you bought, broken down by category and by month.
Restock suggestions
Learns how often you buy each item and suggests the ones that are nearly due, most overdue first. One tap adds an item to your list.
Templates
Save any list as a reusable template, including units, prices, and notes, and start new lists from it.
Smart entry, sharing, and search
Autocomplete with sensible default units, lists shared as formatted text with totals, and search across every list.
How it's built
- Clean-architecture layering: domain entities and repository interfaces, a data layer on sqflite, and a presentation layer of BLoCs, pages, and widgets.
- Four BLoCs for lists, items, templates, and search, wired up with GetIt dependency injection and provided at the app root.
- SQLite schema at version 13 with step-by-step migrations, foreign keys with cascading deletes, and indexes on list and item lookups.
- Restock suggestions are calculated from purchase history with SQL grouping plus an average-interval and due-ratio calculation in Dart.
- Settings such as currency, default sort, and per-category default units are stored in SharedPreferences. Material 3 light and dark themes follow the system setting.
Challenges & solutions
- Double-taps corrupting check state
- Checking an item flips its state atomically in SQL inside a transaction, then reads it back, and only writes to purchase history when the item actually becomes checked.
- Evolving the schema without losing data
- Thirteen versioned migrations upgrade existing installs in place. Column type changes rebuild the table inside a transaction, so a failed upgrade cannot leave the database half-migrated.
- Recording prices without nagging
- The last known price is looked up by normalised item name and filled in automatically when an item is added, so you are only asked for prices the app has never seen.
Tech stack
- Flutter
- Dart
- BLoC
- SQLite
- SharedPreferences
- GetIt
- Android