- Kotlin 73.9%
- JavaScript 25.2%
- Python 0.8%
- Dockerfile 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| app | ||
| assets | ||
| backend | ||
| docs | ||
| gradle | ||
| scripts | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| build.gradle.kts | ||
| docker-compose.yml | ||
| Dockerfile | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| settings.gradle.kts | ||
| SUMMARY.md | ||
SamePlate
SamePlate helps two people plan meals together.
- Plan meals on a shared calendar.
- Keep recipes, ingredients, pantry items, and day notes in one place.
- Mark a meal as eaten. Shared meals need both votes. Past days count as eaten automatically, with real votes shown separately.
- Add profile photos, your own profile banner, a shared Stats banner, and your own calendar color.
- Choose light, dark, or pure black mode, with optional Android wallpaper colors.
Install
Download the signed Android APK from Releases. It works on Android 10 or newer, on ARM64 devices.
Enter your household's server address and sign in. To create an account, ask the person running the server for its setup code. Each household supports two accounts. Your login stays saved when you close the app. Sessions last 30 days.
A short guide appears after your first login. You can open it again from Profile → How to use SamePlate.
Updates
The app checks for releases when opened, at most once every six hours. It also checks while open. You can check any time in Profile → Check for updates.
When a new version is ready, tap the banner at the top. The app explains how to allow updates from SamePlate in Android settings, downloads the APK, and opens Android's install confirmation. Updates keep your account and saved data.
Run your own server
See the Docker setup or the backend guide. The server uses Node.js and SQLite. Keep its data volume when updating it.
Build
You need Java 17 and the Android SDK (API 35). Set sdk.dir in your local
local.properties file, then run:
./gradlew :app:assembleDebug
The APK is in app/build/outputs/apk/debug/. For a desktop preview:
./gradlew :app:run
Run the tests with:
./gradlew :app:desktopTest
npm ci
npm test
For signed releases, see Publishing an update.
Offline sync and conflict review are implemented. The app exposes "Review changes" from its sync notice, showing the current server version and attributed alternatives with choose-current/choose-edit actions. Deleted versions and independently added same-day meal drafts are supported; contested calendar days use the conflict tint. Queued requests retain their IDs across retries and restarts. Rejected device changes stay visible for retry or explicit discard. Previously loaded photos remain in the device photo cache. Sync retries while the app is running; background scheduling is not implemented.
Verify the shared sync state and desktop file persistence with:
./gradlew :app:checkOfflineSync
Reminder options under discussion: a meal notification at a chosen daily time, a prompt if tomorrow has no meal planned, and a pantry-expiry summary. Each should be opt-in per device with adjustable timing and quiet hours. Reminder notifications are not implemented yet. Barcode scanning is not required.