{"id":51067,"date":"2026-02-20T16:19:50","date_gmt":"2026-02-20T21:19:50","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=51067"},"modified":"2026-03-02T10:41:31","modified_gmt":"2026-03-02T15:41:31","slug":"building-zavala-4-0","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2026\/02\/20\/building-zavala-4-0\/","title":{"rendered":"Building Zavala 4.0"},"content":{"rendered":"<p><a href=\"https:\/\/vincode.io\/2026\/02\/16\/building-zavala.html\">Maurice Parker<\/a>:<\/p>\n<blockquote cite=\"https:\/\/vincode.io\/2026\/02\/16\/building-zavala.html\">\n<p>Adding data syncing to any application is hard. iCloud helps with that somewhat, but it is still really hard to get right. Shoehorning a hierarchical data structure like an outline into a flat data structure like iCloud is super hard and I did not get it right the first time. While I did improve the reliability of the syncing code over the course of many Zavala releases, it was never quite right. [&#8230;] This has been resolved in Zavala 4.0.<\/p>\n<p>To do this I had to change how Rows are stored in the internal database as well as how they are stored in the iCloud database. This new solution works really well, but isn&rsquo;t compatible with the old versions of Zavala.<\/p>\n<p>[&#8230;]<\/p>\n<p>Love it or hate it, Liquid Glass is the new design language from Apple for their latest operating systems. If you are an app developer and don&rsquo;t support it, your app is going to look dated and out of place on the latest OS&rsquo;s. Fortunately, I feel like Zavala is one of those kind of apps where Liquid Glass looks good and isn&rsquo;t the worst at usability.<\/p>\n<p>Unfortunately, it is very difficult to have a Liquid Glass version of your interface along side the legacy look and feel of previous OS versions. This is because you have to update to the latest API&rsquo;s to correctly use Liquid Glass and some things, like the spacing of elements have been changed. Basically to keep backwards compatibility for OS&rsquo;s before the version 26 ones, you need to maintain two different versions of the user interface code.<\/p>\n<p>[&#8230;]<\/p>\n<p>I used Claude Code to translate Zavala into German.<\/p>\n<\/blockquote>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2026\/02\/09\/netnewswire-7\/\">NetNewsWire 7<\/a><\/li>\n<\/ul>\n\n<p id=\"building-zavala-4-0-update-2026-03-02\">Update (<a href=\"#building-zavala-4-0-update-2026-03-02\">2026-03-02<\/a>): <a href=\"https:\/\/mastodon.social\/@stroughtonsmith\/116109617597602333\">Steve Troughton-Smith<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@stroughtonsmith\/116109617597602333\">\n<p>iOS 26 is the minimum for any major releases of my apps going forward. There&rsquo;s just no way I&rsquo;m maintaining two separate UIs for every app<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/mastodon.social\/@vincode\/116133414593407025\">Maurice Parker<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@vincode\/116133414593407025\">\n<p>I only had one user write to me to let me know that not supporting older OS versions with Zavala 4.0 inconvenienced them.<\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Maurice Parker: Adding data syncing to any application is hard. iCloud helps with that somewhat, but it is still really hard to get right. Shoehorning a hierarchical data structure like an outline into a flat data structure like iCloud is super hard and I did not get it right the first time. While I did [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2026-02-20T21:19:53Z","apple_news_api_id":"0164d949-c91c-46d7-b5f3-0c1cf11670a4","apple_news_api_modified_at":"2026-03-02T15:41:34Z","apple_news_api_revision":"AAAAAAAAAAAAAAAAAAAAAA==","apple_news_api_share_url":"https:\/\/apple.news\/AAWTZSckcRte18wwc8RZwpA","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[2],"tags":[2682,916,77,16,31,2741,26,2785,309,30,32,2742,180,269,2889],"class_list":["post-51067","post","type-post","status-publish","format-standard","hentry","category-technology","tag-claude","tag-cloudkit","tag-design","tag-icloud","tag-ios","tag-ios-26","tag-iosapp","tag-liquid-glass","tag-localization","tag-mac","tag-macapp","tag-macos-tahoe-26","tag-outliner","tag-syncing","tag-zavala"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/51067","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=51067"}],"version-history":[{"count":2,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/51067\/revisions"}],"predecessor-version":[{"id":51111,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/51067\/revisions\/51111"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=51067"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=51067"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=51067"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}