# 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
## 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**: 20 curated categories across 2,500+ 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
```text
.
├── 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:
```bash
cp local.properties.example local.properties
```
Then add local-only values such as:
```properties
sdk.dir=/path/to/Android/Sdk
RC_API_KEY=your_revenuecat_android_key
```
### Android
```bash
./gradlew :app:assembleDebug
./gradlew :app:installDebug
```
Useful verification command:
```bash
./gradlew :app:compileDebugKotlin
```
### Firebase Functions
```bash
cd functions
npm install
npm run build
npm run serve
```
### Optional Server
```bash
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.