Building Ascently: Why I Chose Native Over Cross-Platform

Back RSS
projects
open-source
mobile

I’ve been climbing for a couple of years now, and I wanted a simple way to track my sessions and progress. The apps I tried required accounts I didn’t want to create, or just felt… off. So I went and made my own.

Why Native?

I built Ascently twice. Once in SwiftUI for iOS, and once in Jetpack Compose for Android. No Flutter, no React Native, no cross-platform frameworks.

This seems like a lot more work than its worth. Why would anyone willingly write the same app twice?

Different platforms are different

iOS users expect iOS features and design. Material You on Android looks and feels different than iOS’s design language, and thats good. This is part of what makes these platforms unique. I wanted Ascently to feel hand-crafted for each platform and not like some fully custom design that feels out of place. SwiftUI and Jetpack Compose let me do this while maintaining the declaritive approach I appreciate so much from frameworks like Flutter. I also just genuinely enjoyed learning both platforms.

Offline-First

Building Ascently offline-first was front-of-mind from the beginning. Your sessions are saved locally and are always accessible. If you want sync, you can run your own server. But you don’t have to. Your data always remains yours, on your device, until you explicitly decide otherwise.

Privacy as a Feature

No analytics. No tracking. No data collection. I am tired of apps treating privacy like a checkbox to tick instead of a fundamental design choice. I went out of my way to ensure that the ONLY time network calls are made is when you explicitly choose to sync or enable the health integration.

This made the architecture simpler. No need to figure out integrating an analytics SDK to integrate. Turns out you don’t need to fuss around with building the perfect “privacy respecting analytics” system if you just don’t collect analytics to begin with.

What I’ve Learned

Building native apps on both platforms taught me that cross-platform frameworks solve a real problem—but not my problem. I wanted to learn native development while solving a problem I felt was never properly solved. And of course I wanted full control over the tech stack without abstractions or code generation getting in the way.

Try It (pls >.<)

If you climb and you’re looking for a simple app to manage your sessions, please give Ascently a shot. All the code is available at git.atri.dad/atridad/Ascently.