AI slop is easy to recognize after the fact. It is the landing page with a purple-blue gradient, Inter, three rounded feature cards, and a headline that could belong to any SaaS company. It is the blog post full of "pivotal", "crucial", "delve", and "underscores". It is the generated image with the wrong hands or the wrong physics. The problem is not always that it looks broken. More often, the…
Fewer people, better experience I wrote a recap of last year's App.js conference in Poland, and it started to feel weird not to write one this year as well, since this year was quite different on my part, and also really highlighted the new trends in React Native, AI-driven development, and going under the surface with native code. In this recap, I want to highlight the conference experience from…
If you're looking for the invoice generator, it is at the bottom of the article. Jump straight to the generator → Why won't my accountant accept Apple's App Store report? If you sell apps on the App Store, money lands in your bank account every month, but Apple never sends any receipt or invoice for these proceeds. You can of course download a CSV file from in App Store Connect → Business →…
TL;DR Use Linking.canOpenURL() with the target app's URL scheme to check if another app is installed. In Expo with continuous native generation (CNG), you configure LSApplicationQueriesSchemes in app.json — no need to touch Xcode or Info.plist directly. Run npx expo prebuild and the native project is generated with your scheme declarations included. This is the React Native version of my SwiftUI…
Few days ago I came across a tweet, which I've sadly haven't been able to find after, where someone showed animated titles in Chrome's tabs. It looked interesting, and most of all fun. So I decided to test what you could actually do with the tabs, and what limitations there are to changing the values. The browser tab title (the text that appears in the tab if you have multiple tabs open) is just…
In my previous article I played with animating the browser tab title using document.title . The natural follow-up: can you animate the favicon too? Yes. The trick is drawing to a hidden <canvas> , converting it to a data URL, and assigning it to the favicon's href . Inspired by this CSS-Tricks article by Giulio Mainardi, here are three variations. Square loader Progress pie Notification pulse…
Every business website has a "Contact us" button. Most of them do the same thing: slap a mailto: link on it and call it a day. We did too — until we realized how many potential clients we were losing because of it. Here's what we changed, why, and how you can do the same thing in Next.js with Tailwind CSS. The problem with mailto: links When someone clicks a mailto: link, the browser opens…
If you've ever spent an afternoon clicking through App Store Connect to update metadata, upload a build, or — god forbid — localize your app listing into 15 languages, you know the pain. The web UI is slow, repetitive, and to be cumbersome for actual workflows. It almost doesn't feel like an Apple product. Using something like Helm, greatly improves the experience of working with App Store Connect…
This is an interactive article that gets updated throughout the year. Worth bookmarking and coming back to later. What is this page? I like reading, writing, and building things that are kinda crazy and dumb. This interactive blog post is an amalgamation of all three: an interactive article that tracks what I'm reading throughout 2026, with the aim of reaching my reading goal of 2 books a week…
I track my flights using Flighty and look back at the data each year. Flighty focuses on time spent in the air, not on trips as a whole. But you can export your data from the app, and with some wrangling you can build a good picture of your year in travel. I wanted to understand where I spent my time in 2025. Flights 57 total flights taken Countries 7 countries visited In the Air 11.5d total…
TL;DR If you want to check whether another iOS app is installed from your SwiftUI app, use UIApplication.shared.canOpenURL() with the target app's URL scheme. You must declare the schemes you want to query in your Info.plist under LSApplicationQueriesSchemes . This article shows you exactly how to set it up. I'm building a companion app for Flighty in SwiftUI, and I wanted to detect whether…
What is @perttu/app-store-scraper I recently published @perttu/app-store-scraper , a TypeScript rebuild of the app-store-scraper by facundolaano (it's a really good package by the way). I wanted to keep all the same features, just add TypeScript support improve some of the scraping after Apple updated their App Store website. The package gives you the following features: app() - Get app details…
Introduction 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? Android developers often struggle with monetization more than iOS developers. Not only are Android users statistically less likely to pay for apps , but implementing in-app purchases or…
I've been building a small project that I've wanted on my own phone for a long time: Netli.fyi, a native iOS client for Netlify. It gives you quick access to your sites, build logs, domains, and account info without needing to open a laptop. It's now at a point where it needs real world testing, which is where you come in. If you use Netlify even a little, I'd love your help trying the beta. In…
TL;DR If you're seeing flickering, layout shifts, or scroll position resets when using React Query with FlatList in React Native, it's usually caused by conditionally replacing the entire screen based on loading state. The fix is to always render the FlatList and use ListEmptyComponent for loading and empty states. This article explains why it happens and how to fix it properly. React query pairs…
So I’m also taking part in Shipaton this year. If you’re not familiar with Shipaton, it’s a yearly hackathon by RevenueCat where the general goal is to build a mobile app, launch it for iOS or Android, and grow it. This year’s Shipaton takes place from August to September (I’m writing this from the kickoff we had for it in Tokyo). Because I’m a RevenueCat employee, I’m not eligible to actually…
Took a quick visit to Krakow to give a talk at App.js , right after spending two weeks in Japan. This is actually almost the exact same way I spent last May too. I do wonder if it’s becoming a tradition of sorts to fight jet lag every time I’m visiting Krakow. So yeah, I was there to give a talk. This time about how to monetize your app with in-app purchases. Funnily enough, when I submitted the…
Goodbye Domain-Driven Development, Hello Domain-Embodied Development Vibe coding—prompting AI to generate code snippets—is getting increasing attention, not just among developers but also among people with little or no prior coding experience. Previously, building a solution required an engineer or possibly even a team. Now, it might only take someone with a problem and the willingness to prompt…
When building things using Netlify Functions, there are times you need to access environment variables in your functions. These variables are available at runtime through process.env when using TypeScript or JavaScript: process . env . VARIABLE_NAME A cleaner way to access them is to destructure like this: const { VARIABLE_ONE , VARIABLE_TWO } = process . env Define these at the root level, and…
Comprehensive look at in-app purchases and how to add them to your React Native app This article is based on the talk I gave at the first React Native London conference in 2024. As the title says this article is about app monetization, using in-app purchases to be more exact. Although selling your app in microacquire or putting a price tag on in Play store/App store are both valid strategies, the…
TL;DR If you want to add in-app purchases to your React Native app, you need to understand the different types (consumables, non-consumables, subscriptions), set up products in App Store Connect and Google Play Console, and use a library like RevenueCat to handle the purchase flow across platforms. This article walks you through the entire process with working code examples. This article is based…
This is a work in progress article version of the talk I gave in Krakow at RTC.ON Conference 2024. In this article, I’ll guide you through using WebRTC in React Native. We’ll start with the motivations behind real-time media on mobile, introduce React Native WebRTC, and finally explore the limitations and potential improvements for mobile implementations. Why WebRTC on Mobile? Real-time…
Introduction: Novels vs. movies — who gets the credit? If you're quickly asked to name three of your favorite books and their authors, you probably won't have to think about it too long. However, asking anyone to name their three favorite movies and then asking to name the people who wrote the screenplays for them is definitely harder. Even the biggest movie buffs have a hard time doing that. For…
In a project I'm working on, we have a case where many of the queries ran using the autogenerated Apollo GraphQL hooks that depend on the userID. However, this ID might be null at times, such as when the user's authentication session has ended. This leads to issues in two places: The hook will try to run with a query that has no userID, leading the backend to reject it and return no data/error…
I recently needed to style the Html content that was injected into an element using the dangerouslySetInnerHTML property. Since the other parts of the project were using Tailwind, I wanted to continue the same approach here instead of writing custom CSS for that part. Turns out Tailwind makes this relatively easy using the arbitrary variants . This allowed me to do the following: const Tooltip = (…
A bit over a month ago, Slack rolled out a new updated UI. Safe to say that this update is a mess. Things that were previously always visible and easy to find, such as your other Slack workspaces and combined channels/direct messages list are now hidden behind extraneous clicks. If I were a UX/UI designer at Slack, I would be embarrassed to mention where I work at this point. Thankfully, there is…
TLDR: You can customize the Developer Menu in React Native with your custom actions. If you're already familiar with the Developer Menu, click here to jump to section about customizing the menu What is The Developer Menu When running a development version of a React Native app, you can access a special Developer Menu by either shaking your device (if you're running the app on the device instead of…
There are a lot of things the world can't seem to agree on, and one of them is how to format dates. Girl: "What's your idea of a perfect date?" Engineer: "DD/MM/YYYY. I find other formats a bit confusing." Dates can be structured in a multitude of ways: DD/MM/YYYY (most of Europe, Australia) MM/DD/YYYY (United States) YYYY/MM/DD (ISO 8601, East Asia) DD.MM.YYYY (Germany, Finland, Russia)…
How to Do Usability Evaluation Introduction As technology continues to advance and evolve, the pressure to innovate and create products and services that make users’ workflows easier and combine previously separate tasks increases. This puts even more emphasis on the usability of systems. According to ISO 9241, usability consists of three dimensions: efficiency, effectiveness, and satisfaction.…
Introduction Human behavior is driven by incomplete data and methods to turn that data into action and perception. Take, for example, our eyes, which do not actually construct a complete high-resolution picture of our surroundings despite that we experience it so. Instead, that image is filled with noise, missing large chunks, and top of all also inverted. Yet, we can use this incomplete data to…
Four approaches to designing digital services that persuade your user to live a healthier life Changing your habits from unhealthy to healthy ones is hard. Fortunately changing behavior has become easier with technology. We don’t necessarily need that expensive coach to push towards our goal anymore, and a cheap mobile app might even suffice. The question is, how can we build services that help…
JAMstack is an architecture for building fast, scalable, and more secure services and products on the web with interchangeable services and prerendering. In simpler terms, JAMstack is about building websites that combine the best of static (infrequent changes in content and data) and dynamic sites (content and data changes often in response to user actions). With this approach, you can build…
Introducing Netli.fyi I am excited to announce the release of Netli.fyi , a mobile app that allows you to manage your Netlify sites on the go. Built with React Native, the app uses the Netlify API to provide you with easy access to information about your sites, builds, deployments, and form submissions. As a full-stack developer, I have used Gatsby, Publish, and NextJS to build a number of…
Not really a fan of yearly reviews. I think there are easier ways to brag about your accomplishments than trying to mask them under an annual review. However, if you should ever review a year, this one would be it. So here are 20 things about 2020 from my perspective. COVID This first point probably surprises no one. For most, this year has brought massive changes to their lives. For me, though,…
1. Introduction Every day we make decisions guided by our aesthetic preferences (Palmer, 2013). For example, we may end up buying artworks for our homes based on the aesthetic experiences they evoke, not because they provide us with utility in some other way. The influence of aesthetics on our information processing and decision-making is strong and multifaceted, as illustrated well by the design…
Hello, world! Today and I’m very excited to announce that we have just open source the Nyxo.app website, that means this one you’re currently looking at. This is the first step in a larger project of making all Nyxo products open source. In the future, we will open-source more the things we’ve built here at Nyxo. What is Nyxo In case this is the first time you’ve heard about Nyxo, let me introduce…
How to gather user data, validate it, and organize it. As digital products age, they tend to compound in complexity. The rapid development of technology creates possibilities for products to combine features from previously separate products. Added features lead to added complexity, which in many cases, leads to products that are harder to use and can cause more errors. Product changes can even…
Using Styled-components with React and React Native is great. Where it really shines in my opinion is when you use it with TypeScript and VS Code, getting code suggestions and errors when you write something wrong. In this article, we are going to take a look at how to use TypeScript with styled-components for better developer experience: Styled-components with VS Code and types for…
When developing with React Native and nesting FlatList or SectionList components inside a plain ScrollView , your debugger might display the following warning: React Native Error VirtualizedLists should never be nested inside plain ScrollViews with the same orientation because it can break windowing and other functionality - use another VirtualizedList-backed container instead. This warning pretty…
In this article, we are going to look at how to draw a nice-looking analog clock face by using react-native, react-native-svg, and styled-components. The clock is going to tell time, tick, and have support for dark and light themes. This is based on the work I’ve done on Nyxo, where we show a clock face as the base for displaying your sleep data. I’ve been getting some questions on how to create…
A few days ago, I accidentally stumbled upon Publish , a static site generator that uses Swift as the language for building websites. Despite not being a Swift developer, I thought this sounded quite awesome. So I decided to try if the time I've spent playing around with SwiftUI could be enough to get up and running with a static site built with Swift. Why Use Swift and Publish? Just because…
Create what is essentially a Spotify for ASMR. For the following reasons: Fundamentally connected to something everyone does daily: sleeping Massively popular content, with many ASMR videos having many millions of views Currently consumed mainly through Youtube, which offers a subpar experience for users using ASMR for relaxation Large existing creator pool Very few players on the market…
This is a transcript of a lightning talk I gave at React Day Berlin in 2019. You can watch the talk here . All the links resources are available at the end of this transcript. But before we go into all that, I want to give a little introduction to myself. So the reason for my complicated name "Perttu Lähteenlahti" is because I'm from Finland, which is by the way celebrating its Independence Day…
Best Books About the Tech World Getting into the tech scene, the world of startups, investors, and technology; is challenging if you didn’t study engineering or business. I know, I was there myself four years ago. Acronyms and weird words get thrown around, and lot and in people seem to live in a completely different world, where, for example, Airbnb is not just a web service, but one of the many…
The word “deep tech” gets thrown around a lot these days. It feels every investor and their grandma is looking for deep tech companies to invest. Just sending an email with words “deep tech”, “patent” and “biotech” or “sustainability” could probably net you a meeting with a venture capitalist (probably even faster than you could say “I’m a white male engineer”, which is the second-best method for…
If you're developing React Native apps for iOS you're most likely familiar with this command: react-native run-ios In most cases that command opens up the iPhone X simulator. Instead, if you want to open your React Native app in a specific simulator you can also add the wanted device name with the simulator flag like this: react-native run-ios simulator = 'iPhone 8' And it will open up the iPhone…
Releasing to App Store Getting your mobile app published in the App Store is simple in theory but tedious in practice. During the past nine months, I've sent several versions of the Nyxo app to be reviewed by Apple. Almost every time Apple has rejected a new version of the app, it has been because of some minor thing. That is why I decided to write a checklist for releasing your app to the App…
Simulating real-life decision-making with card games Decision-making is perhaps one of the most exciting capabilities of human cognition. At the same time, it also one of the most difficult ones to study as despite that our reasoning is often considered to be rational, the real-world decision-making is usually at least outwardly less so. To truly understand the cognitive processes behind…
Remember 3D TVs? Remember how the TV manufacturers tried to ship the idea of wearing goggles at home while watching TV, so you could experience that Avatar-style novelty from the comfort of your own couch? Although the idea 3D television is pretty much dead now, and everyone is more focused on the possibilities of AR and VR, I would not call 3D a dead technology yet. After all, cinemas are still…
The Accidental Billionaires: The Founding of Facebook, a Tale of Sex, Money, Genius, and Betrayal by @benmezrich ⭐️⭐️⭐️ Reads more like a fiction book, but is still a decent look at the founding of Facebook. If you've seen The Social Network movie, you might not get much out of this. Venture Deals by @bfeld ⭐️⭐️⭐️⭐⭐ Perhaps the best guide on how venture funding works and you should approach it if…