56,966 blogs Β· [ { "id": "01a087bf-fb89-711f-9857-637a87111d8f", "title": "How not to ship slop", "url": "https://perttu.dev/articles/how-not-to-ship-slop", "published_at": "2026-06-25T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc68e96ae53", "title": "App.js 2026 recap", "url": "https://perttu.dev/articles/appjs-2026-recap", "published_at": "2026-06-15T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1033cd25099", "title": "How to invoice Apple for App Store proceeds", "url": "https://perttu.dev/articles/how-to-invoice-apple-app-store", "published_at": "2026-06-02T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc693cedfe6", "title": "How to check if an iOS app is installed in Expo and React Native", "url": "https://perttu.dev/articles/detect-installed-ios-app-react-native", "published_at": "2026-05-11T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc68ce81e6f", "title": "Animating titles in browser tabs with JavaScript", "url": "https://perttu.dev/articles/animating-browser-tab-title", "published_at": "2026-03-23T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc68dc8caf7", "title": "Animating favicons with Canvas and JavaScript", "url": "https://perttu.dev/articles/animating-favicon-with-canvas", "published_at": "2026-03-23T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034224f924", "title": "Why We Replaced \"mailto:\" Links with a Contact Modal (and How We Built It)", "url": "https://perttu.dev/articles/replacing-mailto-links-with-contact-modal", "published_at": "2026-03-21T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1033dfd60c3", "title": "How to use App Store Connect (ASC) CLI", "url": "https://perttu.dev/articles/how-to-use-App-Store-Connect-CLI", "published_at": "2026-03-04T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034a71aa00", "title": "What I'm reading in 2026", "url": "https://perttu.dev/articles/what-im-reading-in-2026", "published_at": "2026-01-26T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc6946fcc3e", "title": "Trips of 2025", "url": "https://perttu.dev/articles/flights-of-2025", "published_at": "2025-12-31T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc693f53b78", "title": "Detect If Another iOS App Is Installed Using SwiftUI", "url": "https://perttu.dev/articles/detect-installed-ios-app-swiftui", "published_at": "2025-12-13T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b10345ea35fa", "title": "Throttling and memoizing App Store scraper calls", "url": "https://perttu.dev/articles/throttling-and-memoing-app-store-scraping", "published_at": "2025-12-04T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1033d7a45fe", "title": "How to make money with your Android app", "url": "https://perttu.dev/articles/how-to-make-money-with-your-android-app", "published_at": "2025-12-02T00:00:00+00:00" }, { "id": "01a087bf-fb89-711f-9857-637a861cc0f6", "title": "Help test Netli.fyi, a Netlify client for iOS (and soon Android)", "url": "https://perttu.dev/articles/help-test-netlifyi-netlify-client-for-ios", "published_at": "2025-11-26T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc69405db17", "title": "React Query + FlatList: Fix Flickering and Layout Shifts", "url": "https://perttu.dev/articles/flatlists-with-react-query", "published_at": "2025-11-21T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034a67cc5f", "title": "What I’m building for Shipaton 2025", "url": "https://perttu.dev/articles/what-im-building-for-shipaton-2025", "published_at": "2025-08-07T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc68e86467d", "title": "App.js 2025 recap", "url": "https://perttu.dev/articles/appjs-2025-recap", "published_at": "2025-06-03T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b10348f4b4dc", "title": "Vibe coding is prototyping for the masses", "url": "https://perttu.dev/articles/vibe-coding-is-prototyping", "published_at": "2025-04-27T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b10348081d26", "title": "How to use environment variables in Netlify functions", "url": "https://perttu.dev/articles/using-environment-variables-in-netlify", "published_at": "2025-02-21T00:00:00+00:00" }, { "id": "01a087bf-fb89-711f-9857-637a8795512c", "title": "How to Add In-app Purchases to Your React Native App", "url": "https://perttu.dev/articles/how-to-add-in-app-purchases-to-your-react-native-app", "published_at": "2025-01-13T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1033e8da66c", "title": "React Native In-App Purchases with RevenueCat: iOS & Android Guide", "url": "https://perttu.dev/articles/in-app-purchases-rn", "published_at": "2024-12-31T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b103413a071b", "title": "React Native WebRTC", "url": "https://perttu.dev/articles/react-native-webrtc", "published_at": "2024-09-30T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034375d0cb", "title": "Is Se7en Based on a Book? Reviewing the screenplay and novelization", "url": "https://perttu.dev/articles/screenwriting-vs-novel-writing-and-the-se7en-novelization", "published_at": "2024-03-26T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc68deb0fc8", "title": "GraphQL conditional queries: using skip and variables in Apollo", "url": "https://perttu.dev/articles/apollo-graphql-variables-or-skip", "published_at": "2024-02-23T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b103444e95f9", "title": "How to style contents in dangerouslySetInnerHTML with Tailwind", "url": "https://perttu.dev/articles/styling-dangerouslySetInnerHtml-with-tailwind", "published_at": "2024-01-27T00:00:00+00:00" }, { "id": "01a087bf-fb89-711f-9857-637a8931d47f", "title": "How to get the old Slack UI back", "url": "https://perttu.dev/articles/how-to-get-the-old-slack-ui-back", "published_at": "2023-12-08T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc68cc2a979", "title": "How to Add Custom Items to the React Native Developer Menu (DevSettings)", "url": "https://perttu.dev/articles/adding-custom-options-to-react-native-developer-menu", "published_at": "2023-12-02T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1033f4bcddb", "title": "Localizing dates in React Native the right way", "url": "https://perttu.dev/articles/localizing-dates-in-react-native-the-right-way", "published_at": "2023-10-10T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034bab76ba", "title": "What is usability evaluation", "url": "https://perttu.dev/articles/what-is-usability-evaluation", "published_at": "2021-06-03T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc6917a3e30", "title": "Critique of the Bayesian brain hypothesis", "url": "https://perttu.dev/articles/critique-of-the-bayesian-brain-hypothesis", "published_at": "2021-03-10T00:00:00+00:00" }, { "id": "01a087bf-fb89-711f-9857-637a88780637", "title": "Designing for healthier life", "url": "https://perttu.dev/articles/how-to-design-for-healthier-life", "published_at": "2021-03-01T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1033ec938ce", "title": "Introduction to JAMstack: a Way of Building Modern Websites And Web Applications", "url": "https://perttu.dev/articles/introduction-to-jamstack-a-way-of-building-modern-websites-and-web-applications", "published_at": "2021-02-17T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1033e8096e3", "title": "I built a React Native App to Manage Netlify Hosted Sites", "url": "https://perttu.dev/articles/i-built-a-react-native-app-to-manage-netlify-hosted-sites", "published_at": "2021-02-10T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc68c1c4bd1", "title": "20 things about 2020", "url": "https://perttu.dev/articles/20-things-about-2020", "published_at": "2020-12-31T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc6950f89a5", "title": "The golden ratio as a model of aesthetic experience in UI design", "url": "https://perttu.dev/articles/golden-ratio-aesthetic-experience-ui-design", "published_at": "2020-12-18T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1033f5a2d87", "title": "Nyxo.app website is now open source", "url": "https://perttu.dev/articles/nyxo-app-website-is-now-open-source", "published_at": "2020-08-07T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034779a505", "title": "Understanding the basics of user research", "url": "https://perttu.dev/articles/understanding-the-basics-of-user-research", "published_at": "2020-06-21T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b10346b6807f", "title": "Using styled-components with TypeScript", "url": "https://perttu.dev/articles/tips-for-using-typescript-with-styled-components", "published_at": "2020-06-18T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034084d190", "title": "Fix 'VirtualizedLists should never be nested inside plain ScrollViews' in React Native", "url": "https://perttu.dev/articles/react-native-virtualizedlists-nested-inside-scrollview", "published_at": "2020-06-13T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc6913776fb", "title": "Build a clock face with SVG in React Native", "url": "https://perttu.dev/articles/creating-a-clock-face-in-react-native-with-svg", "published_at": "2020-06-05T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1033e1c2275", "title": "Creating a static websites with Swift and Publish", "url": "https://perttu.dev/articles/how-to-use-publish", "published_at": "2020-05-22T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034024ff66", "title": "πŸš€ Product Ideas: Democratizing Relaxing Content With ASMR", "url": "https://perttu.dev/articles/product-ideas-democratizing-relaxing-content-with-asmr", "published_at": "2020-04-26T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b10344be8760", "title": "Successful rapid prototyping with React Native", "url": "https://perttu.dev/articles/successful-rapid-prototyping-with-react-native", "published_at": "2019-12-29T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc68fe84a6c", "title": "Books About the Tech World", "url": "https://perttu.dev/articles/best-books-about-the-tech-world", "published_at": "2019-11-28T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b10348c835e4", "title": "VCs and Deep Tech: im14andthisisdeeptech", "url": "https://perttu.dev/articles/vcs-and-deep-tech-im14andthisisdeeptech", "published_at": "2019-11-28T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034277858f", "title": "Running React Native apps on specific iOS simulators", "url": "https://perttu.dev/articles/running-react-native-on-ios-simulator", "published_at": "2019-10-31T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc6903a03da", "title": "App Store release checklist", "url": "https://perttu.dev/articles/checklist-for-releasing-apps", "published_at": "2019-10-15T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1033f168de1", "title": "Iowa Gambling Task", "url": "https://perttu.dev/articles/iowa-gambling-task", "published_at": "2019-06-20T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc69249fbd8", "title": "Crosstalk in stereoscopic displays - why 3D movies look weird", "url": "https://perttu.dev/articles/crosstalk-in-stereoscopic-displays", "published_at": "2019-06-12T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b10349d67d46", "title": "What I read in 2018", "url": "https://perttu.dev/articles/what-i-read-in-2018", "published_at": "2019-05-31T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034585b72b", "title": "That’s How I Got to Memphis", "url": "https://perttu.dev/articles/thats-how-i-got-to-memphis", "published_at": "2019-05-24T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034732c16f", "title": "Too Old to Learn Code", "url": "https://perttu.dev/articles/too-old-to-learn-code", "published_at": "2019-05-18T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b1034aea6bb5", "title": "What is Strategy?", "url": "https://perttu.dev/articles/what-is-strategy", "published_at": "2019-04-10T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc69373dea8", "title": "Designing a winning hackathon concept", "url": "https://perttu.dev/articles/designing-a-winning-hackathon-concept", "published_at": "2019-01-11T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc68f8a9a23", "title": "Automating social cards for Gatsby.js", "url": "https://perttu.dev/articles/automating-social-cards-for-gatsby", "published_at": "2018-03-20T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc695d214f2", "title": "Hackathon Diaries: Energy efficiency hackathon", "url": "https://perttu.dev/articles/hackathon-diaries-energy-efficiency-hackathon", "published_at": "2018-03-02T00:00:00+00:00" }, { "id": "01a087bf-fb89-711f-9857-637a85b68ac8", "title": "Hackathon Diaries: Royal Hackaway", "url": "https://perttu.dev/articles/hackathon-diaries-royal-hackaway", "published_at": "2018-01-24T00:00:00+00:00" }, { "id": "01a087bf-fb89-711f-9857-637a8447b1c0", "title": "Hackathon Diaries: Kuohu creative hackathon", "url": "https://perttu.dev/articles/hackathon-diaries-kuohu-creative-hackathon", "published_at": "2017-11-12T00:00:00+00:00" }, { "id": "01a087bf-fb89-711f-9857-637a85f08358", "title": "Hackathon Diaries: Talking plants with Fiskars", "url": "https://perttu.dev/articles/hackathon-diaries-talking-plants-with-fiskars", "published_at": "2017-09-19T00:00:00+00:00" }, { "id": "01a087bf-fb89-711f-9857-637a85397284", "title": "Hackathon Diaries: Oulu 5GFWD hackathon", "url": "https://perttu.dev/articles/hackathon-diaries-oulu-5gfwd-hackathon", "published_at": "2017-06-26T00:00:00+00:00" }, { "id": "01a087bf-fb8a-7263-b0ba-b10345d3ce3c", "title": "The role of designers' subjective interpretations in human-centered design", "url": "https://perttu.dev/articles/the-role-of-designers-subjective-interpretations-in-human-centered-design", "published_at": "2015-10-20T00:00:00+00:00" }, { "id": "01a087bf-fb88-70f5-8d1a-6fc692c8f782", "title": "What are Touchpoints in service design?", "url": "https://perttu.dev/articles/defining-touchpoints-in-service-design", "published_at": "2015-10-17T00:00:00+00:00" } ] posts Claim your blog
Back to perttu.dev
Blog Β· corpus.blog/blogs/perttu.dev/posts

perttu.dev

perttu.dev

2026

2025

2024

2023

2021

2020

2019

2018

2017

2015