{"id":18707,"date":"2026-06-10T15:53:53","date_gmt":"2026-06-10T14:53:53","guid":{"rendered":"https:\/\/cowrywise.com\/blog\/?p=18707"},"modified":"2026-06-10T15:53:54","modified_gmt":"2026-06-10T14:53:54","slug":"from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform","status":"publish","type":"post","link":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/","title":{"rendered":"From Weekend Experiment to Production App: Building Cowrywise Kids with Kotlin Multiplatform"},"content":{"rendered":"\n<p>In February 2026, I started building native Android and iOS apps for Cowrywise Kids.<\/p>\n\n\n\n<p>It was not on the roadmap. No one assigned it to me. No one asked for a prototype. I just could not stop thinking about the gaps in the experience.<\/p>\n\n\n\n<p>Cowrywise Kids already existed as a web app and PWA, but the more I used it, the more obvious the mobile problems became: unreliable push notifications, no real app store presence, weak offline support, and too many moments where a child could simply drop off.<\/p>\n\n\n\n<p>And children do not fight through friction. They just stop.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>What Cowrywise Kids Is<\/strong><\/h1>\n\n\n\n<p>Cowrywise Kids is a financial literacy product for children aged 5 to 17, built by Cowrywise, a Nigerian savings and investment platform. Children go through lessons, play games, complete quizzes, unlock progress, and build basic money knowledge over time. Parents stay connected through an account structure that gives them visibility and feature controls.<\/p>\n\n\n\n<p>This is not a normal content app. It is a learning product for children, which means retention, motivation, safety, and low-friction access matter more than usual. A parent who finds the experience confusing may not re-engage. Every engineering decision in this project had to hold up against those realities.<\/p>\n\n\n\n<p>That context is what made the mobile gap so frustrating to leave alone.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Why Cowrywise Kids Needed Native Apps<\/strong><\/h1>\n\n\n\n<p>The PWA had real limitations. App store discoverability matters for building daily habits in children; parents search Google Play and the App Store, not the mobile web. Push notifications are unreliable in PWAs. Background content preloading is also harder on the web, which matters when the goal is to make the next lesson ready before a child opens the app.<\/p>\n\n\n\n<p>The decision to go native was not hard. The harder question was how to build for both Android and iOS without running two completely separate engineering tracks.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Why Kotlin Multiplatform Was the Right Bet<\/strong><\/h1>\n\n\n\n<p>Three options were on the table:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Option<\/strong><\/td><td><strong>Trade-off<\/strong><\/td><\/tr><tr><td>Native Android + Native iOS<\/td><td>Maximum platform control, but duplicated product logic and higher maintenance overhead<\/td><\/tr><tr><td>Flutter<\/td><td>Mature cross-platform UI story, but required adopting Dart, a new UI framework, and a separate ecosystem<\/td><\/tr><tr><td>Kotlin Multiplatform + Compose Multiplatform<\/td><td>Shared Kotlin domain, data, and UI layers, with native platform escape hatches where needed<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Kotlin Multiplatform came down to one idea: share what should be shared, keep what should be native. Business logic, networking, persistence, and state management written once in Kotlin, running on both platforms. UI through Compose Multiplatform. Platform-specific behaviour through expect\/actual.<\/p>\n\n\n\n<p>The trade-offs going in were real: Compose Multiplatform is still evolving, Room Multiplatform is relatively new, and iOS debugging is not as mature as it is on Android. Those were accepted in exchange for a genuinely shared codebase. In retrospect, they were the right trade-offs.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>What Compose Multiplatform Actually Changed<\/strong><\/h1>\n\n\n\n<p>One of the biggest misconceptions around Kotlin Multiplatform is that shared business logic is where the story ends. With Compose Multiplatform every screen: auth, course list, lesson detail, quiz flow, leaderboard, profile, is shared. Design system, theming tokens, animations, state-driven rendering, all shared. The adaptive layout system that handles tablets and landscape, shared.<\/p>\n\n\n\n<p>The benefit wasn&#8217;t just fewer files, It was consistency. A bug fixed in the LMS fixes it everywhere. A UI change ships to both stores at once. That&#8217;s the real return, not just lines of code saved, but divergence prevented.<\/p>\n\n\n\n<p>One place this showed up in an unexpected way: the MVI pattern. Every screen follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"968\" height=\"116\" src=\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image.png\" alt=\"\" class=\"wp-image-18708\"\/><\/figure>\n\n\n\n<p>Because the reducers live in shared code, both platforms get identical state transition behaviour.<\/p>\n\n\n\n<p>The quiz flow is a useful example. It had multiple distinct states: loading, active question, answer selected, correct answer, incorrect answer, submission pending, submission failed, completed, and retry.&nbsp;<\/p>\n\n\n\n<p>Without shared reducers, Android and iOS could have drifted apart subtly over time, a slightly different error state here, a missed transition there. With the MVI layer in shared code, the same intent produced the same state transition on both platforms, every time. That kind of consistency is hard to audit for and easy to lose. KMP made it structural rather than disciplinary.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>The Lesson That Changed the Entire Architecture<\/strong><\/h1>\n\n\n\n<p>The most important technical decision in the project wasn&#8217;t Kotlin Multiplatform. It wasn&#8217;t Compose. It wasn&#8217;t Room. It wasn&#8217;t even offline sync.<\/p>\n\n\n\n<p>It was simply a Boolean.<\/p>\n\n\n\n<p>This might seem insignificant at first glance but it changed the way the entire learning experience works. The original progression model was straightforward: <em>Read a lesson \u2192 Complete a quiz \u2192 Unlock the next lesson<\/em>. This was perfectly reasonable, until internet connection was considered especially in an app for kids.<\/p>\n\n\n\n<p>The web app gated lesson progression behind quiz completion. That works fine on a reliable connection. For most kids who rely on their parent for internet connection it meant: no network = quiz can&#8217;t submit = lesson stays locked, even if they&#8217;d read and understood the content.<\/p>\n\n\n\n<p>The solution was an <strong>isRead<\/strong> flag that decoupled reading from assessment. Reading sets <strong>isRead = true <\/strong>locally and unlocks the next lesson immediately. Quizzes are still required to mark a course as complete, learning validation is preserved, but reading progression is offline-capable. No backend changes. No new API contract.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"968\" height=\"182\" src=\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-1.png\" alt=\"\" class=\"wp-image-18709\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"6720\" height=\"3522\" src=\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-32.jpg\" alt=\"\" class=\"wp-image-18714\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Offline-First Is a Product Philosophy, Not a Technical Feature<\/strong><\/h1>\n\n\n\n<p>A lot of apps claim offline support. What they really mean is: data was cached. That&#8217;s not the same thing. True offline-first means the application continues to deliver value even when the network disappears. That mindset shaped almost every engineering decision in the Learn module.<\/p>\n\n\n\n<p>The rule was simple: the Learn module UI never reads from the network. Data flows strictly in one direction:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"968\" height=\"118\" src=\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-2.png\" alt=\"\" class=\"wp-image-18710\"\/><\/figure>\n\n\n\n<p>The UI has no idea whether it&#8217;s rendering cached data or fresh data. It just renders state.That single decision ended up influencing nearly every offline-first pattern that followed.<\/p>\n\n\n\n<p>Sometimes the most impactful architectural decisions are also the smallest ones.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>What Building for iOS Taught Me<\/strong><\/h1>\n\n\n\n<p>I&#8217;m primarily an Android engineer. A few things I wish I&#8217;d known before touching the iOS side of a KMP project.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>iosMain is Kotlin, not Swift. Writing an actual implementation for iOS means writing Kotlin that calls iOS APIs via Kotlin\/Native interop. The syntax stays in Kotlin. There&#8217;s no language context-switch, but SwiftUI ergonomics are gone and IDE support is thinner than on Android. Expect the adjustment.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>api vs implementation in your Gradle build has iOS consequences. Declaring a dependency as implementation keeps its types internal to the module, they won&#8217;t appear in the generated XCFramework headers. If the Swift shell needs those types, api is required. The failure mode is completely silent: the type simply doesn&#8217;t exist in Swift autocomplete. One-word Gradle fix. Hours to diagnose without knowing to look there.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>BGTaskScheduler identifiers must be declared in Info.plist. If a background task identifier isn&#8217;t listed in BGTaskSchedulerPermittedIdentifiers, the system silently refuses to schedule it. no error, no crash. This only surfaced on a physical device, which is a good reminder that iOS background execution behaviour on the simulator is not representative of production.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>The Small UX Details Children Actually Notice<\/strong><\/h1>\n\n\n\n<p>The most meaningful UX change in this project had nothing to do with architecture.<\/p>\n\n\n\n<p>The web app applied a single static colour to all active courses. That is technically fine. But children notice progress differently from adults; visual reward matters in ways that are easy to underestimate on a spec sheet.<\/p>\n\n\n\n<p>Course themes became dynamic: as children unlock new courses, each course card takes on its own distinct colour. The unlock moment becomes visible. Progress becomes something you can see, not just track.<\/p>\n\n\n\n<p>The response to that change was disproportionate to the engineering effort it required. Product quality often comes from this kind of decision, not from any single large feature, but from dozens of small ones made by someone paying close attention to how the product actually feels to use.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>What I Would Do Differently<\/strong><\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Invest in iOS device testing from day one. Too much early development happened on the simulator. Background execution, memory behaviour at the Kotlin\/Swift boundary, and certain rendering edge cases only surface on real hardware.<\/li>\n\n\n\n<li>Design shared ViewModel scopes earlier. The pattern for sharing ViewModels across screens emerged mid-project. It works well, but some earlier flow architecture had to be refactored to align with it. Starting with a clear scoping model would have saved that rework.<\/li>\n<\/ol>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Shipping, Review, Crashes, and Real Users<\/strong><\/h1>\n\n\n\n<p>After months of iteration, offline edge cases, Nav3 crashes, and App Store review cycles, Cowrywise Kids shipped to both Google Play and the Apple App Store.<\/p>\n\n\n\n<p>The Nav3 crashes were worth understanding in their own right. Jetpack Navigation 3 is powerful but has rough edges in early adoption, particularly around back-stack handling in multi-module setups. If you are considering it, test deep navigation flows early. The issues are solvable, but they surface late if you are not looking.<\/p>\n\n\n\n<p>The App Store review cycles added time that better upfront planning would have reduced. The lesson was not that compliance is a barrier; it is that, for a children\u2019s product, child-safety policy, privacy disclosures, and data-handling expectations are part of the product design, not a post-engineering concern.<\/p>\n\n\n\n<p>Early usage has made the bet feel worth it: children are returning to continue lessons on real devices, in real homes, and under real network conditions. The product is now discoverable in the places parents already search, and learning continues in conditions where the web experience would have dropped off.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Final Lesson<\/strong><\/h1>\n\n\n\n<p>The product is live. Children are using it. Lessons are being completed on real devices, in real homes, with real network constraints.<\/p>\n\n\n\n<p>That is what made the hard parts worth it. Not the shared code percentage. Nor the architecture diagram. Nor the fact that Kotlin now runs across both platforms.<\/p>\n\n\n\n<p>The real win is simpler: a child can open the app, keep learning, and move forward, even when the network does not.<\/p>\n\n\n\n<p>For a product designed to help children build better money habits early, reliability is not just a technical concern. It is part of the learning experience.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In February 2026, I started building native Android and iOS apps for Cowrywise Kids. It was not on the roadmap. No one&#8230;<\/p>\n","protected":false},"author":40,"featured_media":18720,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[362,199],"tags":[],"coauthors":[565],"class_list":{"0":"post-18707","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-at-work","8":"category-engineering"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>From Weekend Experiment to Production App: Building Cowrywise Kids with Kotlin Multiplatform - Cowrywise Blog<\/title>\n<meta name=\"description\" content=\"I started Cowrywise Kids native apps as a weekend experiment. This is how Kotlin Multiplatform, offline-first thinking, and one Boolean field helped ship it to Android and iOS.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"From Weekend Experiment to Production App: Building Cowrywise Kids with Kotlin Multiplatform - Cowrywise Blog\" \/>\n<meta property=\"og:description\" content=\"I started Cowrywise Kids native apps as a weekend experiment. This is how Kotlin Multiplatform, offline-first thinking, and one Boolean field helped ship it to Android and iOS.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/\" \/>\n<meta property=\"og:site_name\" content=\"Cowrywise Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/cowrywise\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-10T14:53:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-10T14:53:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-34-1-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"3292\" \/>\n\t<meta property=\"og:image:height\" content=\"1725\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Moronke Anifowose\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@cowrywise\" \/>\n<meta name=\"twitter:site\" content=\"@cowrywise\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Moronke Anifowose\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/\"},\"author\":{\"name\":\"Moronke Anifowose\",\"@id\":\"https:\/\/cowrywise.com\/blog\/#\/schema\/person\/e265dbc4cbfde47ac102968366c97181\"},\"headline\":\"From Weekend Experiment to Production App: Building Cowrywise Kids with Kotlin Multiplatform\",\"datePublished\":\"2026-06-10T14:53:53+00:00\",\"dateModified\":\"2026-06-10T14:53:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/\"},\"wordCount\":1686,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/cowrywise.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-34-1-1.jpg\",\"articleSection\":[\"At Work\",\"Engineering\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/\",\"url\":\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/\",\"name\":\"From Weekend Experiment to Production App: Building Cowrywise Kids with Kotlin Multiplatform - Cowrywise Blog\",\"isPartOf\":{\"@id\":\"https:\/\/cowrywise.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-34-1-1.jpg\",\"datePublished\":\"2026-06-10T14:53:53+00:00\",\"dateModified\":\"2026-06-10T14:53:54+00:00\",\"description\":\"I started Cowrywise Kids native apps as a weekend experiment. This is how Kotlin Multiplatform, offline-first thinking, and one Boolean field helped ship it to Android and iOS.\",\"breadcrumb\":{\"@id\":\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#primaryimage\",\"url\":\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-34-1-1.jpg\",\"contentUrl\":\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-34-1-1.jpg\",\"width\":3292,\"height\":1725},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cowrywise.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"From Weekend Experiment to Production App: Building Cowrywise Kids with Kotlin Multiplatform\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cowrywise.com\/blog\/#website\",\"url\":\"https:\/\/cowrywise.com\/blog\/\",\"name\":\"Cowrywise Blog\",\"description\":\"Different articles and personal stories about managing money! Learn everything you need to know to plan and secure your financial future now. Read now.\",\"publisher\":{\"@id\":\"https:\/\/cowrywise.com\/blog\/#organization\"},\"alternateName\":\"Cowrywise Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cowrywise.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cowrywise.com\/blog\/#organization\",\"name\":\"Cowrywise\",\"url\":\"https:\/\/cowrywise.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cowrywise.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2019\/05\/avatar.png\",\"contentUrl\":\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2019\/05\/avatar.png\",\"width\":1024,\"height\":1024,\"caption\":\"Cowrywise\"},\"image\":{\"@id\":\"https:\/\/cowrywise.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/facebook.com\/cowrywise\",\"https:\/\/x.com\/cowrywise\",\"https:\/\/instagram.com\/cowrywise\",\"https:\/\/www.youtube.com\/c\/Cowrywise\",\"https:\/\/www.linkedin.com\/company\/cowrywise\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/cowrywise.com\/blog\/#\/schema\/person\/e265dbc4cbfde47ac102968366c97181\",\"name\":\"Moronke Anifowose\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cowrywise.com\/blog\/#\/schema\/person\/image\/0c5410a56b40d8bb04e5a6290d000fef\",\"url\":\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/author_display_image_1x1.jpg\",\"contentUrl\":\"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/author_display_image_1x1.jpg\",\"caption\":\"Moronke Anifowose\"},\"description\":\"Senior Android Developer, Cowrywise\",\"url\":\"https:\/\/cowrywise.com\/blog\/author\/moronke\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"From Weekend Experiment to Production App: Building Cowrywise Kids with Kotlin Multiplatform - Cowrywise Blog","description":"I started Cowrywise Kids native apps as a weekend experiment. This is how Kotlin Multiplatform, offline-first thinking, and one Boolean field helped ship it to Android and iOS.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/","og_locale":"en_US","og_type":"article","og_title":"From Weekend Experiment to Production App: Building Cowrywise Kids with Kotlin Multiplatform - Cowrywise Blog","og_description":"I started Cowrywise Kids native apps as a weekend experiment. This is how Kotlin Multiplatform, offline-first thinking, and one Boolean field helped ship it to Android and iOS.","og_url":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/","og_site_name":"Cowrywise Blog","article_publisher":"https:\/\/facebook.com\/cowrywise","article_published_time":"2026-06-10T14:53:53+00:00","article_modified_time":"2026-06-10T14:53:54+00:00","og_image":[{"width":3292,"height":1725,"url":"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-34-1-1.jpg","type":"image\/jpeg"}],"author":"Moronke Anifowose","twitter_card":"summary_large_image","twitter_creator":"@cowrywise","twitter_site":"@cowrywise","twitter_misc":{"Written by":"Moronke Anifowose","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#article","isPartOf":{"@id":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/"},"author":{"name":"Moronke Anifowose","@id":"https:\/\/cowrywise.com\/blog\/#\/schema\/person\/e265dbc4cbfde47ac102968366c97181"},"headline":"From Weekend Experiment to Production App: Building Cowrywise Kids with Kotlin Multiplatform","datePublished":"2026-06-10T14:53:53+00:00","dateModified":"2026-06-10T14:53:54+00:00","mainEntityOfPage":{"@id":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/"},"wordCount":1686,"commentCount":0,"publisher":{"@id":"https:\/\/cowrywise.com\/blog\/#organization"},"image":{"@id":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#primaryimage"},"thumbnailUrl":"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-34-1-1.jpg","articleSection":["At Work","Engineering"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/","url":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/","name":"From Weekend Experiment to Production App: Building Cowrywise Kids with Kotlin Multiplatform - Cowrywise Blog","isPartOf":{"@id":"https:\/\/cowrywise.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#primaryimage"},"image":{"@id":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#primaryimage"},"thumbnailUrl":"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-34-1-1.jpg","datePublished":"2026-06-10T14:53:53+00:00","dateModified":"2026-06-10T14:53:54+00:00","description":"I started Cowrywise Kids native apps as a weekend experiment. This is how Kotlin Multiplatform, offline-first thinking, and one Boolean field helped ship it to Android and iOS.","breadcrumb":{"@id":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#primaryimage","url":"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-34-1-1.jpg","contentUrl":"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-34-1-1.jpg","width":3292,"height":1725},{"@type":"BreadcrumbList","@id":"https:\/\/cowrywise.com\/blog\/from-weekend-experiment-to-production-app-building-cowrywise-kids-with-kotlin-multiplatform\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cowrywise.com\/blog\/"},{"@type":"ListItem","position":2,"name":"From Weekend Experiment to Production App: Building Cowrywise Kids with Kotlin Multiplatform"}]},{"@type":"WebSite","@id":"https:\/\/cowrywise.com\/blog\/#website","url":"https:\/\/cowrywise.com\/blog\/","name":"Cowrywise Blog","description":"Different articles and personal stories about managing money! Learn everything you need to know to plan and secure your financial future now. Read now.","publisher":{"@id":"https:\/\/cowrywise.com\/blog\/#organization"},"alternateName":"Cowrywise Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cowrywise.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cowrywise.com\/blog\/#organization","name":"Cowrywise","url":"https:\/\/cowrywise.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cowrywise.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2019\/05\/avatar.png","contentUrl":"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2019\/05\/avatar.png","width":1024,"height":1024,"caption":"Cowrywise"},"image":{"@id":"https:\/\/cowrywise.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/cowrywise","https:\/\/x.com\/cowrywise","https:\/\/instagram.com\/cowrywise","https:\/\/www.youtube.com\/c\/Cowrywise","https:\/\/www.linkedin.com\/company\/cowrywise\/"]},{"@type":"Person","@id":"https:\/\/cowrywise.com\/blog\/#\/schema\/person\/e265dbc4cbfde47ac102968366c97181","name":"Moronke Anifowose","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cowrywise.com\/blog\/#\/schema\/person\/image\/0c5410a56b40d8bb04e5a6290d000fef","url":"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/author_display_image_1x1.jpg","contentUrl":"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/author_display_image_1x1.jpg","caption":"Moronke Anifowose"},"description":"Senior Android Developer, Cowrywise","url":"https:\/\/cowrywise.com\/blog\/author\/moronke\/"}]}},"jetpack_featured_media_url":"https:\/\/cowrywise.com\/blog\/wp-content\/uploads\/2026\/06\/image-34-1-1.jpg","_links":{"self":[{"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/posts\/18707","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/comments?post=18707"}],"version-history":[{"count":3,"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/posts\/18707\/revisions"}],"predecessor-version":[{"id":18721,"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/posts\/18707\/revisions\/18721"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/media\/18720"}],"wp:attachment":[{"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/media?parent=18707"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/categories?post=18707"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/tags?post=18707"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/cowrywise.com\/blog\/wp-json\/wp\/v2\/coauthors?post=18707"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}