Why I built Cooly

Last summer a heat wave hit and the weather app on my phone just told me it was 38°C. Useful, but it didn't answer the actual question I had: where do I go right now? The nearest place with air conditioning, a water fountain, some shade — that's what I needed, and no app was telling me.

Cooly is my answer. It shows the "feels like" temperature and air quality for exactly where you're standing, then points you to the closest cool, safe place — a library, a mall, a cafe — sorted by how far you'd actually have to walk. Water, shade and public toilets sit on the same map. And when heat or air quality turns dangerous, it warns you even if the app is closed.

What it does

  • Real-time feels-like temperature and a US EPA air-quality reading for your location
  • The nearest cool refuge, ranked by walking distance
  • Water fountains, shade and toilets nearby, on one map
  • Danger alerts for extreme heat and bad air, delivered even when the app is shut
  • A home-screen widget for a one-glance safety check
  • Watch cities you care about (home, family, a trip) with a 7-day heat outlook

How I built it

Cooly is a single Kotlin Multiplatform + Compose Multiplatform project. It isn't shared business logic with two native UIs bolted on — the entire interface, the map screen, the alerts, the paywall, is one Compose codebase that runs on both Android and iOS.

Payments are the same story. Cooly Plus is wired through RevenueCat, so one purchase model covers both stores with the same Kotlin code, and I never had to write platform-specific billing.

Data comes from Open-Meteo (weather and air quality) and OpenStreetMap via Overpass (places) — both free and global, so Cooly works anywhere without an API bill.

The hard parts

  • Shipping iOS without a Mac dev setup. I don't have a machine that can build and sign an iOS app locally, so I built, signed and shipped the whole iOS side on CI (Codemagic) — fighting through certificates, provisioning profiles and bundle IDs until TestFlight finally accepted it. Proving that a Kotlin Multiplatform app can reach the App Store this way was the single most satisfying moment of the project.
  • Getting the danger right. An air-quality alert that cries wolf is worse than none. I reworked the risk model to follow the real US EPA categories, so a "danger" alert only fires when the air is genuinely at that level — not one category early.
  • Alerts without tracking you. People shouldn't have to hand over background location for a safety app. Alerts run on the last location you already loaded, checked periodically in the background, with no background GPS.

What I learned

Kotlin Multiplatform has quietly crossed the line from "share your models" to "share your product." Watching the same Compose screen render on an emulator and an iPhone, from one file, changed how I think about what a solo developer can ship.

What's next

Community-sourced cooling shelters, offline maps for low-signal areas, and localized heat thresholds so "dangerous" means the right thing in Seoul, Phoenix and Lagos alike.

Cooly is one small tool for staying safe as summers get hotter — built end to end in Kotlin, on both platforms, by one person.

Built With

Share this project:

Updates

Submission history