About

Hey, I'm Ahmad 👋

I lead mobile at my day job — mostly Android, mostly Kotlin, mostly living in Jetpack Compose. But I've never been great at staying in my lane, so I'm usually also elbow-deep in a NestJS backend somewhere, arguing with Postgres or MongoDB about how a schema should look.

This blog is basically my notes-to-self, cleaned up enough to be useful to other people. Not "10 tips" fluff — the stuff I actually had to figure out the hard way while shipping real apps, bugs and all.

What's actually on here

  • Jetpack Compose — state, animations, and the bits that never show up in the "getting started" tutorial but absolutely show up in your bug tracker.
  • Kotlin Multiplatform (KMP/KMM) — sharing logic between Android and iOS without giving up a native-feeling UI, warts and all.
  • Flutter — how it stacks up against the native/KMP world, written for people trying to actually decide, not win an argument on Twitter.
  • Backend stuff — how the app talks to the server, and the NestJS decisions that make that conversation less painful.
  • Product & UI/UX — because "does this work" and "does this feel good to use" are two very different questions, and I like both of them.

My honest take on frameworks

I don't think there's one framework to rule them all, and I'm suspicious of anyone who does. Native Android, KMP, Flutter — they're all genuinely good at different things. So instead of "X beats Y" posts, you'll get more "here's when I'd actually reach for this one."

Not just code

I get just as excited talking through a product decision or a UX detail as I do debugging a gnarly recomposition bug. So every now and then, expect a post that's less about syntax and more about why a feature should — or shouldn't — exist in the first place.

Say hi

Got a question, spotted a mistake, or want me to write about something specific? I'm at [email protected] — actually reply to these, so don't be shy.