
Why are React Native apps making more money?
Why React Native apps beats Flutter and Native apps in revenue
I've been writing on the internet for over a decade, and this is where it all lives — 98 posts on software development, cognitive science, and design, plus the occasional detour into whatever I couldn't stop thinking about. Most of it is published here, but I've also written for
RevenueCat and
Expo, and those posts are pulled in below too.
The list is everything mixed together, newest first — posts written for another publication are marked with its logo and open on that site, and the rest live here on perttu.dev. Writing is how I figure out what I actually believe, so I revisit and revise old posts often. If something here is wrong, unclear, or just sparks a thought, I'd genuinely love to hear it — it helps my writing, and more importantly my thinking.

Why React Native apps beats Flutter and Native apps in revenue
Apple hands you a CSV, not an invoice. Drop your App Store Connect financial report below and instantly generate the self-issued invoice and itemized report your accountant needs — one PDF, entirely in your browser.
An opinionated take on the best Expo stack, what data tells about app monetization, and why you should still choose React Native to win

Use Linking.canOpenURL to detect if another app is installed on iOS in Expo. Covers Expo config plugin setup, URL scheme configuration, CNG workflow, and a hook to conditionally show a deep link button.

Remind your customers that their trial is about to expire and build trust

Change visibility of components based on rules

We ran an internal vibe coding hackathon to understand where to improve our product
Make your titles dance in the browser tab with JavaScript using document.title. and setInterval.
Use the HTML5 Canvas API to draw animated favicons — loading spinners, progress indicators, and notification pulses — all in the browser tab.
Mailto links assume everyone uses email the same way. We replaced ours with a contact modal that lets visitors copy the address, open their mail app, or reach out on X. Here's the Next.js implementation with Tailwind CSS and Framer Motion.

Integrate RevenueCat with Appstack for attribution and targeting
ASC CLI lets you skip App Store Connect's clunky web UI and manage builds submissions, and localizations from your terminal. Pair it with AI skills and it gets even better.

Learn how to personalize your paywalls by passing values from your app using RevenueCat's Custom Variables.

Explore the winning apps of Shipyard: Creator Contest

How to combine custom builts paywalls with RevenueCat paywalls for flexible experiments, targeted offers, and complex user journeys.

react-native-purchases gets web support; single code-base for subscriptions on three different platforms.

Multiply your changes by shipping to another brief

Everything you need to know to make your app installable, testable, and ready for Shipyard judging.

A hackers guide to building an MVP that can win RevenueCat's Shipyard hackathon
Overengineered approach to tracking how many books I've read in 2026, with filtering, auto generated images, and progress bars
Complete guide to mobile app monetization covering subscriptions, ads, in-app purchases, and hybrid models for both iOS and Android.
Step-by-step guide to implementing in-app purchases in React Native using RevenueCat and react-native-purchases. Covers setup, configuration, and best practices.
How to build a subscription paywall in React Native using RevenueCat Purchases UI. Covers pre-built paywalls, A/B testing, and remote configuration.

Learn how to monetize the app you created with Bolt using RevenueCat SDK and few lines of code.

How to check if another iOS app is installed using canOpenURL and custom URL schemes in SwiftUI. Includes Info.plist setup and working code examples.

How to handle rate limits and memoization when scraping the app-store-scraper package.

Building a great Android app takes time, creativity, and persistence. But once your app is live, there's one question every developer eventually faces: how do I actually make money from this?

Netli.fyi is a native iOS client for Netlify that gives you quick access to your sites, build logs, domains, and account info. It's now in beta and needs real-world testing.

Stop FlatList flickering and layout shifts when using React Query in React Native. Learn the right patterns for loading states, skeletons, and keeping your list mounted.

A practical guide to planning, configuring, and promoting seasonal subscription offers on Google Play.

Apple introduces a 15% IAP rate for apps that host third-party mini apps, with strict rules and new APIs attached.

Unlock web purchases in your React Native app with one tap

A simple, low-pressure way to let users support your app — without a subscription.

Use RevenueCat Web Billing and Zapier to bring churned users backRevenueCat Web Billing win-back campaign

Hack your app store ratings by capturing happy users at the right moment.

How to win Shipaton: Turn your Devpost submission into a story judges remember.

Tactics to get your first 100 users and show real momentum during Shipaton

A time-boxed framework to build, test, and ship your Shipaton app before the clock runs out.

Three apps, one Shipaton: A behind-the-scenes look at what I’m building during RevenueCat’s 2025 hackathon — from saunas to CMS tools to Netlify on the go.

Learn how yo utilize RevenueCat's virtual currencies to power your in-app economies

Don’t know what to build for Shipaton? A 45x hackathon winner breaks down how to find and validate app ideas that solve real problems—and have a shot at winning.

Behind the scenes of a Shipaton-winning launch — from prototype to community-powered release.

How building his first app led Leandro Tolaini from Shipaton to winning WWDC's Student Challenge

A step-by-step tutorial to let users pay to remove ads—using AdMob, and RevenueCat

A step-by-step tutorial to let users pay to remove ads—using Expo, AdMob, and RevenueCat

Build a Blinkist-style paywall with RevenueCat and Zapier—no backend required.

A personal recap of App.js 2025: speaking about in-app purchases, highlights from Krakow, favorite talks, and why this conference remains one of my top picks.
A look at the best hack from a conference hackathon.

Use one React Native codebase and RevenueCat’s Web Billing SDK to support subscriptions across platforms in 30 mins

How vibe coding shifts software development, why it’s closer to prototyping, and how domain-embodied development will change who builds the next generation of software.

