English • Русский • Беларуская
Journal for your child's life
Photos, videos, moments — stored in your Immich. Journal syncs via Supabase.
Screenshots • Features • Quick Start • Setup • License
flutter pub get
flutter run --dart-define-from-file=.env
See Setup for Supabase and Immich configuration.
This section provides a full technical and functional overview for AI assistants working with the codebase.
MyKid is a Flutter (Dart) mobile app for parents to keep a journal of their child’s life. Each journal entry can contain: date, text description, place (location), photos/videos (stored as references to Immich assets), and an optional link to a child profile.
Children (children table): id, user_id, name, date_of_birth, immich_album_id (optional; album created in Immich for this child).
Journal entries (journal_entries table): id, user_id, date, text, assets (JSONB array of {immichAssetId, caption?}), child_id (optional FK to children), location (optional text), created_at, updated_at.
RLS: users can access only their own rows.
JournalListScreen, route /)
| FAB: create entry via modal: From camera | From gallery | Empty entry. |
JournalEntryScreen.JournalEntryScreen)
/children)
/import)
JournalEntryScreen in create mode./settings)
/settings-ai-providers): API keys for OpenAI, Gemini, Claude, DeepSeek; select default provider for “Generate description” in journal entries.lib/core/: config (Supabase URL/key), ImmichClient/ImmichService/ImmichStorage, photo_metadata (EXIF date/GPS→place), ai_provider_storage (API keys + selected provider), ai_vision_service (Vision / DeepSeek text), on_device_image_labels (ML Kit labels for DeepSeek on Android/iOS).lib/data/: Child, JournalEntry, JournalEntryAsset; JournalRepository (Supabase CRUD), ChildrenRepository; JournalCache (Hive).lib/features/auth/: AuthGuard, LoginScreen, SignUpScreen.lib/features/journal/: JournalListScreen, JournalEntryScreen.lib/features/children/: ChildrenListScreen, ChildEditScreen.lib/features/import/: BatchImportScreen.lib/features/settings/: SettingsScreen, AiProviderSettingsScreen./ — journal list (guarded)/login — login/signup — signup/settings — settings/settings-ai-providers — AI provider API keys and default provider/children — children list/import — batch importSUPABASE_URL, SUPABASE_ANON_KEY — from .env or --dart-define-from-file=.env.Create a .env or use --dart-define so the app can reach Supabase. Do not commit real keys.
SUPABASE_URL — your Supabase project URL (e.g. https://xxxx.supabase.co)SUPABASE_ANON_KEY — Supabase anonymous (public) keyExample .env.example:
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=your-anon-key
The app also supports loading these from a config file or build-time defines; see lib/core/config.dart.
Table journal_entries and API are described in docs/backend.md.
In the app: Settings → Immich: set your Immich server URL and API key (create the key in your Immich instance). All photo/video uploads and thumbnails use this connection.
To use “Generate description” in journal entries, go to Settings → AI providers: add one or more API keys (OpenAI, Gemini, Claude, DeepSeek) and select the default provider. Keys are stored only on device. See docs/ai-providers.md for details and how DeepSeek uses on-device labels.
Copy .env.example to .env, fill in your Supabase URL and anon key, then:
flutter pub get
flutter run --dart-define-from-file=.env
Or pass defines explicitly:
flutter run --dart-define=SUPABASE_URL=https://your-project.supabase.co --dart-define=SUPABASE_ANON_KEY=your-anon-key
(Use an Android device/emulator first; iOS requires a Mac and proper signing. If the ios/ folder is incomplete, run flutter create . to regenerate platform files; camera/photo usage descriptions are already in ios/Runner/Info.plist.)
When the app cannot reach Supabase, the journal list falls back to the last cached entries (Hive). After going back online, pull-to-refresh to sync again.
lib/ — Flutter app
main.dart — entry, Supabase init, Hive cache initcore/ — config, Immich client, secure storage, AI provider storage & vision service, on-device image labels (ML Kit)data/ — models, Supabase repository, local cache (Hive)features/ — auth, journal list/detail, settings, AI provider settings, batch importdocs/ — full_schema.sql (apply once in SQL Editor), backend.md (schema, API), ai-providers.md, immich-api.md, edge-function-setup.mdFor store compliance, the app includes links to Privacy Policy, Terms of Use, Support, Account Deletion, and Data Export. Configure in .env:
PRIVACY_POLICY_URL=https://scroodge.github.io/MyKid/privacy.html
TERMS_OF_SERVICE_URL=https://scroodge.github.io/MyKid/terms.html
SUPPORT_URL=mailto:scroodgemac@gmail.com
ACCOUNT_DELETION_URL=mailto:scroodgemac@gmail.com?subject=Account%20Deletion%20Request
DATA_EXPORT_URL=mailto:scroodgemac@gmail.com?subject=Data%20Export%20Request
SOURCE_CODE_URL=https://github.com/scroodge/MyKid
SPONSOR_URL=https://github.com/sponsors/scroodge
Or use --dart-define=PRIVACY_POLICY_URL=... etc. when building.
The app calls the delete-account Edge Function, which removes the user and cascades to children, journal entries, household data. Deploy:
supabase functions deploy delete-account
Regenerate lib/oss_licenses.dart after changing pubspec.yaml dependencies:
dart run dart_pubspec_licenses:generate
Thanks to everyone who contributes to MyKid. See CONTRIBUTING.md for how to get involved.
If you find MyKid useful, consider supporting its development: