null
4b4f79361f
feat(backup): add onRestoreRequested and onRestoreFulfilled Cloud Functions (partner push + owner self-alert)
2026-06-30 20:43:22 -05:00
null
4dd60a6a4d
chore(date-memories): add compiled onDateReflectionWritten
2026-06-30 18:14:54 -05:00
null
2c47c222de
chore(date-memories): add compiled onDateHistoryCreated
2026-06-30 18:14:52 -05:00
null
d4cedaf304
chore(date-memories): update compiled function index
2026-06-30 18:14:50 -05:00
null
b7ad62054b
feat(date-memories): export onDateHistoryCreated and onDateReflectionWritten from index
2026-06-30 18:14:48 -05:00
null
7a5f4e9bbd
feat(date-memories): add onDateReflectionWritten Cloud Function
2026-06-30 18:14:46 -05:00
null
2eb21f42f9
feat(date-memories): add onDateHistoryCreated Cloud Function
2026-06-30 18:14:44 -05:00
null
6dddac4615
Revert "feat(date-memories): add onDateHistoryCreated + onDateReflectionWritten Cloud Functions (batch 5/8)"
...
This reverts commit 8829cffa7e .
2026-06-30 18:13:00 -05:00
null
8829cffa7e
feat(date-memories): add onDateHistoryCreated + onDateReflectionWritten Cloud Functions (batch 5/8)
2026-06-30 16:51:59 -05:00
null
d87603211a
feat(activity): ActivityScreen timeline, HomeScreen activity feed, HomeViewModel wiring, PartnerNotificationManager, sendThinkingOfYouCallable Cloud Function
2026-06-30 03:54:01 -05:00
null
e74b6f59af
feat(cloud-functions): onEntitlementChanged, acceptInviteCallable, onGameSessionUpdate, onAnswerRevealed, onMessageWritten — FirestoreUserDataSource E2EE, AppMessagingService, EditProfileScreen, iOS plan
2026-06-30 02:38:31 -05:00
null
2a5c40508e
feat(notifications): QuietHoursManager + NotificationSettingsScreen rewrite, Cloud Functions (streakReminder, quietHours, reengagement, gameRetention), UserRepository E2EE wiring, SettingsDataStore, firestore rules, wiring-scan
2026-06-30 00:38:06 -05:00
null
f51a55743c
feat(games): partner game-session push orchestration — in-app notification banner, Firestore rules, Cloud Function, QA docs
2026-06-28 22:24:46 -05:00
null
fa8005f25f
feat(functions): wrapReleaseKeyCallable — server-side Tink wrap for iOS→Android release keys (closes keybox Path A interop gap)
2026-06-28 17:19:06 -05:00
null
37ed7cebec
feat: quiet hours notifications, settings UI, game session updates, docs
2026-06-28 10:00:25 -05:00
null
4eed0a8115
feat(premium): couple-shared unlock notification + reveal retry + users update allowlist + brand glyphs
...
- New Cloud Function: onEntitlementChanged (Firestore onWrite on entitlements/premium) — edge-triggered inactive→active, notifies the OTHER partner so couple-shared unlock isn't silent
- New notification type SUBSCRIPTION_CHANGED → routes to SUBSCRIPTION
- AnswerRevealViewModel: re-issue markRevealed if best-effort failed (offline/transient) so partner_opened_answer push eventually fires
- firestore.rules: harden users/{uid} update allowlist (defense-in-depth; no live hole)
- 18 new brand glyph vector drawables (drawable-nodpi/)
- SettingsScreen / PlayHubScreen / WaitingForPartnerScreen: swap Material icons for new brand glyphs
- ClaudeQA docs + Future.md updated
2026-06-27 16:35:41 -05:00
null
2cd0af65a8
chore: working tree changes — QA docs, app tweaks, Cloud Functions updates
2026-06-27 13:31:09 -05:00
null
6e79cd9704
fix(notif): replace status-diff with idempotent flag-claim for game start/finish pushes (F-RACE-001)
2026-06-26 20:04:05 -05:00
null
47867b5663
feat(notif): onAnswerWritten detects both-answered — send 'unlocked' notification instead of 'go answer'
2026-06-26 12:40:41 -05:00
null
8b4c5ba005
feat(notif): add onAnswerRevealed cloud function — notify partner when answers are opened
2026-06-26 12:40:36 -05:00
null
765916a8ef
build(functions): recompile dist for E-OBS + E-003 results-ready changes
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 12:40:38 -05:00
null
21b078a180
fix(notif): set FCM channel on remaining reminder senders (E-OBS)
...
Add android.notification.channelId to the 4 senders not covered by the earlier batch:
scheduledOutcomesReminder + dailyQuestionReminder + reengagement -> 'reminders';
sendGentleReminderCallable -> 'partner_activity'. Completes E-OBS so backgrounded pushes land on
their proper channels (importance/sound + per-category toggle) instead of fcm_fallback. tsc green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 12:39:59 -05:00
null
aaab768cb0
fix(notif): deep-link results-ready pushes to per-session results/replay screen (E-003)
2026-06-25 12:35:49 -05:00
null
29beff1702
build(functions): rebuild dist from source — revenueCatWebhook ack-after-process, acceptInvite strict E2EE, onMessageWritten conversations path, onGameSessionUpdate both-partner notify
2026-06-24 16:15:30 -05:00
null
060ef69ca5
feat(rules+trigger): conversations Firestore rules, onMessageWritten listens on conversations path, gitignore
...
- firestore.rules: conversations doc read/write rules with ciphertext validation, messages subcollection create rules (image or ciphertext text)
- onMessageWritten: trigger path changed from question_threads to conversations, passes conversation_id in FCM data, removed questionId resolution (no longer needed)
- .gitignore: deduplicate ClaudeReport.md entry
2026-06-24 16:14:18 -05:00
null
a8fbbaa286
feat(notifications): deep link routing from FCM data extras, onMessageWritten includes author name + photo
...
- MainActivity: deepLinkRouteFromIntent resolves FCM data extras to navigation routes; pendingDeepLink state for onNewIntent
- AppNavigation: LaunchedEffect waits for HOME route before navigating deep link (fixes race with onboarding)
- onMessageWritten: includes author displayName + photoUrl in notification payload
2026-06-24 15:20:24 -05:00
null
609ced4095
feat(notifications): FCM token registration on auth, Android 13 permission request, in-app chat bubble overlay, game results notification copy
...
- MainActivity: request POST_NOTIFICATIONS on TIRAMISU+, register FCM token when user signs in
- AppMessagingService: foreground chat messages show draggable bubble instead of OS notification
- MessageBubbleController/Overlay: new in-app chat-head that drifts over all screens, tap to open
- PartnerNotificationManager: GAME_RESULTS_READY type with proper copy, partner_finished_game maps to it
- onGameSessionUpdate: notify BOTH partners on completion (not just the non-starter), fix starter name in notification
2026-06-24 11:47:49 -05:00
null
0cb3d44f0d
fix(reveal): partner option labels, release-key read rules, thread status uppercase, session id propagation, notification deep links, and re-open guard
...
- Firestore rules: partner can read user doc (name/photo), sender can read own release key
- QuestionThread: status stored UPPERCASE to match rules (lowercase broke discussion)
- GameSessionManager: propagate auto-generated session id (empty id crashed game start)
- AnswerReveal: decrypt partner's selectedOptionTexts from option IDs (showed raw ids)
- FirestoreAnswerDataSource: tolerate Timestamp/Date in updatedAt (serverTimestamp crash)
- FirestoreReleaseKeyDataSource: tolerate PERMISSION_DENIED on existence check (sender can't read)
- QuestionThreadRepository: runCatching status update (legacy lowercase status blocked submit)
- PartnerNotificationManager: suppress notification for active thread, deep link to thread
- ActiveThreadMonitor: new class tracks which thread user is reading (suppresses own notifs)
- DesireSync/HowWell/ThisOrThat: re-open guard skips INTRO if already answered; blank sessionId guard
- AppNavigation: deep link pattern for chat notification
2026-06-24 10:02:54 -05:00
null
06e09da596
docs(readme): add privacy slogan to header
2026-06-23 22:14:36 -05:00
null
17d7489dd8
feat(engagement): streak milestones, celebration overlays, Together screen, avatar in notifications
2026-06-23 18:23:49 -05:00
null
039752d691
refactor(e2ee): remove v0/v1 migration paths, fail-closed decrypt, strict-only rules
2026-06-23 17:06:23 -05:00
null
7d3b47b3ba
fix(firestore): handle Timestamp type for lastAnsweredAt/createdAt in Android + Cloud Function
2026-06-23 12:40:00 -05:00
null
658ead38cd
security: App Check enforcement on all callables, fail-closed device integrity, no raw code in logs; release signing config; iOS RevenueCat log level
2026-06-23 10:56:42 -05:00
null
5e16177eb2
feat: code push -- notifications, cloud functions, iOS updates
2026-06-22 08:53:23 -05:00
null
9166721282
feat: notification improvements + daily question reminder cloud function
2026-06-22 08:34:15 -05:00
null
af70280daa
feat: E2EE recovery flow, iOS parity updates, onboarding + pairing polish
2026-06-21 11:20:48 -05:00
null
0a377ecdda
fix(accept-invite): dynamic encryptionVersion, Firestore TTL on attempt docs, wipe recoveryPhrase on accept
2026-06-21 09:13:29 -05:00
null
26419ce08d
feat: remove email invite screen, add accept-invite rate limiting, clean up iOS pairing (v0.2.2)
2026-06-21 08:55:43 -05:00
null
57a3e35359
feat(outcomes): add 30/60/90 day check-in flow with baseline + reminders
2026-06-20 23:59:24 -05:00
null
2a1e5fad10
feat(functions): add createInviteCallable and tighten invite rules
2026-06-20 23:28:20 -05:00
null
7898a4887f
fix(functions): add server-side throttle to gentle_reminders callable
2026-06-20 23:27:54 -05:00
null
8967fd23cd
fix(crypto): define single source of truth for encryptionVersion and document v0/v2 drift risk
...
- Add EncryptionVersion.kt with constants PLAINTEXT(0), MIGRATING(1), STRICT(2)
- Route CoupleEncryptionManager through the new constants and add explicit v2 branch
- Comment acceptInviteCallable.ts:91 explaining the version and sync contract
- Add TODO in iOS FirestoreService.swift warning that iOS MVP creates v0 couples
Fixes Risk #2 from review.md.
2026-06-20 22:29:43 -05:00
null
1f777e827d
feat: add onMessageWritten cloud function, notification settings screen, user repo cleanup
2026-06-20 18:25:05 -05:00
null
4dad0e774e
refactor: update crypto, invite flow, and account screen patterns
2026-06-20 18:09:46 -05:00
null
0e75b3b536
feat: add gentle reminder callable and wire into HomeViewModel (batch v1.0.12)
...
- GENTLE_REMINDER notification type with warm copy
- sendGentleReminderCallable Cloud Function
- HomeViewModel.sendGentleReminder() calls function, shows snackbar
- Snackbar event consumed after display
2026-06-19 23:47:01 -05:00
null
39255c8733
fix: prevent invite code enumeration via Cloud Function (batch v0.2.18)
...
- Remove client-side read access to invites (only inviter can read own invite)
- Deny direct client update to invites (server-side only via Admin SDK)
- Add acceptInviteCallable Cloud Function: validates code, creates couple,
updates user docs, marks invite accepted, returns wrapped key for local decryption
- Update Android client: FirestoreInviteDataSource calls callable function,
InviteConfirmViewModel uses acceptInvite + unwrapAndStore flow
- Deprecate CoupleRepositoryImpl.createCouple (client-side path removed)
- Update Firestore rules tests: unpaired read now denied, direct update now denied
- 118/118 tests passing
2026-06-19 21:46:12 -05:00
null
6828be72fc
feat: Cloud Functions — leaveCoupleCallable, onUserDelete cascade (batch v0.2.8)
...
- Add leaveCoupleCallable: HTTPS callable that atomically unlinks couple via Admin SDK (clears both user coupleIds, recursiveDelete couple doc)
- Add onUserDelete: Auth deletion trigger that cascades cleanup — unpairs partner, sends FCM notification, deletes Storage objects, recursiveDelete user doc
- Replace client-side batch leaveCouple with callable invocation (Firestore rules prevent cross-user writes)
- Remove CoupleRepository/UserRepository from DeleteAccountViewModel — cleanup now handled by onUserDelete trigger
- Wire new functions into index.ts exports
2026-06-19 20:04:18 -05:00
null
0e0a33a6dd
feat: add FCM game retention notification functions, messaging service updates, ThisOrThat screen fixes
2026-06-19 02:23:52 -05:00
null
2b8e05b29b
fix: address Neo review — fix cloud function partnerName scope, WheelCompleteScreen session ID, polling isActive, navigateTo reset
2026-06-18 01:28:43 -05:00
null
c58b1c6326
feat: enforce one active game per couple with partner notifications
2026-06-18 00:56:21 -05:00
null
c0696cfb80
feat: partner leave notification, real-time couple state sync, in-app unpair alerts
2026-06-18 00:25:52 -05:00
null
eaac8ffcc9
feat: couple-scoped daily question, answer sync, partner notifications, and answer review
2026-06-18 00:18:05 -05:00
null
84390a48fc
fix: test infrastructure and entitlement logic updates
2026-06-17 21:08:13 -05:00
null
c816033e74
feat: cloud function for date match cleanup, ViewModel and repo improvements
2026-06-17 20:26:24 -05:00
null
ec315c63e0
feat: add App Integrity + device attestation modules
2026-06-17 19:37:19 -05:00
null
534bb076c7
feat: implement Ed25519 RevenueCat webhook signature verification
2026-06-17 19:08:53 -05:00
null
f3bad90ec6
feat(notifications): FCM token registration, quiet hours, notification permission helper, reminder Cloud Functions (batch 11)
2026-06-17 01:30:04 -05:00
null
6b964935d4
chore: remove functions/node_modules from git, add to .gitignore
2026-06-17 01:26:05 -05:00
null
b9ad713ddb
feat(billing): server-side entitlement sync — RevenueCat webhook handler, entitlement logic, Firestore EntitlementChecker, Hilt DI, callable sync function (batch 10)
2026-06-17 01:25:51 -05:00