Go to file
null e7b45cc84f fix: profile photo temp dir, Firestore rules field-level lockdown (batch v0.2.10)
- Move temp profile photos to filesDir/photos/ subdirectory with mkdirs
- Update file_paths.xml to scope FileProvider to photos/ subdirectory
- Firestore rules: restrict couple doc updates to only mutable fields (streakCount, lastAnsweredAt, wrappedCoupleKey, kdfSalt, kdfParams, encryptionVersion) — prevents client from overwriting currentQuestionId, activePackId, id
2026-06-19 20:33:08 -05:00
.vscode feat(db): add 2 new v2 question categories (difficult_conversations, home_life) — 20 total, 5,500 questions 2026-06-15 21:38:22 -05:00
app fix: profile photo temp dir, Firestore rules field-level lockdown (batch v0.2.10) 2026-06-19 20:33:08 -05:00
docs feat: BrandMessageRotator — rotating privacy copy across screens (batch v0.2.9) 2026-06-19 20:24:50 -05:00
firestore-tests feat: update PrivacyScreen, add Firestore test scripts, gitleaks audit artifacts 2026-06-19 03:45:53 -05:00
functions feat: Cloud Functions — leaveCoupleCallable, onUserDelete cascade (batch v0.2.8) 2026-06-19 20:04:18 -05:00
gradle/wrapper feat: Firebase + RevenueCat stack, PLAN.md integration, 11 implementation batches (v0.1.0) 2026-06-15 18:43:43 -05:00
seed fix: Q2 grammar quality pass on emotional_intimacy, parenting, stress questions + app.db rebuild 2026-06-19 00:50:23 -05:00
server security: kimi-k2.7 review fixes — Ed25519 crypto API, Firestore rules try/catch removal, atomic idempotency, RevenueCat 8.20.0, rate limiter fix, remove plaintext fallback, tighten push wording 2026-06-16 22:42:53 -05:00
.eslintrc.js feat: Expo project bootstrap (v1.0.1) + untrack private docs 2026-05-13 04:21:43 -05:00
.firebaserc feat: Firebase project config — Firestore, Storage rules, Functions setup (batch v0.2.3) 2026-06-19 18:46:25 -05:00
.gitignore feat: add DesireSync module with sexual_preferences questions and Room integration 2026-06-17 22:23:04 -05:00
.prettierrc feat: Expo project bootstrap (v1.0.1) + untrack private docs 2026-05-13 04:21:43 -05:00
README.md fix: filter out empty-text/unknown-category questions from all DAO queries, regenerate app.db, handle deleted cloud question by falling back to random 2026-06-18 03:43:24 -05:00
build.gradle.kts feat: Firebase + RevenueCat stack, PLAN.md integration, 11 implementation batches (v0.1.0) 2026-06-15 18:43:43 -05:00
firebase.json feat: Firebase project config — Firestore, Storage rules, Functions setup (batch v0.2.3) 2026-06-19 18:46:25 -05:00
firestore.indexes.json feat: Firebase project config — Firestore, Storage rules, Functions setup (batch v0.2.3) 2026-06-19 18:46:25 -05:00
firestore.rules fix: profile photo temp dir, Firestore rules field-level lockdown (batch v0.2.10) 2026-06-19 20:33:08 -05:00
gitleaks-current.json feat: update PrivacyScreen, add Firestore test scripts, gitleaks audit artifacts 2026-06-19 03:45:53 -05:00
gitleaks-history.json feat: update PrivacyScreen, add Firestore test scripts, gitleaks audit artifacts 2026-06-19 03:45:53 -05:00
gradle.properties feat: Firebase + RevenueCat stack, PLAN.md integration, 11 implementation batches (v0.1.0) 2026-06-15 18:43:43 -05:00
gradlew refactor: package rename from com.couplesconnect.app to app.closer, update build config and firebase setup 2026-06-16 20:03:58 -05:00
gradlew.bat refactor: package rename from com.couplesconnect.app to app.closer, update build config and firebase setup 2026-06-16 20:03:58 -05:00
local.properties.example feat: Firebase + RevenueCat stack, PLAN.md integration, 11 implementation batches (v0.1.0) 2026-06-15 18:43:43 -05:00
seed_generator.py refactor: package rename from com.couplesconnect.app to app.closer, update build config and firebase setup 2026-06-16 20:03:58 -05:00
settings.gradle.kts security: kimi-k2.7 review fixes — Ed25519 crypto API, Firestore rules try/catch removal, atomic idempotency, RevenueCat 8.20.0, rate limiter fix, remove plaintext fallback, tighten push wording 2026-06-16 22:42:53 -05:00
storage.rules feat: Firebase project config — Firestore, Storage rules, Functions setup (batch v0.2.3) 2026-06-19 18:46:25 -05:00

README.md

Closer

Closer is a private Android app for couples who want a steadier way to talk, reflect, and make time for each other. It turns relationship check-ins into small, intentional rituals: one daily question, curated conversation packs, private answers, partner reveal flows, reminders, and date-planning tools.

