Commit Graph

203 Commits

Author SHA1 Message Date
null 720b52a33b chore: firebase config, gitignore updates, build tweaks 2026-06-21 16:07:19 -05:00
null af70280daa feat: E2EE recovery flow, iOS parity updates, onboarding + pairing polish 2026-06-21 11:20:48 -05:00
null 62d99505c9 feat: subscription screen with clear pricing, restore, cancel instructions 2026-06-21 09:54:59 -05:00
null dff86eb089 feat: settings polish, privacy strings, home partner state, proguard rules 2026-06-21 09:49:02 -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 5c856d3de6 chore: gitignore .kotlin/ and review2.md 2026-06-21 08:15:34 -05:00
null ab9d746c46 docs: update README with store positioning, pricing philosophy (v0.2.1) 2026-06-21 08:15:20 -05:00
null a5aad4f0bf fix(outcomes): use AutoMirrored.TrendingUp to resolve icon import/type mismatch 2026-06-21 00:07:52 -05:00
null b70463274f fix(home): resolve OutcomeDay import for outcome dialogs 2026-06-21 00:03:02 -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 535c0ce668 feat(home): surface couple streak count on Home dashboard 2026-06-20 23:47:55 -05:00
null bc3317c65a feat(home): add "5-minute check-in" time budget framing to daily question card 2026-06-20 23:46:28 -05:00
null 2a1e5fad10 feat(functions): add createInviteCallable and tighten invite rules 2026-06-20 23:28:20 -05:00
null 6260b0500e fix(couples): align onCoupleLeave cloud function name with Android caller 2026-06-20 23:27:54 -05:00
null 7898a4887f fix(functions): add server-side throttle to gentle_reminders callable 2026-06-20 23:27:54 -05:00
null 71b230719b fix(firestore): harden isImmutable helper to reject non-list args 2026-06-20 23:14:47 -05:00
null fb371b10c8 fix(ios): register Closer source path in Package.swift and fix compile errors 2026-06-20 23:05:43 -05:00
null 59c239694a fix(ios): address Pass B warnings from code audit 2026-06-20 22:58:11 -05:00
null cb54ed3079 feat(ios): fix Pass A compile blockers from code audit 2026-06-20 22:54:21 -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 d5a17cc90d docs(readme): update with MVP scope, both platforms, iOS port status
- Add Closer tagline + private-space positioning at top
- Add explicit anti-scope (not social, not therapy, not productivity)
- Add Platform Status table (Android active, iOS in progress, backend shared)
- Add MVP scope split: Free / Premium / Out-of-Scope
- Add iOS folder layout with each layer's purpose
- Add iOS build commands (xcodegen + xcodebuild)
- Expand privacy section (App Check, server-verified subscriptions, E2EE note)
- Clear MVP status breakdown: complete / in-progress / release-prep
- Link HISTORY.md and PROJECT.md for deeper context
2026-06-20 22:20:31 -05:00
null bdd2bf27c0 feat(settings): add appearance screen with theme picker, refactor settings nav 2026-06-20 18:45:44 -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 09a2480359 refactor(android): update question thread and answer mapping patterns 2026-06-20 18:02:21 -05:00
null 2a5cd28397 refactor(android): update question flow and navigation patterns (batch 6) 2026-06-20 17:17:51 -05:00
null 67251537eb feat(ios): add native SwiftUI iOS app scaffold under /iphone/ (batch 1-6)
- ARCHITECTURE_AUDIT.md: full audit covering 49 screens, Firestore schema,
  35 domain models, 17 Cloud Functions, RevenueCat integration, auth flow,
  E2EE skip-for-MVP decision
- Project config: project.yml (XcodeGen), Info.plist, Closer.entitlements, Package.swift (SPM)
- Core: AuthService (rate limiter), FirestoreService (callable wrappers),
  BillingService (RevenueCat), NotificationService (FCM)
- Models: AuthState (ObservableObject), FirestoreModels (20+ codable types),
  DomainModels (35 structs)
- Theme: CloserTheme (50+ colors, typography, spacing), CommonViews
- Screens: Onboarding, pairing, home, daily questions, play hub + games
  (ThisOrThat, HowWell, DesireSync, ConnectionChallenges), spin wheel
  (animated 8-slice), dates (swipe cards, bucket list), settings + paywall
  (RevenueCatUI)
