<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>mk0.net - Blog</title>
  <subtitle>Notes from the studio - building, shipping, and learning in iOS.</subtitle>
  <link href="https://mk0.net/blog/feed.xml" rel="self"/>
  <link href="https://mk0.net/blog/" rel="alternate"/>
  <id>https://mk0.net/blog/</id>
  <updated>2026-05-15T09:00:00Z</updated>
  <author><name>mk0.net</name><email>hello@mk0.net</email></author>
  <icon>https://mk0.net/favicon.ico</icon>
  <logo>https://mk0.net/android-chrome-512x512.png</logo>
  <entry>
    <title>Single-person iOS studio toolkit (Xcode, scripts, sanity)</title>
    <link href="https://mk0.net/blog/mk0-swiftui-studio-toolkit.html"/>
    <id>https://mk0.net/blog/mk0-swiftui-studio-toolkit.html</id>
    <updated>2026-05-15T09:00:00Z</updated>
    <published>2026-05-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>The hardware, Xcode setup, scripts, and operational habits that let one person ship 48 iOS apps in a year - without burning out.</summary>
  </entry>
  <entry>
    <title>Surviving App Review: 5 rejections we learned from</title>
    <link href="https://mk0.net/blog/surviving-app-review-5-rejections.html"/>
    <id>https://mk0.net/blog/surviving-app-review-5-rejections.html</id>
    <updated>2026-04-15T09:00:00Z</updated>
    <published>2026-04-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Five App Store rejections we collected building 48 apps - what triggered each, how we resolved them, and the preflight checklist we now run.</summary>
  </entry>
  <entry>
    <title>Best privacy-first iOS apps for 2026</title>
    <link href="https://mk0.net/blog/best-privacy-first-ios-apps.html"/>
    <id>https://mk0.net/blog/best-privacy-first-ios-apps.html</id>
    <updated>2026-04-15T09:00:00Z</updated>
    <published>2026-04-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Apps that respect your data - tested in 2026. No third-party trackers, no behavioral SDKs, no surprise cloud uploads.</summary>
  </entry>
  <entry>
    <title>The iOS privacy nutrition label, demystified</title>
    <link href="https://mk0.net/blog/ios-privacy-nutrition-label.html"/>
    <id>https://mk0.net/blog/ios-privacy-nutrition-label.html</id>
    <updated>2026-03-15T09:00:00Z</updated>
    <published>2026-03-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>App Privacy nutrition labels are confusing and easy to fill in wrong. Here&#x27;s the decision tree we use to fill them out for every app we ship - and the categories where studios accidentally lie.</summary>
  </entry>
  <entry>
    <title>Inside ADWize: AdSense analytics in your pocket</title>
    <link href="https://mk0.net/blog/inside-adwize.html"/>
    <id>https://mk0.net/blog/inside-adwize.html</id>
    <updated>2026-02-15T09:00:00Z</updated>
    <published>2026-02-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Why we built ADWize, the trade-offs of consuming the AdSense API on-device, and what we&#x27;d build differently next time.</summary>
  </entry>
  <entry>
    <title>How BodiLog uses HealthKit and SwiftData together</title>
    <link href="https://mk0.net/blog/bodilog-healthkit-swiftdata.html"/>
    <id>https://mk0.net/blog/bodilog-healthkit-swiftdata.html</id>
    <updated>2026-02-15T09:00:00Z</updated>
    <published>2026-02-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>The data architecture behind BodiLog - when HealthKit is the source of truth, when SwiftData is, and how we resolve conflicts without losing user trust.</summary>
  </entry>
  <entry>
    <title>Best iOS weight tracker apps in 2026</title>
    <link href="https://mk0.net/blog/best-ios-weight-tracker-apps.html"/>
    <id>https://mk0.net/blog/best-ios-weight-tracker-apps.html</id>
    <updated>2026-02-15T09:00:00Z</updated>
    <published>2026-02-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Comparison of the best iOS weight tracker apps in 2026 - HealthKit integration, trend smoothing, and privacy stories.</summary>
  </entry>
  <entry>
    <title>Custom Product Pages (CPP): the underused ASO weapon</title>
    <link href="https://mk0.net/blog/custom-product-pages-aso.html"/>
    <id>https://mk0.net/blog/custom-product-pages-aso.html</id>
    <updated>2026-01-15T09:00:00Z</updated>
    <published>2026-01-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Custom Product Pages let you run up to 35 variants of your App Store listing per app. Most indie devs skip them. Here&#x27;s how to use them and what we measured.</summary>
  </entry>
  <entry>
    <title>Behind Pomoly: building a focus timer that doesn&#x27;t nag</title>
    <link href="https://mk0.net/blog/behind-pomoly-focus-timer.html"/>
    <id>https://mk0.net/blog/behind-pomoly-focus-timer.html</id>
    <updated>2026-01-15T09:00:00Z</updated>
    <published>2026-01-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>How we designed Pomoly - a Pomodoro timer that ships Live Activities, widgets, and ambient sounds without the gamification trap most focus apps fall into.</summary>
  </entry>
  <entry>
    <title>Localizing iOS apps to 15 languages without hiring translators</title>
    <link href="https://mk0.net/blog/localizing-ios-apps-15-languages.html"/>
    <id>https://mk0.net/blog/localizing-ios-apps-15-languages.html</id>
    <updated>2025-12-15T09:00:00Z</updated>
    <published>2025-12-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Every app we ship is localized to up to 15 languages. We don&#x27;t hire translators. Here&#x27;s the workflow that produces respectable copy at near-zero cost.</summary>
  </entry>
  <entry>
    <title>App Store screenshot anatomy: the 3-line formula we use</title>
    <link href="https://mk0.net/blog/app-store-screenshot-anatomy.html"/>
    <id>https://mk0.net/blog/app-store-screenshot-anatomy.html</id>
    <updated>2025-12-15T09:00:00Z</updated>
    <published>2025-12-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>What makes the first three App Store screenshots actually convert. The formula we apply to every app launch - value claim, hero feature, trust signal.</summary>
  </entry>
  <entry>
    <title>Best Pomodoro &amp; focus timer apps for iPhone (2026)</title>
    <link href="https://mk0.net/blog/best-pomodoro-focus-timer-apps.html"/>
    <id>https://mk0.net/blog/best-pomodoro-focus-timer-apps.html</id>
    <updated>2025-12-15T09:00:00Z</updated>
    <published>2025-12-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Comparison of the best Pomodoro and focus timer apps for iOS in 2026 - Live Activity support, ambient sounds, and pricing.</summary>
  </entry>
  <entry>
    <title>Pricing your indie iOS subscription: what we&#x27;ve learned</title>
    <link href="https://mk0.net/blog/pricing-indie-ios-subscription.html"/>
    <id>https://mk0.net/blog/pricing-indie-ios-subscription.html</id>
    <updated>2025-11-15T09:00:00Z</updated>
    <published>2025-11-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Yearly vs monthly, the weekly trap, trial length, and per-country pricing. The pricing decisions we now default to across our 48-app catalog.</summary>
  </entry>
  <entry>
    <title>Paywall design: 3 patterns we&#x27;ve tested across 48 apps</title>
    <link href="https://mk0.net/blog/paywall-design-3-patterns.html"/>
    <id>https://mk0.net/blog/paywall-design-3-patterns.html</id>
    <updated>2025-10-15T09:00:00Z</updated>
    <published>2025-10-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Hard paywalls vs feature gates vs free + nudges. We&#x27;ve shipped all three across our catalog. Here&#x27;s how each performs and when we pick which.</summary>
  </entry>
  <entry>
    <title>Free trial vs lifetime unlock: what converted better</title>
    <link href="https://mk0.net/blog/free-trial-vs-lifetime-unlock.html"/>
    <id>https://mk0.net/blog/free-trial-vs-lifetime-unlock.html</id>
    <updated>2025-10-15T09:00:00Z</updated>
    <published>2025-10-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>We tested 7-day free trials against one-time lifetime purchases on the same apps. Here&#x27;s what each did to conversion, retention, and revenue per user.</summary>
  </entry>
  <entry>
    <title>Best iOS habit tracker apps in 2026</title>
    <link href="https://mk0.net/blog/best-ios-habit-tracker-apps.html"/>
    <id>https://mk0.net/blog/best-ios-habit-tracker-apps.html</id>
    <updated>2025-10-15T09:00:00Z</updated>
    <published>2025-10-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>An honest comparison of the best iOS habit tracker apps in 2026 - what each does well, what they cost, and which one fits your style.</summary>
  </entry>
  <entry>
    <title>App Intents &amp; Shortcuts: the iOS discovery surface most apps ignore</title>
    <link href="https://mk0.net/blog/app-intents-shortcuts.html"/>
    <id>https://mk0.net/blog/app-intents-shortcuts.html</id>
    <updated>2025-09-15T09:00:00Z</updated>
    <published>2025-09-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>App Intents put your app in Spotlight, Siri, Shortcuts, and the Action Button. Most indie apps never wire them up. Here&#x27;s why you should and how to ship one in an afternoon.</summary>
  </entry>
  <entry>
    <title>Setting up RevenueCat for an iOS app in 30 minutes</title>
    <link href="https://mk0.net/blog/revenuecat-30-minutes.html"/>
    <id>https://mk0.net/blog/revenuecat-30-minutes.html</id>
    <updated>2025-09-15T09:00:00Z</updated>
    <published>2025-09-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>A no-fluff walkthrough of getting RevenueCat live in a SwiftUI iOS app - dashboard, SDK, paywall, sandbox testing - in about half an hour.</summary>
  </entry>
  <entry>
    <title>Live Activities done right: when to ship, when to skip</title>
    <link href="https://mk0.net/blog/live-activities-done-right.html"/>
    <id>https://mk0.net/blog/live-activities-done-right.html</id>
    <updated>2025-08-15T09:00:00Z</updated>
    <published>2025-08-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>ActivityKit Live Activities and Dynamic Island work brilliantly for some apps and badly for others. Here&#x27;s how we decide - and what we&#x27;d do differently next time.</summary>
  </entry>
  <entry>
    <title>iPad-first SwiftUI without splitting your codebase</title>
    <link href="https://mk0.net/blog/ipad-first-swiftui.html"/>
    <id>https://mk0.net/blog/ipad-first-swiftui.html</id>
    <updated>2025-08-15T09:00:00Z</updated>
    <published>2025-08-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Most universal iOS apps treat iPad as a stretched iPhone. The result is bad on both. Here&#x27;s how we ship iPad and iPhone from one SwiftUI codebase that respects each.</summary>
  </entry>
  <entry>
    <title>SwiftData migrations: 5 patterns that actually work</title>
    <link href="https://mk0.net/blog/swiftdata-migrations-5-patterns.html"/>
    <id>https://mk0.net/blog/swiftdata-migrations-5-patterns.html</id>
    <updated>2025-07-15T09:00:00Z</updated>
    <published>2025-07-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Production-tested SwiftData migration patterns from 30+ shipped iOS apps. Schema versioning, lightweight changes, custom plans, and the case where you give up and rebuild.</summary>
  </entry>
  <entry>
    <title>Building widgets people actually use (WidgetKit, 2026)</title>
    <link href="https://mk0.net/blog/building-widgets-people-use.html"/>
    <id>https://mk0.net/blog/building-widgets-people-use.html</id>
    <updated>2025-07-15T09:00:00Z</updated>
    <published>2025-07-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Most widgets are forgotten. Here&#x27;s how we design WidgetKit widgets across our apps that survive on the home screen - update budgets, glanceability, and the three-tier mental model.</summary>
  </entry>
  <entry>
    <title>SwiftUI vs UIKit in 2026: when to still pick UIKit</title>
    <link href="https://mk0.net/blog/swiftui-vs-uikit-2026.html"/>
    <id>https://mk0.net/blog/swiftui-vs-uikit-2026.html</id>
    <updated>2025-06-15T09:00:00Z</updated>
    <published>2025-06-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>SwiftUI is the default for new iOS apps in 2026, but there are still narrow situations where UIKit is the right call. Here&#x27;s the line we draw.</summary>
  </entry>
  <entry>
    <title>Our shared SwiftUI starter: what&#x27;s in it, what&#x27;s not</title>
    <link href="https://mk0.net/blog/mk0-swiftui-starter.html"/>
    <id>https://mk0.net/blog/mk0-swiftui-starter.html</id>
    <updated>2025-06-15T09:00:00Z</updated>
    <published>2025-06-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>How a focused 1,500-line SwiftUI starter let us ship 48 iOS apps in a year - and what we deliberately keep out of it.</summary>
  </entry>
  <entry>
    <title>How we shipped 48 iOS apps in a year</title>
    <link href="https://mk0.net/blog/how-we-ship-30-apps-in-a-year.html"/>
    <id>https://mk0.net/blog/how-we-ship-30-apps-in-a-year.html</id>
    <updated>2025-05-15T09:00:00Z</updated>
    <published>2025-05-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>Lessons learned building a calm, useful catalog of small SwiftUI apps - what worked, what didn&#x27;t, and the templates we now reuse on every project.</summary>
  </entry>
  <entry>
    <title>Why SwiftData (with CloudKit) changed our process</title>
    <link href="https://mk0.net/blog/why-swiftdata-changed-our-process.html"/>
    <id>https://mk0.net/blog/why-swiftdata-changed-our-process.html</id>
    <updated>2025-04-15T09:00:00Z</updated>
    <published>2025-04-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>SwiftData removed an entire layer of plumbing from our stack. Here&#x27;s how we use it across a half-dozen production apps - and where it still trips us up.</summary>
  </entry>
  <entry>
    <title>ASO for tiny studios that ship a lot</title>
    <link href="https://mk0.net/blog/aso-for-tiny-studios.html"/>
    <id>https://mk0.net/blog/aso-for-tiny-studios.html</id>
    <updated>2025-04-15T09:00:00Z</updated>
    <published>2025-04-15T09:00:00Z</published>
    <author><name>mk0.net</name></author>
    <summary>You don&#x27;t need a big budget to rank. A practical playbook for keyword research, screenshot iteration, and localization - the same one we run for every release.</summary>
  </entry>
</feed>
