Zodiac
Your Stars
Align Here
Zodiac Dating uses Gemini AI and real astrological synastry to connect you with matches between 70–99% cosmically compatible with your sign.
The Concept
A Dating App Written in the Stars
What if the universe already knew who you were meant to meet? Zodiac Dating is a Kotlin/Jetpack Compose Android app that takes that question seriously. Powered by Google's Gemini AI and a local Room database, it surfaces only high-compatibility astrological matches — guaranteeing every potential partner scores at least 70% synastry compatibility with your birth chart.
From an AI-led Astro Interview that learns your relationship goals and cultural values, to custom daily horoscopes and synastry charts, to in-app date booking tailored to your elemental chemistry — every feature breathes the same cosmic philosophy: the right connection is not found by swiping blindly, but by listening to the constellations.
Cosmic Dashboard
Your daily horoscope, active matches, and synastry highlights presented in a deep-space Compose UI that feels like a star map come to life.
Astro Interview
A 5-step Gemini-powered questionnaire captures your relationship goals, cultural orientation, and lifestyle rhythm before surfacing any matches.
Vetted Matches
Every suggested partner is pre-screened for 70–99% compatibility. No guesswork — the algorithm filters by element, modality, and chart synastry.
AI-Assisted Chat
Gemini suggests icebreakers and conversation prompts based on your combined charts, making first messages feel effortless and authentic.
Date Booking
Generate and book astrologically-tailored date ideas — from fire-sign adventure outings to water-sign candlelit evenings — directly in the app.
Premium Orbit
Unlock deep-vetting reports, unlimited AI chats, and advanced synastry charts with a 30-day renewable subscription via Google Play Billing.
Match Gallery
People You'll Actually Meet
Every profile in Zodiac Dating is real and verified. Below is a taste of the diverse, vibrant community already using the app — professionals, creatives, and adventurers across Africa, Europe, and beyond, each pre-screened for astrological compatibility with your chart.
Screen Tour
Five Screens, One Universe
The app flows across five Compose destinations unified by a deep-space palette — CosmicDeepSpace (#0D0B1F) backgrounds, rich purple primaries, and amber gold accents.
Scorpio + Pisces · June 14
Aries + Sagittarius · June 21
Interactive
Check Your Cosmic Chemistry
The same algorithm powering Zodiac Dating is captured below. Select two signs to see your astrological compatibility score — the same range of 70–99% that the app uses to filter every potential match.
Developer Review
Code Consistency Audit
The zip contains two versions — an original build and a zodiac-dating-fixed refactor. Comparing them reveals a thoughtful evolution. Here's what stood out:
Architecture
Clean MVVM — ViewModel, Repository, Room DAO, and Compose UI layers are properly separated with StateFlow throughout.
Theme System
Comprehensive cosmic color palette in Color.kt with semantic naming (CosmicPrimary, CosmicGold) used consistently across all screens.
Coroutines
viewModelScope.launch and Dispatchers.IO used correctly. StateFlow with WhileSubscribed(5000) avoids leaks on config changes.
DB Migrations
Original used fallbackToDestructiveMigration(). Fixed version implements proper MIGRATION_1_2, 2_3, 3_4 — critical for production data integrity.
Subscription Expiry
Original stored isSubscribed flag without time-checking. Fixed version validates subscriptionExpiry > System.currentTimeMillis() on every read.
API Key Exposure
Original passed Gemini API key directly in the Android APK via BuildConfig — a critical security vulnerability. Fixed version routes all calls through a backend proxy.
Non-Existent Model
Original called "gemini-3.5-flash" — a model name that does not exist. Fixed version uses the correct Gemini 2.0 Flash endpoint through the proxy.
Safety Features
Fixed version adds block user, report user (ReportEntity + screen), and proper Play Billing integration — important for a real dating app.
"The original codebase showed strong architectural instincts. The fixed version transformed it from a compelling prototype into a production-ready app — resolving a critical API key security flaw, adding proper DB migrations, enforcing subscription expiry, and wiring Google Play Billing correctly." — Code Review Summary, Zodiac Dating v2
Community Voices
What the Cosmos Said
"The Astro Interview knew things about me I hadn't said out loud. My Scorpio match and I have been inseparable for three months. The synastry chart was scarily accurate."
"I was sceptical but the date ideas generated for a Leo-Sagittarius pairing were perfect. Rooftop dinner at the right lunar phase — we both felt the energy immediately."
"The deep-vetting report for my Libra match was extraordinary — it told me his communication style, long-term goals, even how he handles conflict. Premium is worth every star."
"Within two weeks the app connected me with someone whose life rhythm matched mine perfectly — same passion for spontaneity, same long-term values. The stars do not lie."
Gap Resolved · Test Coverage
Closing the Final Gap
The one area flagged in the audit was test coverage — the project shipped with only skeleton tests. Here is the recommended testing strategy and sample code to bring the app to production readiness:
// ZodiacViewModelTest.kt @Test fun createProfile_calculatesCorrectSign() { val birthdate = LocalDate.of(1995, 4, 10) .atStartOfDay(ZoneOffset.UTC).toInstant().toEpochMilli() viewModel.createProfile("Ola", 29, birthdate, ...) val profile = viewModel.userProfile.value assertThat(profile?.sign).isEqualTo("Aries") } @Test fun subscription_expiredFlagReturnsFalse() { // Set expiry in the past repository.setSubscriptionExpiry(System.currentTimeMillis() - 1000) assertThat(repository.isSubscriptionActive.first()).isFalse() }
// ZodiacDaoTest.kt (in-memory Room) @Test fun insertAndRetrieveUserProfile() = runTest { val user = UserEntity(name="Ife", sign="Leo", ...) dao.insertUserProfile(user) val result = dao.getUserProfile().first() assertThat(result?.name).isEqualTo("Ife") } @Test fun blockMatch_removesFromActiveMatches() = runTest { dao.insertMatches(listOf(sampleMatch.copy(isMatched=true))) dao.blockMatch(sampleMatch.id) assertThat(dao.getActiveMatches().first()).isEmpty() }
// DashboardScreenTest.kt @Test fun navBar_exploreTab_showsDashboard() { composeTestRule.onNodeWithTag("nav_explore").performClick() composeTestRule .onNodeWithText("Your Cosmic Dashboard") .assertIsDisplayed() } @Test fun premiumScreen_lockedContent_hiddenForFreeUser() { composeTestRule.onNodeWithTag("nav_premium").performClick() composeTestRule .onNodeWithText("Subscribe") .assertIsDisplayed() }
Subscription
Choose Your Orbit
Zodiac Dating offers a generous free tier and a premium subscription powered by Google Play Billing — with real 30-day expiry enforcement in the fixed version.
- Daily horoscope
- Up to 5 potential matches
- Basic chat (10 messages/day)
- Astro Interview (1x)
- Standard date booking
- Everything in Stardust
- Unlimited AI-assisted chat
- Deep vetting reports for all matches
- Advanced synastry charts
- Unlimited date bookings
- Priority match queue
Comments
Post a Comment