Built to see photos of my kids on my phone.
A local first android app that turns a group of photos into a wallpaper, lock screen and screen saver. Add photos to a group, describe what it should find ("the kids at the beach"), or both.
| Lock screen | Home screen | A group |
|---|---|---|
![]() |
![]() |
![]() |
Taken on a Pixel 8 and a Pixel 8 emulator with demo photos from picsum.photos. On a tablet the same page widens to six columns: docs/screenshots/6-tablet.png.
Requires JDK 17 or newer and the Android SDK (compileSdk 37). No Android Studio needed.
./gradlew :app:assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apkMinimum Android 9 (API 28). Gemini Nano judging needs a phone on Google's Prompt API device list with Google AICore installed; elsewhere descriptions match on ML Kit labels alone.
- Open the app. Tap New group. Add photos with the picker, type what to find under Also find, or both.
- Tap Set active to put a group on both screens, or open a group and choose home, lock, both, or the screen saver switch. On a foldable, a group can take the cover screen on its own.
- Set the rhythm: every so often (15 minutes to a day) or at set times. Pick Still or Motion under Look.
- Turn rotation on. Next photo advances right away; tap a photo in a group for Show now.
A description looks through photos you choose in the picker (tap Find photos, up to 100 at a time, Google Photos included) and keeps the ones that match; they join the same grid with a Found badge. Tap X to keep one out for good. The app asks for no photo permission and has no network access. The screen saver plays under Settings > Display > Screen saver once Feels Engine is chosen there.
app/src/main/kotlin/dev/fengine/wallpaper/: the app.ui/screens and the design language,data/settings and groups,schedule/rotation,wallpaper/crop and apply,smart/descriptions,screensaver/the DreamService.app/src/test/: JUnit examples and jqwik invariant properties.docs/: architecture, build, privacy, design system, research.AGENTS.md,CLAUDE.md: how agents work in this repo.
./gradlew :app:testDebugUnitTest # unit tests + properties
./gradlew :app:lintDebugCI runs both plus a debug build on every push. Tagged releases carry a signed APK; see docs/release.md and the Releases page.
Device notes, including Samsung foldables and the screen saver preview, are in docs/build.md.
- The system photo picker hands over at most 100 photos per pick, and Android keeps at most 512 picked photos readable per app. A large library has to be on the phone; see
docs/privacy.mdand the audit. - Without Gemini Nano, descriptions match label words, not meaning.
- The app cannot read the current wallpaper back on Android 14+, so a rotation cannot be undone from inside the app.
https://trvon.github.io/feels-engine/ is the landing page; the privacy policy is at https://trvon.github.io/feels-engine/privacy.html. Both are built from site/ by the Pages workflow.
docs/index.md lists everything. Start with docs/architecture.md and
docs/research/android-wallpaper-audit.md.
Apache License 2.0. See LICENSE and NOTICE.


