{"id":1173,"date":"2026-04-06T10:00:00","date_gmt":"2026-04-06T09:00:00","guid":{"rendered":"https:\/\/wade.one\/blog\/?p=1173"},"modified":"2026-04-06T10:00:00","modified_gmt":"2026-04-06T09:00:00","slug":"most-mobile-app-complexity-is-not-in-the-ui","status":"publish","type":"post","link":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/","title":{"rendered":"Most Mobile App Complexity Is Not in the UI"},"content":{"rendered":"<p>Most mobile app complexity is not in the UI.<\/p>\n<p>The UI is the part people can see, so it gets most of the attention. It is also the part that looks close to done first. You can make an app look decent fairly quickly. Buttons work. Lists load. Navigation feels fine. Everyone gets tempted to think the hard part is behind them.<\/p>\n<p>That is usually when the actual work starts.<\/p>\n<h2>The real problems live underneath<\/h2>\n<p>The hard parts are things users only notice when they fail.<\/p>\n<p>Sync is one of them. If the app can show data that changes elsewhere, you need to decide what wins when local state and server state disagree. You need retries, conflict handling, and a clear idea of what happens when the app is offline for a while and then comes back.<\/p>\n<p>Auth is another one. Signing in is not just a screen. It is token refresh, session expiry, edge cases around account switching, and the awkward moment when a user has technically been logged out but still expects the app to feel usable.<\/p>\n<p>State gets messy fast too. Mobile apps have local state, cached state, server state, navigation state, and usually a few special cases nobody wrote down properly. The UI can look simple while the state machine underneath is already fragile.<\/p>\n<h2>Permissions are never just permissions<\/h2>\n<p>On paper, permissions are straightforward.<\/p>\n<p>In practice, they are a mix of OS behavior, user trust, feature gating, and error recovery. A camera permission prompt is not just a prompt. It is a decision point in the experience. If you handle it badly, the user does not think &#8220;the app needs permission&#8221;. They think the app is broken or annoying.<\/p>\n<p>Location, notifications, photos, Bluetooth, background activity: all of them carry product consequences, not just technical ones. The app has to behave well when permission is denied, partially granted, revoked later, or handled differently on a new OS version.<\/p>\n<h2>Offline support is where assumptions die<\/h2>\n<p>Offline support sounds like a feature. It is really a set of uncomfortable questions.<\/p>\n<p>What should the user see when the network disappears? What actions are allowed locally? What gets queued? What gets discarded? What happens if the user edits the same thing twice before syncing? What should the app say when it cannot be sure what happened?<\/p>\n<p>These are not UI questions. They are product and systems questions.<\/p>\n<p>The UI just has to expose the consequences without making the user hate the app.<\/p>\n<h2>Release problems matter more on mobile<\/h2>\n<p>Mobile apps also have a special kind of pain that web apps do not always share.<\/p>\n<p>Once you ship, you are living with the app store and the installed base. Old versions stay around. Some people update quickly, some do not, and some devices never behave like the ones you tested on. You do not control rollout in the same clean way you do on the web.<\/p>\n<p>That makes configuration, feature flags, backwards compatibility, and staged rollout part of the product, not just deployment details. A bug in a mobile release is often not &#8220;fix it and everyone gets the change&#8221;. It is &#8220;fix it, wait for store review, hope the rollout goes well, and then keep the old behavior working for a while&#8221;.<\/p>\n<h2>Why this matters<\/h2>\n<p>I think this is why mobile work is easy to underestimate.<\/p>\n<p>The UI can be tidy while the app is still hard to change. It can feel polished while the sync model is weak. It can look complete while auth is flaky, state is inconsistent, and release management is doing quiet damage in the background.<\/p>\n<p>If you want to make a mobile app genuinely good, spend enough time on the parts users never see. That is usually where the app either becomes reliable or stays annoying.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The hard part of a mobile app is usually not the screen layout. It is sync, auth, state, permissions, offline behavior, and the release problems that show up after the UI already looks finished.<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13,25],"tags":[73,71,74,72],"class_list":["post-1173","post","type-post","status-publish","format-standard","hentry","category-programming","category-software-engineer","tag-authentication","tag-mobile-development","tag-release-management","tag-sync"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Most Mobile App Complexity Is Not in the UI - wade.one<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Most Mobile App Complexity Is Not in the UI - wade.one\" \/>\n<meta property=\"og:description\" content=\"The hard part of a mobile app is usually not the screen layout. It is sync, auth, state, permissions, offline behavior, and the release problems that show up after the UI already looks finished.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/\" \/>\n<meta property=\"og:site_name\" content=\"wade.one\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-06T09:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1518\" \/>\n\t<meta property=\"og:image:height\" content=\"1506\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:site\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/04\\\/06\\\/most-mobile-app-complexity-is-not-in-the-ui\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/04\\\/06\\\/most-mobile-app-complexity-is-not-in-the-ui\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Most Mobile App Complexity Is Not in the UI\",\"datePublished\":\"2026-04-06T09:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/04\\\/06\\\/most-mobile-app-complexity-is-not-in-the-ui\\\/\"},\"wordCount\":639,\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"keywords\":[\"authentication\",\"mobile-development\",\"release-management\",\"sync\"],\"articleSection\":[\"Programming\",\"Software Engineer\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/04\\\/06\\\/most-mobile-app-complexity-is-not-in-the-ui\\\/\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/04\\\/06\\\/most-mobile-app-complexity-is-not-in-the-ui\\\/\",\"name\":\"Most Mobile App Complexity Is Not in the UI - wade.one\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\"},\"datePublished\":\"2026-04-06T09:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/04\\\/06\\\/most-mobile-app-complexity-is-not-in-the-ui\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/04\\\/06\\\/most-mobile-app-complexity-is-not-in-the-ui\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/04\\\/06\\\/most-mobile-app-complexity-is-not-in-the-ui\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wade.one\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Most Mobile App Complexity Is Not in the UI\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/\",\"name\":\"wade.one\",\"description\":\"wade womersley - york based software engineer\",\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wade.one\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\",\"name\":\"Wade Womersley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"contentUrl\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"width\":202,\"height\":200,\"caption\":\"Wade Womersley\"},\"logo\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Most Mobile App Complexity Is Not in the UI - wade.one","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:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/","og_locale":"en_GB","og_type":"article","og_title":"Most Mobile App Complexity Is Not in the UI - wade.one","og_description":"The hard part of a mobile app is usually not the screen layout. It is sync, auth, state, permissions, offline behavior, and the release problems that show up after the UI already looks finished.","og_url":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/","og_site_name":"wade.one","article_published_time":"2026-04-06T09:00:00+00:00","og_image":[{"width":1518,"height":1506,"url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_creator":"@wadewomersley","twitter_site":"@wadewomersley","twitter_misc":{"Estimated reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/#article","isPartOf":{"@id":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/"},"author":{"name":"","@id":""},"headline":"Most Mobile App Complexity Is Not in the UI","datePublished":"2026-04-06T09:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/"},"wordCount":639,"publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"keywords":["authentication","mobile-development","release-management","sync"],"articleSection":["Programming","Software Engineer"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/","url":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/","name":"Most Mobile App Complexity Is Not in the UI - wade.one","isPartOf":{"@id":"https:\/\/wade.one\/blog\/#website"},"datePublished":"2026-04-06T09:00:00+00:00","breadcrumb":{"@id":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wade.one\/blog\/"},{"@type":"ListItem","position":2,"name":"Most Mobile App Complexity Is Not in the UI"}]},{"@type":"WebSite","@id":"https:\/\/wade.one\/blog\/#website","url":"https:\/\/wade.one\/blog\/","name":"wade.one","description":"wade womersley - york based software engineer","publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wade.one\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3","name":"Wade Womersley","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","contentUrl":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","width":202,"height":200,"caption":"Wade Womersley"},"logo":{"@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png"}}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":220,"url":"https:\/\/wade.one\/blog\/2009\/10\/15\/windows-7-allows-changing-on-logon-ui-background\/","url_meta":{"origin":1173,"position":0},"title":"Windows 7 Allows Changing on Logon UI Background","author":"Wade","date":"October 15, 2009","format":false,"excerpt":"One of those little things that help make Windows 7 one of the most user oriented OS's to come out of Redmond yet - the logon screen can be changed without any 3rd party software allowing more customisation straight out of the box. It's small, but it's nice to know\u2026","rel":"","context":"In &quot;Software&quot;","block_context":{"text":"Software","link":"https:\/\/wade.one\/blog\/category\/software\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":102,"url":"https:\/\/wade.one\/blog\/2009\/09\/12\/good-news-windows-7\/","url_meta":{"origin":1173,"position":1},"title":"Good News &#8211; Windows 7","author":"Wade","date":"September 12, 2009","format":false,"excerpt":"That's the name of the video \"Good News - Windows 7.\" The little kid is called Kelly and she believes \"seven\" is a happy word - it does stand for \"togetherness\" in China though so maybe that's the underlying message here - \"with Windows 7, we're together again and I'm\u2026","rel":"","context":"In &quot;News&quot;","block_context":{"text":"News","link":"https:\/\/wade.one\/blog\/category\/news\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":139,"url":"https:\/\/wade.one\/blog\/2009\/09\/25\/copenhagen-user-experience\/","url_meta":{"origin":1173,"position":2},"title":"Copenhagen User Experience","author":"Wade","date":"September 25, 2009","format":false,"excerpt":"I'm torn on this, it has some great ideas (updating interface with dynamic search - real time search Ben?) and it has some big failings (updating interface with resizing objects.)For example, the login screen, rarely seen but those little changes with the moving\/scaling image is a great idea; the live\u2026","rel":"","context":"In &quot;Software&quot;","block_context":{"text":"Software","link":"https:\/\/wade.one\/blog\/category\/software\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1124,"url":"https:\/\/wade.one\/blog\/2023\/03\/28\/aws-cloudformation-vs-azure-the-superior-choice-for-devops\/","url_meta":{"origin":1173,"position":3},"title":"AWS CloudFormation vs. Azure: The Superior Choice for DevOps","author":"Wade","date":"March 28, 2023","format":false,"excerpt":"In the ever-evolving world of cloud computing, choosing the right cloud service provider can be a daunting task. Two of the most popular platforms, Amazon Web Services (AWS) and Microsoft Azure, are often pitted against each other. Both have their merits, but when it comes to DevOps, AWS has an\u2026","rel":"","context":"In &quot;PHP&quot;","block_context":{"text":"PHP","link":"https:\/\/wade.one\/blog\/category\/php\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":134,"url":"https:\/\/wade.one\/blog\/2009\/09\/24\/feeling-better-and-net-neutrality\/","url_meta":{"origin":1173,"position":4},"title":"Feeling Better and Net Neutrality","author":"Wade","date":"September 24, 2009","format":false,"excerpt":"It's been 5 days since I became ill and two days since I found out it was H1N1 and after taking tamiflu for the 3rd day now, I am feeling a lot better, it really clears up the symptoms very well; actually it just hides the symptoms like most over-the-counter\u2026","rel":"","context":"In &quot;Ego-centric&quot;","block_context":{"text":"Ego-centric","link":"https:\/\/wade.one\/blog\/category\/ego-centric\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":240,"url":"https:\/\/wade.one\/blog\/2009\/10\/22\/link-checker-free-tool-launched-on-site\/","url_meta":{"origin":1173,"position":5},"title":"Link Checker &#8211; Free Tool Launched on Site","author":"Wade","date":"October 22, 2009","format":false,"excerpt":"I've just finished writing version one of my link checker tool and have now launched it on my site. The tool will parse a given\u00a0 URL, extract all links on that page that point to the same domain and follow them, and keep doing that until it's finished. It will\u2026","rel":"","context":"In &quot;News&quot;","block_context":{"text":"News","link":"https:\/\/wade.one\/blog\/category\/news\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1173","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/comments?post=1173"}],"version-history":[{"count":1,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1173\/revisions"}],"predecessor-version":[{"id":1197,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1173\/revisions\/1197"}],"wp:attachment":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/media?parent=1173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/categories?post=1173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/tags?post=1173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}