<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>The Mental Faculty — Blog</title>
    <link>https://mentalfaculty.com/blog/</link>
    <atom:link href="https://mentalfaculty.com/blog/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Notes on software, sync, and shipping by Drew McCormack.</description>
    <language>en</language>
    <item>
      <title>Ensembles Reanimated</title>
      <link>https://mentalfaculty.com/blog/ensembles-reanimated/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/ensembles-reanimated/</guid>
      <pubDate>Wed, 11 Mar 2026 14:58:29 +0000</pubDate>
      <description>TLDR; I rewrote Ensembles — my 13-year-old Objective-C sync framework — in Swift 6, using Claude Code . It now supports SwiftData, has new backends, and is in public beta. Way back in 2013, I was trying to ship cloud sync in a predecessor to Studies app. I’d been using…</description>
    </item>
    <item>
      <title>Welcome to the Machine</title>
      <link>https://mentalfaculty.com/blog/welcome-to-the-machine/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/welcome-to-the-machine/</guid>
      <pubDate>Thu, 30 Jan 2025 16:17:47 +0000</pubDate>
      <description>This post is the result of a lot of thinking. It’s not very uplifting, but it is where I am right now. *It is presented in two versions: the first is written entirely by yours truly, and the second is constructed from the same ideas, as written by an LLM.…</description>
    </item>
    <item>
      <title>Now we’re all Forked!</title>
      <link>https://mentalfaculty.com/blog/now-we-are-all-forked/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/now-we-are-all-forked/</guid>
      <pubDate>Fri, 13 Dec 2024 20:41:07 +0000</pubDate>
      <description>TLDR; I’m launching a new Swift framework called Forked for working with shared data, both on a single device, and across many. A few years ago, I was knee-deep developing the collaboration feature of our app Agenda . Agenda is mostly local-first , so it was a challenge. Effectively, Agenda…</description>
    </item>
    <item>
      <title>Developing a Distributed Data App with SwiftUI and CRDTs</title>
      <link>https://mentalfaculty.com/blog/series/replicating-types/developing-a-distributed-data-app-with-swiftui-and-crdts/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/replicating-types/developing-a-distributed-data-app-with-swiftui-and-crdts/</guid>
      <pubDate>Tue, 03 Nov 2020 12:24:26 +0000</pubDate>
      <description>And so we arrive at the final station. This series on replicating types in Swift ends with this post. I will no doubt revisit various aspects of replicating types in other posts, but we are closing out the series proper here. To recap, we have moved through Conflict Free Replicated…</description>
    </item>
    <item>
      <title>Maintaining Order in Replicating Types</title>
      <link>https://mentalfaculty.com/blog/series/replicating-types/maintaining-order-in-replicating-types/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/replicating-types/maintaining-order-in-replicating-types/</guid>
      <pubDate>Sat, 10 Oct 2020 19:08:05 +0000</pubDate>
      <description>In our continuing series on Conflict-Free Replicated Data Types (CRDTs) in Swift, we have so far introduced a number of types, beginning with the very basic register type, and working up to multi-value containers like sets and dictionaries . Now we are ready to introduce the most advanced type in…</description>
    </item>
    <item>
      <title>The Danger of Playing it Safe</title>
      <link>https://mentalfaculty.com/blog/series/replicating-types/the-danger-of-playing-it-safe/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/replicating-types/the-danger-of-playing-it-safe/</guid>
      <pubDate>Wed, 16 Sep 2020 22:18:53 +0000</pubDate>
      <description>It’s an old chestnut that Swift developers love to sink their teeth into: Should you force unwrap optionals? Everyone has an opinion about it, and I’m going to state mine as clearly as I can — forcefully unwrap early and often . Of course, this is just one opinion. We…</description>
    </item>
    <item>
      <title>Replicants All the Way Down</title>
      <link>https://mentalfaculty.com/blog/series/replicating-types/replicants-all-the-way-down/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/replicating-types/replicants-all-the-way-down/</guid>
      <pubDate>Sun, 06 Sep 2020 19:29:20 +0000</pubDate>
      <description>In the previous installment of this ongoing series on Conflict-Free Replicated Data Types (CRDTs) in Swift, I introduced you to tombstones and Lamport counts, in constructing a replicating set. This time we’ll take a similar approach for a more common data type: the dictionary or map. The code for our…</description>
    </item>
    <item>
      <title>Time for Tombstones</title>
      <link>https://mentalfaculty.com/blog/series/replicating-types/time-for-tombstones/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/replicating-types/time-for-tombstones/</guid>
      <pubDate>Thu, 20 Aug 2020 19:06:02 +0000</pubDate>
      <description>Other Posts in Series Last time we introduced our first replicating collection, an add-only set. Although useful in some specific circumstances, it isn’t a generally applicable set type, because it can only grow — you can’t remove entries from an add-only set. In this post, we are going to build…</description>
    </item>
    <item>
      <title>A First Replicating Collection</title>
      <link>https://mentalfaculty.com/blog/series/replicating-types/first-replicating-collection/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/replicating-types/first-replicating-collection/</guid>
      <pubDate>Sun, 09 Aug 2020 12:39:03 +0000</pubDate>
      <description>Other Posts in Series In the last post I introduced you to the first replicating type in this series: a register. A register is a simple type, one that you may even have used yourself at some point, which keeps the most recent value that has been set, together with…</description>
    </item>
    <item>
      <title>A First Replicating Type</title>
      <link>https://mentalfaculty.com/blog/series/replicating-types/a-first-replicating-type/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/replicating-types/a-first-replicating-type/</guid>
      <pubDate>Wed, 22 Jul 2020 10:18:56 +0000</pubDate>
      <description>Source code for this series is in this GitHub repo . It will be extended with each post. Other Posts in Series When I first started reading about Conflict-Free Replicated Data Types (CRDTs), I expected a fertile new field of Computer Science dedicated to a whole new approach to managing…</description>
    </item>
    <item>
      <title>Conflict-Free Replicated Data Types (CRDTs) in Swift</title>
      <link>https://mentalfaculty.com/blog/series/replicating-types/conflict-free-replicated-data-types-crdts-in-swift/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/replicating-types/conflict-free-replicated-data-types-crdts-in-swift/</guid>
      <pubDate>Sun, 12 Jul 2020 17:15:37 +0000</pubDate>
      <description>Other Posts in Series If you read any of my earlier posts here, you were probably left wondering what the name of the blog was all about. When I came up with the idea, I was planning to blog about decentralized approaches to handling app data, ie, how to sync…</description>
    </item>
    <item>
      <title>Under the Sheets with iCloud and Core Data: Troubleshooting</title>
      <link>https://mentalfaculty.com/blog/series/under-the-sheets/troubleshooting/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/under-the-sheets/troubleshooting/</guid>
      <pubDate>Sat, 16 Jun 2012 19:34:07 +0000</pubDate>
      <description>I want to finish off this series with a post on troubleshooting, and I’m not going to sugar coat it — there’s lots of trouble to shoot. You could find much of the material I covered earlier in the series elsewhere, but this post is based on the nitty-gritty, day-to-day…</description>
    </item>
    <item>
      <title>Under the Sheets with iCloud and Core Data: Sentinels</title>
      <link>https://mentalfaculty.com/blog/series/under-the-sheets/sentinels/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/under-the-sheets/sentinels/</guid>
      <pubDate>Fri, 08 Jun 2012 18:53:14 +0000</pubDate>
      <description>In the previous posts I alluded to some exceptional circumstances that can arise and need to be handled in a production app. In particular, If an app is running, and the user disables iCloud, or deletes the iCloud container on any device, the app will crash. If an app has…</description>
    </item>
    <item>
      <title>Under the Sheets with iCloud and Core Data: Working Code</title>
      <link>https://mentalfaculty.com/blog/series/under-the-sheets/working-code/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/under-the-sheets/working-code/</guid>
      <pubDate>Tue, 29 May 2012 19:19:49 +0000</pubDate>
      <description>Having covered Core Data syncing via iCloud from a high level, in this post I want to introduce a simple test app, which will be extended over the coming weeks. The app should eventually contain most of the code snippets you will need to get your own app up and…</description>
    </item>
    <item>
      <title>Under the Sheets with iCloud and Core Data: Seeding iCloud</title>
      <link>https://mentalfaculty.com/blog/series/under-the-sheets/seeding-icloud/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/under-the-sheets/seeding-icloud/</guid>
      <pubDate>Sat, 26 May 2012 09:38:00 +0000</pubDate>
      <description>Before you think about the fine details of syncing your Core Data via iCloud, you need to answer some big questions: How are you going to enable and disable iCloud in your app, and how are you going to seed iCloud with data when syncing gets enabled? In an ideal…</description>
    </item>
    <item>
      <title>Under the Sheets with iCloud and Core Data: How it Works</title>
      <link>https://mentalfaculty.com/blog/series/under-the-sheets/how-it-works/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/under-the-sheets/how-it-works/</guid>
      <pubDate>Thu, 17 May 2012 15:32:19 +0000</pubDate>
      <description>Apple’s documentation for Core Data syncing via iCloud offers very little insight into how it actually works. This is probably quite deliberate: Apple sees this as an implementation detail that developers should not concern themselves with. Unfortunately, if you have no concept of what is happening behind the scenes, at…</description>
    </item>
    <item>
      <title>Under the Sheets with iCloud and Core Data: The Basics  </title>
      <link>https://mentalfaculty.com/blog/series/under-the-sheets/the-basics/</link>
      <guid isPermaLink="true">https://mentalfaculty.com/blog/series/under-the-sheets/the-basics/</guid>
      <pubDate>Wed, 16 May 2012 16:51:00 +0000</pubDate>
      <description>There can be no doubt that iCloud is an important part of Apple’s future. It’s now less than a year old, but it has been a mixed start. The service itself seems up to the enormous data traffic it has to push, but some aspects of client-side integration are still…</description>
    </item>
  </channel>
</rss>
