Inspiration

Hi, I’m JD. I’m based in Costa Rica, obsessed with specialty coffee, and have been building Android apps professionally for over a decade.

For years, I collected physical roaster cards from bags I brewed, but they always ended up crumpled in drawers or lost. Existing coffee tracking apps felt like doing taxes with endless dropdowns, manual typing, and cold corporate spreadsheets. I built Faint to give coffee the tactile, beautiful home it deserves: an editorial digital vault where snapping a photo of the bag or card instantly logs your cup without turning your ritual into homework.

With the Shipaton, I finally decided to step outside client work and take my first serious leap into indie development.

What it does

  • Dual-Face Camera Capture: Snap the front and back of any roaster card or bean bag; vision models pull varietals, elevation, process, and tasting notes into structured data in one shot.
  • Tactile 3D Cards: Digital cards flip with smooth physics to reveal origin terroir maps, brew ratios, and polaroid-style photos from your session.
  • Zero-Keyboard Dial-In: Tune your grind size, water ratio, and brew times using tactile sliders without opening a soft keyboard.
  • Local-First & Private: Everything stays on your phone. No mandatory accounts, no cloud lock-in.

How I built it

  • Kotlin Multiplatform (KMP) & Compose Multiplatform: 100% shared UI and business logic across iOS and Android. Persistence is handled offline-first with Room KMP, Koin for DI, and Ktor for networking.
  • Serverless Edge: A Cloudflare Worker proxy handles rate limiting and device quotas to protect AI inference costs before passing requests to vision models via OpenRouter.
  • Monetization with RevenueCat: Integrated RevenueCat to power Faint Pro (monthly/annual subscriptions). Managing paywalls, anonymous user entitlements, and offline receipt validation took hours instead of weeks, freeing me up to focus on the coffee experience itself.

Challenges & Honest Lessons

  • Balancing Generous Free Tiers with AI Costs: Vision tokens add up fast when you let users scan without paying upfront. I had to build token buckets and strict serverless edge caps in Cloudflare KV to ensure the app never ran in the red.
  • Going Cross-Platform as an Android Guy: After 10+ years living in Android Studio, shipping production iOS code with Compose Multiplatform was an exciting challenge, especially tweaking fluid physics and gesture handling to feel truly native on iPhone.
  • Letting RevenueCat Handle the Heavy Lifting: As a solo indie dev, handling receipt validation, edge cases, and cross-platform entitlements from scratch would have killed my Shipaton deadline. Offloading that to RevenueCat was easily the best architectural decision I made.

Current Status & What's Next

  • Live on the Apple App Store: Faint is officially live on iOS with active downloads and active Search Ads running in specialty coffee markets.
  • Latest Android version Pending: The production build is submitted to Google Play and awaiting final review.
  • Next Steps: Interactive flavor wheels, recipe ratio calculators, and encrypted peer-to-peer card sharing, all while keeping the vault strictly local-first.

Built With

  • ai
  • android
  • cloudflare-kv
  • cloudflare-workers
  • coffee
  • compose
  • compose-mulltiplatform
  • firebase
  • in-app-purchases
  • ios
  • kmp
  • koin
  • kotlin
  • ktor
  • local-first
  • ml-kit
  • multimodal
  • ocr
  • openrouter
  • paywall
  • revenuecat
  • room
  • subscriptions
  • typescript
  • web-purchases
Share this project:

Updates

posted an update —

Update: Serverless-Edge Validation Meets UX Refinement

Today’s update on Faint was heavily influenced by product critique provided by Austin Blake (RevenueCat) on X. While his notes were focused on UX friction and product "feel," the solutions we implemented required interesting technical refinement on the serverless edge.

Feedback Received

  • The card-creation flow had too much friction.
  • The UI felt too rigid and not "artisanal."

Solution & Technical Update

We leaned into Austin’s suggestion by moving away from pre-creation fields and focusing entirely on a seamless, frictionless multimodal AI scan. To protect this "frictionless" experience, we updated our serverless stack:

  • We implemented device-fingerprinted frequency caps on the Cloudflare Worker proxy using Cloudflare KV. This ensures legitimate trial users can access their free AI scans instantly, while requests that exceed the limit ($quota_{limit}$) are rejected via edge-level circuit breakers, protecting our inference margins.
  • This allowed us to remove all client-side desync headaches for quotas and move TRIAL ENFORCEMENT logic to the server, where it belongs.

We also added our new physics-based MVI state machines to power tactile card flips and instant search responsiveness in Kotlin Multiplatform. The feedback directly helped us marry high-end UX with efficient, enterprise-grade edge security.

Log in or sign up for Devpost to join the conversation.

Submission history