null
077a408785
brand(art): add 12 generated illustrations to drawable-nodpi; gitignore brand source art
...
Phase 0 of wiring the generated brand art (full-res per request). Adds A1 pairing,
A2 answer-history, A3 challenges header, A4 memory-lane capsule, A5 date-match
empty+success, A6 bucket-list, A8 messages, A9 quiet-hours, A10 past-games,
A11 privacy-recovery, A12 account-deletion to res/drawable-nodpi. Source working art
(docs/brand/{generated-art,sources,exports}) gitignored — only app copies committed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 09:29:42 -05:00
null
95cad84cb5
brand: loading state, themes, manifest, art preview, pairing screen updates
2026-06-25 15:24:46 -05:00
null
520eea2236
brand: update launcher foreground, feature graphic, auth visuals, brand docs
2026-06-25 14:48:57 -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
4e2c3fdf0d
fix: rate limiter bump (20/day, 100/week), firestore rules for image messages, storage rules for chat_media, gitignore ClaudeReport
...
- NotificationRateLimiter: 20 partner/day, 100/week (was 2/4 — too tight for game activity)
- firestore.rules: messages create allows type=image with mediaUrl or type=text with ciphertext
- storage.rules: chat_media path with 15MB cap
- .gitignore: ClaudeReport.md, docs/img
2026-06-24 15:20:44 -05:00
null
9710bbc438
fix(challenges): error state snackbar, CTA routing for BOTH_COMPLETED/CHALLENGE_COMPLETE, README prem tiers
2026-06-23 10:04:53 -05:00
null
5d3ab8385d
feat: daily questions, answer reveal, home screens, auth, analytics, DB, repositories
2026-06-22 17:45:51 -05:00
null
ecc41a77d2
feat: wheel screen, play hub, storage data source, iOS wheel/play views
2026-06-22 10:25:58 -05:00
null
423081bdb2
chore(gitignore): add GoogleService-Info.plist
2026-06-21 21:18:22 -05:00
null
54fdaf831f
docs(manual): fix placeholder notification function descriptions, add new collections, biometric flow, iOS gitignore note
2026-06-21 18:47:18 -05:00
null
720b52a33b
chore: firebase config, gitignore updates, build tweaks
2026-06-21 16:07:19 -05:00
null
5c856d3de6
chore: gitignore .kotlin/ and review2.md
2026-06-21 08:15:34 -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
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
1441dcaebc
chore: add retention loops build plan to project root and gitignore
2026-06-19 22:15:41 -05:00
null
55ca3dce27
fix: Firestore rules hardening, recovery phrase strength, test cleanup (batch v0.2.12)
...
- Firestore rules: add isCouplesMember(coupleId) to question thread answer writes (prevents outsider writes)
- Firestore rules: allow currentIndex increment on same-status session updates (fixes thread progression)
- RecoveryKeyManager: PHRASE_WORD_COUNT 6→10 (~80 bits entropy)
- build.gradle.kts: exclude META-INF/versions/9/OSGI-INF/MANIFEST.MF (packaging conflict)
- .gitignore: add firebase-debug.log, firestore-debug.log
- firestore-tests: configurable emulator port via FIRESTORE_EMULATOR_PORT env var
- firestore-tests: fix invite outsider test (seed with different coupleId), fix non-starter session test (active→completed allowed), remove redundant beforeEach(seedThread), add outsider-write-denied test for thread answers
- visual-identity.md: update encryption claim gating note
2026-06-19 21:08:55 -05:00
null
3233c54ab2
feat: strict E2EE — encryption migration, Firestore rules enforcement, version 2 protocol (batch v0.2.11)
...
- Add CoupleAnswerMigrationDataSource: one-time per-user rewrite of all historical answer-bearing fields (daily answers, thread answers/messages, ThisOrThat, DesireSync, HowWell, Wheel) to ciphertext
- Add EncryptionUpgradeScreen + ViewModel: handles version-0→1→2 migration, recovery phrase display, partner coordination
- Add FieldEncryptorTest: round-trip, cross-couple binding, null-key, plaintext-not-leaked
- CoupleEncryptionManager: STRICT_ENCRYPTION_VERSION=2, requireAead() throws on missing key, setupLegacyCouple, pendingRecoveryPhrase/acknowledge
- CoupleKeyStore: pending recovery phrase storage/clear
- FieldEncryptor: switch from android.util.Base64 to java.util.Base64
- All data sources: use requireAead() (throws instead of silent plaintext fallback), encrypt all answer-bearing writes
- FirestoreCoupleDataSource: beginEncryptionMigration (atomic version-0→1 claim), markEncryptionMigrationComplete (per-user + version-2 promotion)
- CoupleRepositoryImpl: require wrappedKey on invite acceptance (no more optional)
- HomeScreen/ViewModel: route to EncryptionUpgradeScreen for version-0 or unmigrated version-1 couples
- Firestore rules: isCiphertext validator, isEncryptedAnswerPayload, isStartingEncryptionMigration, isCompletingOwnEncryptionMigration, isUpdatingRecoveryWrap, isUpdatingCoupleRhythm; enforce ciphertext on all answer/message writes; game collection rules (this_or_that, desire_sync, how_well, wheel) with per-user answer ownership; couple doc update split into 4 mutually exclusive paths; invite doc requires createdAt + wrappedKey fields; isImmutable uses diff().hasAny() instead of field equality
- Firestore rules tests: encryption migration scenarios, plaintext rejection, per-user answer ownership, game collection ciphertext enforcement
- firebase.json: emulator port 8180
- .gitignore: firestore-tests/node_modules
2026-06-19 20:53:52 -05:00
null
85bb8d9f69
feat: add DesireSync module with sexual_preferences questions and Room integration
2026-06-17 22:23:04 -05:00
null
6b964935d4
chore: remove functions/node_modules from git, add to .gitignore
2026-06-17 01:26:05 -05:00
null
ddfe9e250a
security: remove google-services.json from repo and git tracking, add to .gitignore
2026-06-16 21:47:42 -05:00
null
e8274370d1
chore: add CONCERN.md to .gitignore
2026-06-16 21:32:14 -05:00
null
bee617c493
chore(server): add Node.js backend with auth, questions, answers + update gitignore
2026-06-16 01:17:58 -05:00
null
5991acb283
chore(gitignore): exclude app/build/ from version control
...
app/build/ wasn't caught by /build pattern which only matches root dir. Removes ~200 build artifact files from tracking.
2026-06-15 21:38:39 -05:00
null
92c82e5fd4
chore: wipe RN/Expo stack, prepare for Kotlin/Compose project (batch 0.1.1)
2026-06-15 18:32:27 -05:00
null
1a1357d5c9
feat: Expo project bootstrap (v1.0.1) + untrack private docs
2026-05-13 04:21:43 -05:00