Can you see the difference?
Huezoo is a color perception game — and a personal experiment in what happens when you push UI design, interactions, and touch controls as far as they can go on mobile.
The design system was built from imagination with help from Stitch by Google and iterated entirely using Claude. The goal was simple: build something that feels alive. Every animation, transition, and surface exists to make the act of tapping a color feel satisfying. Color is close to my heart — building a game around it felt like the right way to explore the limits of what Compose Multiplatform can do.
The scoring is based on ΔE (Delta E) — the scientific measure of color difference used by designers, display engineers, and color scientists. The lower your ΔE, the harder the difference you spotted. A ΔE below 1.0 is considered imperceptible to the human eye. Chase it.
The Threshold — your personal perception limit. Six color swatches. One is the odd one out. Tap it correctly and the ΔE shrinks. Wrong tap and it's over. How low can you go?
Daily Challenge — same puzzle for every player on the planet, every day. Six rounds. One attempt. Your score lives on the leaderboard.
This project is a learning ground — an exploration of what it feels like to build a polished, opinionated mobile product:
- How far can you push custom shapes, neon glows, and kinetic animations in Compose before it breaks?
- Can a shared Compose UI feel truly native on both Android and iOS?
- What does a design system built entirely without Material Design look like?
- How much of a real product — billing, ads, CI/CD, crash reporting — can be built by one person?
The answer to all of the above turned out to be: further than expected.
| Area | Technology |
|---|---|
| UI | Compose Multiplatform (Android + iOS, shared UI) |
| Language | Kotlin Multiplatform |
| DI | Koin |
| Local Storage | SQLDelight |
| Crash Reporting | Firebase Crashlytics |
| Analytics | Firebase Analytics |
| Monetisation | Google Play Billing (Android) · StoreKit (iOS) · AdMob |
| Color Science | CIEDE2000 ΔE algorithm — pure Kotlin, no dependencies |
| Design | Custom design system — no Material, built with Stitch + Claude |
Single shared module (composeApp) with clean platform separation:
composeApp/
├── commonMain/ — all UI, game logic, color math, view models
├── androidMain/ — Android billing, AdMob rewarded ads
└── iosMain/ — StoreKit billing, iOS-specific platform calls
androidApp/ — thin Android shell (Activity + Firebase config)
iosApp/ — Xcode project + Fastlane for TestFlight CI
Color math lives in commonMain — the CIEDE2000 formula is implemented in pure Kotlin so it runs identically on both platforms with zero platform divergence.
Huezoo has a full design system (custom shapes, modifiers, color tokens, spacing scale, typography) and follows Clean Architecture principles — unidirectional data flow, ViewModels, repositories, use cases, and a clear separation between UI, domain, and data layers.
What it deliberately does not have is multi-module separation (:core, :feature:threshold, :design-system, etc.).
This was a conscious call. The focus of this project is UI, interaction, animation, and color — not module graph management. In a solo project at this scale, splitting into modules would mean spending the majority of time on Gradle configuration, inter-module dependency wiring, and build performance tuning — none of which moves the actual product forward. The assumption is that anyone reading this code understands that modularisation is a team/scale problem, not an architecture purity requirement.
Separation of concerns is enforced through package structure and naming conventions instead. If this ever grows into a team project or the codebase becomes significantly larger, extracting modules is a straightforward refactor — the boundaries are already clearly drawn in the code.
- JDK 21+
- Android Studio (latest stable) or IntelliJ IDEA
- Xcode 16+ (for iOS)
- Firebase project — drop config files in:
androidApp/src/debug/google-services.jsonandroidApp/src/release/google-services.jsoniosApp/iosApp/GoogleService-Info.plist
./gradlew :androidApp:assembleDebugOpen iosApp/iosApp.xcodeproj in Xcode and run on a simulator or device.
./gradlew detektGitHub Actions workflows handle the full release pipeline:
| Workflow | Trigger |
|---|---|
| Code quality (Detekt + build) | Every push to main |
| Distribute to Firebase App Distribution | RC branch |
| Upload to Google Play (internal track) | Release branch |
| Upload to TestFlight | Release branch |
See docs/ci_cd/CI_SETUP_CHECKLIST.md for the full secrets and variables setup guide.
Coming soon to the App Store and Google Play.
Copyright 2025 Karan Sharma.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
- 🌐 Website: huezoo.app
- 📧 Email: hey@huezoo.app