2026-06-20 17:15:25 -05:00
null c621c9fec5 chore: update store assets doc with 9 screenshots (batch v1.0.22) 2026-06-20 02:02:05 -05:00
null 38aedab962 chore: update README, screenshots, answer data source cleanup (batch v1.0.21) 2026-06-20 02:01:42 -05:00
null 9c1fbf60a0 fix: reveal screen UX and rules hardening (batch v1.0.20) 2026-06-20 01:51:02 -05:00
null 737514d18f fix: sealed reveal flow fixes (batch v1.0.19) 2026-06-20 01:40:24 -05:00
null b64ae1f29a fix: block answer delete in rules, enforce userId match on create (batch v1.0.18) 2026-06-20 01:19:02 -05:00
null 8de5990230 fix: add Tink dependency, release key cleanup, rules hardening (batch v1.0.17) 2026-06-20 01:10:20 -05:00
null 84eab1825b feat: add thread sealed answers, release key cleanup, rules hardening (batch v1.0.16) 2026-06-20 00:41:48 -05:00
null 4900d8ab6b fix: add answerDate to Firestore rules allowed fields (batch v1.0.15) 2026-06-20 00:26:52 -05:00
null a3993d08df feat: implement partner-proof sealed answers (batches 1-8)
- UserKeyManager: per-user keypair stored in Android Keystore
- SealedAnswerEncryptor: one-time answer key, sealed:v1 ciphertext
- PendingAnswerKeyStore: local EncryptedSharedPreferences storage
- ReleaseKeyEncryptor: keybox:v1 encrypted to recipient public key
- SealedRevealManager: full reveal flow with mutual key release
- AnswerCommitment: SHA-256 commitment hash over canonical payload
- FirestoreDeviceKeyDataSource: public key CRUD
- FirestoreReleaseKeyDataSource: release key CRUD
- FirestoreAnswerDataSource: sealed answer writes with schemaVersion=3
- FirestoreCollections: sealed answer and release key paths
- firestore.rules: ownership, immutability, timing, prefix enforcement
- HomeViewModel: sealed answer state integration
- AnswerRevealScreen/ViewModel: sealed reveal flow with UX states
- CloserApp: initialize UserKeyManager on startup
- LocalAnswer model: schemaVersion field
- Unit tests: SealedAnswerEncryptor, ReleaseKeyEncryptor, AnswerCommitment
- Crypto test vectors: docs/crypto/sealed-answer-test-vectors.json
- .gitignore: add partner-proof build plan
2026-06-20 00:23:58 -05:00
null 521989ec44 fix: remove duplicate comparison in StreakCalculator (batch v1.0.14) 2026-06-19 23:53:50 -05:00
null 195dfb5a0a refactor: replace PendingActionCard.action lambda with HomeActionTarget (batch v1.0.13)
- PendingActionCard now uses target enum instead of lambda
- HomeScreen routes pending actions through toActionHandler
- Remove onPendingAction callback, simplify HomeCallbacks
- Fix WeeklyRecapGenerator filter logic (remove always-true || true)
2026-06-19 23:51:47 -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 7dc14af627 feat: wire retention signals into HomeViewModel (batch v1.0.11)
- Replace TODO placeholders with real data source calls
- Add hasWaitingGame, hasActiveChallenge, hasUpcomingDatePlan, hasUnlockedCapsule, weeklyRecapReady
- Parallel async fetches in loadHome(), failures default to false
- FirestoreCapsuleDataSource.getCapsules() for capsule status checks
2026-06-19 23:42:54 -05:00
null 89213445b9 fix: add coEvery import and re-set settings flow in PartnerNotificationManagerTest (batch v1.0.10) 2026-06-19 22:52:27 -05:00
null fa501089f2 test: add unit tests for retention features (batch v1.0.10)
- PartnerNotificationManagerTest: notification creation, type mapping, deep links
- build.gradle.kts: enable Robolectric and default return values for unit tests
- AppRoute: fix NPE in asRouteArg when android.net.Uri is stubbed on test classpath
2026-06-19 22:51:08 -05:00
null 5698e5436a feat: add memory capsule generator for saving meaningful moments (batch v1.0.9) 2026-06-19 22:47:36 -05:00
null a500b86621 chore: update UI copy to match retention tone guidelines (batch v1.0.9) 2026-06-19 22:46:07 -05:00
null 3575af1b6f feat: add date suggestion engine for date planning loop (batch v1.0.8) 2026-06-19 22:44:33 -05:00
null 9db3c35f8d feat: add follow-up prompts after reveals (batch v1.0.7) 2026-06-19 22:43:40 -05:00
null 9040b97eb2 feat: add challenge loop state machine with 6 states and copy (batch v1.0.6)
- ChallengeState data model with 6 states: not started, started, waiting, both complete, missed, complete
- ChallengeStateMachine: pure Kotlin, configurable missed-day behavior
- 12 unit tests covering all states and edge cases
- Fix pre-existing missing import in AnswerRevealViewModel
2026-06-19 22:41:43 -05:00
null b1b35891c9 feat: add HomePriorityEngine and weekly recap generator (batch v1.0.5)
- HomePriorityEngine: 13-level priority system, primary + secondary CTA
- HomeScreen: add onNavigate to HomeContent, fix compile error
- WeeklyRecapGenerator: pure logic, counts, favorite category, suggested pack
- Privacy: hidden answers excluded from recap counts
- Unit tests for both engine and recap generator
2026-06-19 22:37:47 -05:00
null 935aee5ec5 feat: add partner-trigger notifications with rate limits and quiet hours (batch v1.0.4)
- PartnerNotificationManager: 6 notification types, static copy only
- NotificationRateLimiter: max 2 partner/day, 1 reminder/day, 4/week
- QuietHoursManager: default 10pm-8am, user-configurable
- NotificationChannelSetup: partner-actions channel (HIGH importance)
- PartnerNotificationScheduler: routes FCM events through manager
- AppMessagingService: safe static copy, drops unknown types
- Deep link navigation for all notification targets
- 3 test files covering quiet hours, rate limits, notification types
2026-06-19 22:34:42 -05:00