Learn how to correctly manage and access environment variables in Netlify Functions.
Comprehensive look at in-app purchases and how to add them to your React Native app

How to implement in-app purchases and subscriptions in React Native using react-native-purchases. Covers consumables, non-consumables, subscriptions, entitlements, customerInfo, and testing.

Full article version of the talk I gave at RTC.ON Conference 2024 about getting started with WebRTC in React Native

A complete guide to implementing in-app purchases in your Expo app using RevenueCat.

Yes, Se7en has a novelization — but the movie came first. How Andrew Kevin Walker's screenplay went through multiple rewrites before becoming a classic, and how the book adaptation compares.

How to conditionally skip or execute GraphQL queries in Apollo based on variables. A simple variablesOrSkip helper that prevents null variable errors in TypeScript.

How to style HTML content in React with Tailwind CSS when using dangerouslySetInnerHTML by writing custom selector using arbitrary variants.

How to switch back to the old Slack desktop UI on Mac and say goodbye (at least temporarily) to the current UX catastrophe.

Add custom debug actions to the React Native Developer Menu using DevSettings.addMenuItem(). Also covers what "Configure Bundler" does, keyboard shortcuts (Cmd+D / Cmd+M), and all built-in menu options.
Learn how to properly format dates based on user locale in React Native using Intl.DateTimeFormat and react-native-localize, avoiding the common pitfalls of hardcoded date formats.
A practical guide to usability evaluation: what it means, the three ISO 9241 dimensions (efficiency, effectiveness, and satisfaction), and how to assess whether a product actually works for its users.
Understanding the shortcomings of the Bayesian approach to brain and cognition, reviewing criticism surrounding task selection, model selection, and theoretical contributions.

Four approaches to designing digital services that persuade your user to live a healthier life
JAMstack is a an architecture for building fast, scalable, and more secure services and products on the web with interchangeable services…
Introducing Netli.fyi, a React Native app for managing your Netlify-hosted sites from your phone — checking deploys, build status, and site details on the go.

20 things about 2020 from my perspective. I think there are easier ways to brag about your accomplishments than trying to mask them under an annual review.
A comprehensive review of psychological research on the golden ratio and its relationship to aesthetic experience, examining whether this ancient mathematical model can reliably predict visual preferences in user interface design.
The website for Nyxo, a sleep coaching app, is now open source. Here is what we open sourced, why we did it, and how you can explore or build on the project yourself.
An introduction to user research: how to gather data about your users, validate it, and organize it into insights so you can make sense of users and their real needs.
Improving the developer experience with a few small tweaks

How to fix the 'VirtualizedLists should never be nested inside plain ScrollViews with the same orientation' warning in React Native using ListHeaderComponent and ListFooterComponent.

How to build a clock face with hour markers using SVG in React Native. Step-by-step guide with react-native-svg, styled-components, and support for dark and light themes.

How to build and deploy a static website using Publish, a static site generator for Swift. Covers setup, theming, Markdown content, and deploying to Netlify.
Create what is essentially a Spotify for ASMR. For the following reasons:

This article is based on a lighting talk I gave at React Day Berlin in 2019. Learnings are from prototyping Nyxo app.
Getting into the tech scene, the world of startups, investors, and technology; is challenging if you didn’t study engineering or business…
The word “deep tech” gets thrown around a lot these days.

There is no need to start Xcode to test on different React Native apps on different device simulators. You can do that easily with the simulator flag.

Checklist for publishing React Native app to Apple App Store successfully.
How the Iowa Gambling Task uses a simple card game to simulate real-life decision-making under uncertainty, and what it reveals about how we weigh risk and reward.
What is crosstalk in stereoscopic 3D displays, why it makes 3D movies look weird, and how display manufacturers are working to reduce ghosting artifacts in modern screens.

A summary of every book I read in 2018, from fiction to biographies, with highlights and thoughts on each. Includes picks from the Business Insider 100 biographies list.
If you love somebody enough You’ll follow wherever they go That’s how I got to Memphis
I wrote my first line of code in 2014 and a year later I founded my first software consultancy. Since that, I’ve founded two other…
What the fuck is a strategy? Everyone’s heard of strategy, but not many feel comfortable at explaining it. And if someone were to ask for…

Between the years 2015 and 2018 I participated in over 70 hackathons. I won 40 of them, most wins being towards the end. Sometimes winning was mostly accidental, but majority of the time it was due to a strategy me and our team followed. This article is abot trying to write down the strategy that worked.
Learn how to automatically generate Open Graph sharing images for your Gatsby.js blog by building a custom plugin using Jimp for image manipulation.

Exploring solutions for sustainable energy use at the Energy Efficiency Hackathon, with innovative projects focused on energy conservation.

My experience at Royal Hackaway, a 24-hour hackathon at Royal Holloway University of London. Covers the project we built, lessons learned, and tips for first-time hackathon attendees.

A journey through the Kuohu Creative hackathon, highlighting creative projects and innovative problem-solving approaches.

An entry from the Hackathon Diaries series, where we explore how technology meets nature with Fiskars and plant communication.

Reflections on the Oulu 5GFWD hackathon, exploring 5G innovations and groundbreaking tech solutions.

Exploring the intricacies of human-centered design, this article delves into the pivotal role of the designer's perspective in shaping innovation. It underscores the significance of design as a deliberate process, echoing in every human-made entity.
Touchpoints are how intangible services become tangible. A review of touchpoint definitions in service design literature and how they are applied in practice today.