A Kotlin + Jetpack Compose cookbook for Android. Keep family recipes in a warm terracotta-and-sand book: import a PDF, snap a page, or type a recipe by hand. Ingredient lines toggle as a checklist, format as quantity measurement: ingredient, switch US ↔ Grams on the recipe page (cups and spoons convert with typical weights), and a batch scaler multiplies every quantity.
The book ships empty. Everything on Home comes from a PDF, a photo, or a recipe you type.
- Recipes home — Custom Recipebook header, All · Dinner · Baking · Saved filters. Tap + to reveal PDF / Camera / Manual. Empty state points at that plus button.
- Add recipe — pick a PDF (
application/pdfdocument picker), take or choose a photo, or enter a recipe manually. - PDF import — copies the file into app storage, reads a text layer when one exists, then opens a single review form (title, times, servings, ingredients, directions, notes). Dual metric on an ingredient line is dropped when a cup/spoon unit is present (
2 cups (250g) flour→2 cups: flour). Parenthetical notes stay on that same ingredient (1 onion (diced)is one line). Yield / Serves / Makes fill servings; volume yields such asYield: 2 cupsstay out of the ingredient list (the number goes to servings, the yield phrase to Notes). Prep / Cook / Total times fill when labeled. If extract fails, the PDF is still attached and you fill the form. - Recipe detail — optional hero photo, Edit (opens the same form as create/review and updates that recipe), US / Grams toggle (Grams converts cups, tablespoons, and teaspoons using typical ingredient densities;
~marks an approximate weight), Prep / Cook / Total chips when set, servings + batch scale (− / N× / +), tappable ingredient checklist (2 cups: all-purpose flour), numbered directions. PDF recipes can reopen the attached file. - Shopping & Settings — shopping lists ingredients you’ve checked off; settings stores the default unit system and can clear checklists.
- Local persistence — Room for recipes, attachments, and checklist state; DataStore for the unit preference. No account or backend.
- Android Studio Ladybug / Koala or newer (or command-line SDK)
- JDK 17+
- Android SDK 35, Build-Tools 35.0.0
- minSdk 26, targetSdk 35
# Point Gradle at your SDK (Android Studio does this for you)
echo "sdk.dir=$ANDROID_HOME" > local.properties
./gradlew :app:assembleDebugInstall the debug APK:
adb install -r app/build/outputs/apk/debug/app-debug.apkA copy of the last successful debug build is also written to dist/CustomRecipebook-debug.apk.
Open the project folder in Android Studio and run the app configuration on a phone or emulator (portrait).
com.customrecipebook.app (debug builds use .debug suffix)
./gradlew :app:testDebugUnitTest- Camera and storage access are used only when you choose those import paths.
- PDF text comes from the file’s text layer (content streams). Scanned image-only PDFs still import as an attached file with an editable blank recipe.
- Camera import attaches the photo; it does not run OCR in v1.