
Writing by Perttu Lähteenlahti
A collection of 45 blog posts I've written over the years. My writing spans topics like cognitive science, software development, and design — with the occasional detour into the unrelated. I revisit and revise older posts regularly, and I welcome any feedback that can help improve my writing, and more importantly, my thinking. I hope you find something interesting here.



How to Build a Win-Back Campaign with RevenueCat Web Billing
Use RevenueCat Web Billing and Zapier to bring churned users backRevenueCat Web Billing win-back campaign

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

How to win Shipaton part 4: pitching your app
How to win Shipaton: Turn your Devpost submission into a story judges remember.

RevenueCatを使って、iOS・Android・Webでサブスクリプションが利用できる単一のExpoアプリを構築しよう
React Nativeの単一コードベースとRevenueCatのWeb Billing SDKを活用し、わずか30分でiOS・Android・Webのサブスクリプション対応が可能に。

How to win Shipaton part 3: growing your app
Tactics to get your first 100 users and show real momentum during Shipaton

How to win Shipaton part 2: building fast
A time-boxed framework to build, test, and ship your Shipaton app before the clock runs out.

What I’m Building for Shipaton 2025
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.

How to monetize your AI app with virtual currencies
A React Native tutorial for building an in-app virtual currency economy that buys bedtime stories, powered by LLMs

How to win Shipaton, part 1: coming up with an idea
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.

How Rudrank Riyam won Shipaton’s Build in Public Award by sharing every step
Behind the scenes of a Shipaton-winning launch — from prototype to community-powered release.

From first app to WWDC winner: Leandro Tolaini’s Shipaton story
How building his first app led Leandro Tolaini from Shipaton to winning WWDC's Student Challenge

A Beginner’s guide to implementing an ad-free subscription in your Flutter app
A step-by-step tutorial to let users pay to remove ads—using AdMob, and RevenueCat

A beginner’s guide to implementing ad-free subscriptions in your React Native app
A step-by-step tutorial to let users pay to remove ads—using Expo, AdMob, and RevenueCat

How to build a Blinkist-style paywall using RevenueCat webhooks and Zapier
Build a Blinkist-style paywall with RevenueCat and Zapier—no backend required.

App.js 2025 Recap
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.

How to add subscriptions to a Bolt-generated Expo app
Want to add in-app subscriptions to your Bolt app? This guide shows how to build a working paywall UI using prompts only, then integrate RevenueCat to handle real purchases and entitlements on Android using EAS Build.

Build a single Expo app with subscriptions on iOS, Android, and Web using RevenueCat
Use one React Native codebase and RevenueCat’s Web Billing SDK to support subscriptions across platforms in 30 mins

Vibe Coding is Prototyping For The Masses
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.

How to Use Environment Variables in Netlify Functions
Learn how to correctly manage and access environment variables in Netlify Functions.

Making Money with Your React Native App
Comprehensive look at in-app purchases and how to add them to your React Native app. Covers different types of in-app purchases, how to set them up in your app, and the psychology of good in-app purchase experiences. Technology used: React Native, RevenueCat, App Store Connect.

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

The Novel vs. The Screenplay: Se7en
How Andrew Kevin Walker’s script went through multiple rewrites before becoming the neo-noir classic we know today. Despite its flaws, the novelization of Se7en holds personal significance for me, showing how a good story can transcend its medium.

A Small Helper Function for Conditional Requests in Apollo GraphQL
Struggling with null userID in Apollo GraphQL hooks? The variablesOrSkip function is my fix, smartly skipping or including variables to cut runtime errors and boost code stability in TypeScript projects.

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

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

Adding Custom Options to React Native Developer Menu
Customize the React Native Developer menu to your needs using the built in addMenuItem function.

Designing for Healthier Life
Four approaches to designing digital services that persuade your user to live a healthier life

20 Things About 2020
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.

Using styled-components With TypeScript
Improving the developer experience with a few small tweaks

How to Fix 'VirtualizedLists should never be nested inside plain ScrollViews' Warning
How to Fix 'VirtualizedLists should never be nested inside plain ScrollViews' Warning

Build a Clock Face with SVG in React Native
Let´s draw a nice looking analogue clock in React Native with SVG

Static Sites in Swift: Getting Started With Publish
How to publish as a static blog with Publish and Netlify

Running React Native apps on specific iOS simulators
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.

App Store Release Checklist
Checklist for publishing React Native app to Apple App Store successfully.

Crosstalk in Stereoscopic Displays - Why 3D Movies Look Weird
An article about crosstalk in stereoscopic displays, a phenomenon that causes 3D movies to look weird.

What I Read in 2018
A summary of the books I read in 2018, covering various genres and highlights.

Designing a Winning Hackathon Concept
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.

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

Hackathon Diaries: Royal Hackaway
Insights and experiences from the Royal Hackaway hackathon, diving into innovative projects and tech challenges.

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

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

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

The Role of Designers’ Subjective Interpretations in Human-centered Design
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.