The product is built as a native Kotlin app with Jetpack Compose and Firebase-backed sync. It is not a social network, not a therapy replacement, and not a productivity tracker. The core loop is simple: answer honestly, choose what to reveal, and keep a record of the conversations that mattered.

Screenshots

Closer onboarding screen Closer home dashboard Closer daily question answer screen Closer question pack library

Closer answer history Closer settings screen Closer login screen

What The App Does

Closer gives couples a shared space for guided connection:

  • Daily question: one prompt at a time, with written, scale, choice, and this-or-that answer modes.
  • Private-first answers: each person can answer privately before deciding whether to reveal or discuss.
  • Question packs: 22 curated categories across 6,000+ bundled prompts, including communication, conflict, trust, money, stress, intimacy, marriage, parenting, and date night.
  • Answer history: local answer storage, review flows, delete controls, and partner reveal support.
  • Discussion threads: question-specific conversation threads and reactions for follow-up.
  • Partner pairing: invite-code pairing, email invite flow, and partner-aware home states.
  • Spin wheel: category-based random questions for date nights, long drives, and low-pressure conversations.
  • Date tools: date matching, date planning preferences, and a shared bucket list foundation.
  • Settings and privacy: account, notification, subscription, relationship, privacy, and deletion screens.
  • Subscriptions: free and premium access paths powered by RevenueCat and Google Play Billing.

Product Shape

Closer is optimized for short, meaningful sessions rather than endless engagement.

Area Product Behavior
Home Shows the next best action based on pairing, daily question state, saved answers, and streaks.
Questions Uses local bundled content so the app remains fast and usable without waiting on the network.
Partner Sync Uses Firebase Auth and Firestore to isolate user, couple, invite, thread, and entitlement data.
Reminders Uses FCM plus local notification preferences and quiet-hour controls.
Premium Unlocks deeper packs, wheel history, expanded answer history, and future advanced suggestions.

Tech Stack

Layer Stack
Android Kotlin, Jetpack Compose, Material 3, Navigation Compose
Architecture Clean architecture split across core, data, domain, and ui
State ViewModel, Kotlin Coroutines, Kotlin Flow
Dependency Injection Hilt
Local Data Room, DataStore Preferences, bundled SQLite seed database
Backend Firebase Auth, Firestore, Cloud Functions, FCM
Observability Firebase Analytics, Crashlytics
Billing RevenueCat, Google Play Billing
Security Firebase App Check, Play Integrity
Backend Services TypeScript Cloud Functions and an optional Express webhook service
Android SDK min 26, target 35, compile 35

Repository Layout

.
├── app/                 # Native Android app
│   └── src/main/java/app/closer
│       ├── core/        # Firebase, analytics, billing, navigation, notifications, security
│       ├── data/        # Room, Firestore data sources, repositories, seed parsing
│       ├── domain/      # Models and repository contracts
│       └── ui/          # Compose screens and feature ViewModels
├── functions/           # Firebase Cloud Functions, TypeScript
├── server/              # Optional Express webhook/health service
├── seed/                # Question pack JSON and local DB generation
├── docs/                # QA notes, release prep, roadmap, screenshots
└── firestore.rules      # Firestore security rules

Getting Started

Prerequisites

  • Android Studio / Android SDK with JDK 17
  • Firebase project with Auth, Firestore, Cloud Messaging, Crashlytics, Analytics, and App Check
  • app/google-services.json
  • RevenueCat project and Android API key
  • Node 20 for Firebase Functions and server tooling

Create local config:

cp local.properties.example local.properties

Then add local-only values such as:

sdk.dir=/path/to/Android/Sdk
RC_API_KEY=your_revenuecat_android_key

Android

./gradlew :app:assembleDebug
./gradlew :app:installDebug

Useful verification command:

./gradlew :app:compileDebugKotlin

Firebase Functions

cd functions
npm install
npm run build
npm run serve

Optional Server

cd server
npm install
npm run dev

Data Model

Closer combines local-first question content with cloud sync for shared relationship state:

  • Room stores bundled question categories, questions, date plans, and date preferences.
  • DataStore stores local settings and lightweight preferences.
  • Firestore stores users, couples, invites, question threads, date matches, bucket-list state, and entitlements.
  • Cloud Functions handle reminder workflows, billing entitlement sync, RevenueCat webhooks, and security checks.
  • FCM delivers reminders and partner activity notifications.

Privacy And Safety Principles

  • Couple data is scoped by couple ID and protected by Firestore rules.
  • Answers are designed to be private first, then revealed intentionally.
  • Account deletion and privacy screens are part of the first-class app surface.
  • App Check and Play Integrity are included to reduce abusive backend access.
  • Subscription state is verified server-side instead of trusting only the client.

Current Status

This is a private MVP/internal testing codebase. The Android app builds, includes seeded question content, and has active flows for onboarding, auth, home, daily questions, packs, answer history, pairing, settings, wheel sessions, date tools, billing, notifications, and Firebase integration.

Release prep lives in:

  • docs/release/internal-testing-checklist.md
  • docs/release/store-assets.md
  • docs/qa/private-mvp-checklist.md
  • docs/qa/ui-review.md

License

Private project. All rights reserved.