Track expiry dates for food, medicine, and cosmetics — powered by Android AppFunctions
Shelfly is a minimal Android app for tracking when things on your shelf expire — groceries, medicines, skincare, and anything else with a best-before date. Instead of hunting through kitchen cabinets when you're already sick, you get a nudge before things go bad.
The differentiator: Shelfly exposes its entire data surface as Android AppFunctions, so Gemini (and any future on-device AI agent) can add, list, update, and delete items through natural conversation — no typing required.
- Add items with category (Food / Medicine / Cosmetic / Other), expiry date, quantity, and notes
- Status-aware home screen — items are colour-coded: Fresh → Expiring Soon → Expired → Consumed
- Filter & Sort — filter by status, sort by expiry date, category, name, date added, or quantity
- Item detail — full view with consume / edit / delete actions
- Daily background check via WorkManager — notifies when items enter your reminder window (1–14 days configurable)
- Custom notification with category chip badges rendered via RemoteViews
- Group or separate — one grouped notification for all expiring items, or one per item so you can dismiss them individually
- Quiet hours — no alerts between 10 pm and 8 am
- Immediate alert when you add an item that's already within the expiry window
Shelfly registers 9 AppFunctions callable by Gemini or any on-device AI agent:
| Function | What it does |
|---|---|
addItem |
Add an item with full metadata |
addItemFromMfg |
Add using manufacture date + shelf life |
listExpiringSoon |
List items expiring within N days |
listExpired |
List all expired items |
listByCategory |
Filter by Food / Medicine / Cosmetic / Other |
getItem |
Look up a single item by ID |
markConsumed |
Mark an item as consumed |
updateExpiry |
Change the expiry date of an existing item |
deleteItem |
Remove an item permanently |
- First-launch onboarding wizard with optional notification permission request
- Dynamic color theming (Material You)
- Live notification preview in settings
| Layer | Library |
|---|---|
| Language | Kotlin 2.1.0 |
| UI | Jetpack Compose + Material 3 |
| Architecture | ViewModel + StateFlow + Unidirectional data flow |
| Database | Room 2.6.1 (KSP) |
| Dependency Injection | Hilt 2.52 (KSP) |
| Background Work | WorkManager 2.9.1 (HiltWorker) |
| Preferences | DataStore Preferences |
| Navigation | Navigation Compose |
| AppFunctions | androidx.appfunctions:1.0.0-alpha08 |
Min SDK: 33 (Android 13) · Target / Compile SDK: 36 (Android 16)
AppFunctions are runtime-gated to API 36+ — the app runs normally on API 33–35 without the AI agent integration.
git clone https://github.com/ishubhamsingh/Shelfly.git
cd Shelfly
./gradlew assembleDebugRequires Android Studio Meerkat or newer and a device / emulator running Android 13 (API 33) or higher.
AppFunctions only work on API 36 Google APIs images. On API 33–35 the app runs normally but the AI agent integration is unavailable.
# List registered functions
adb shell cmd app_function list-app-functions --package dev.ishubhamsingh.shelfly
# Call the ping function
adb shell cmd app_function execute-app-function \
--package dev.ishubhamsingh.shelfly \
--function dev.ishubhamsingh.shelfly.appfunctions.ShelflyAppFunctions#ping \
--parameters '{"message":"hello"}'Copyright 2026 Shubham Singh
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.









