Welcome to My Thoughts & Articles

Here you'll find in-depth blog posts, insights, and stories. Enjoy exploring!

"Enjoying The App?" Is The Wrong Way To Ask For A Review
"Enjoying The App?" Is The Wrong Way To Ask For A Review

"Enjoying the app? Would you like to give a review?" guarantees a no. Most apps ask too early or interrupt the wrong moment. Here's the timing that actually earns five-star reviews, without annoying a single user.

mobile appsiosandroidproductuxdesign
Your App Feels Heavy. Your Images Are Usually Why
Your App Feels Heavy. Your Images Are Usually Why

Your app's size and speed come mostly down to its assets, and assets are the easiest thing to get lazy about. Prefer SVGs, pick the right format when you can't, and stop shipping a 4MB image a 200KB one would cover.

mobile appsflutterperformanceiosandroid
Your App Speaks English. Most of Your Market Doesn't
Your App Speaks English. Most of Your Market Doesn't

Most of the world doesn't default to English, and people are far more likely to trust an app that speaks their language. Localization is how you reach them, and it pays off twice when you localize your app store listing too.

mobile appsflutterlocalizationiosandroid
Once You Ship, You're Blind. Build Eyes Into Your App.
Once You Ship, You're Blind. Build Eyes Into Your App.

Once your app ships, you can't watch it like a server. You're guessing what users do and blind to what breaks. Analytics shows what people actually use, crash reporting shows where it fails. Here's how to set up both.

mobile appsflutteranalyticsarchitecture
 Your Shipped App Is Frozen. Remote Config Is the Remote Control
Your Shipped App Is Frozen. Remote Config Is the Remote Control

Changing your app usually means shipping a new build and waiting for everyone to update. Remote config breaks that loop: a cloud switch for feature flags, update prompts, and in-app announcements, all without touching the store

mobile appsflutterfirebasefeature flagsarchitecture
You Shipped the Fix. Your Users Are Still Running the Bug
You Shipped the Fix. Your Users Are Still Running the Bug

You found a critical bug, shipped the fix, and your users are still on the broken version. Getting people onto your latest build is its own problem. Here are three ways to build an update mechanism, and why you wire it in on day one.

mobile appsflutterarchitecturefirebaseiosandroid
Your App Runs, But That Doesn't Make It Production Ready.
Your App Runs, But That Doesn't Make It Production Ready.

On the web, a fix reaches everyone in seconds. On mobile, your app freezes in users' pockets the moment it ships. Here are 7 things to wire up before launch, because adding them later is brutal.

mobile appsflutterarchitectureiosandroid
Stop Spraying and Praying: My Playbook for Push Notifications That Actually Convert
Stop Spraying and Praying: My Playbook for Push Notifications That Actually Convert

Your users get 80+ notifications a day. Yours is one of the ones they swipe away without reading, if you even have push notifications set up at all. Here's how I fixed that across my apps.

mobile appsmarketingpush notificationsindie devretentionfirebase
Building a Framer Inspired CMS
Building a Framer Inspired CMS

Covers how I built a framer and notion inspired cms system for my portfolio site with next js.

Web devCmsdesign
Stop Hardcoding Colors in Flutter. Set Up Theming the Right Way.
Stop Hardcoding Colors in Flutter. Set Up Theming the Right Way.

A walkthrough of how to set up a scalable theming system in Flutter using ThemeExtension

fluttertheming flutter appsfrontendmobile appsandroidios
Building This Portfolio: From Framer Inspiration to a Custom CMS
Building This Portfolio: From Framer Inspiration to a Custom CMS

How I went from browsing Framer templates and Notion's editor to building a full portfolio with a custom admin dashboard, Tiptap-powered blog editor, and base64 image handling.

portfolionextjsarchitecturebehind-the-scenes