Originally published at: SetShot Tracks macOS Settings Changes - TidBITS
By now, you’ve probably read “Decades After HyperCard, AI Is Democratizing Development Again” (14 August 2026), where I revealed that I used Claude Code to create a full-fledged Mac app called SetShot that takes and compares snapshots of macOS settings. For a few weeks, SetShot was all I could think about, and I’d wake up in the morning or come home from a bike ride with an idea for a new feature or better interface. Now, and I’m frankly a bit nervous about this, it’s time to show SetShot to the world, although in the time-honored industry hedge, I’m going to claim that it’s still in beta—1.0b26 as I write this. The beta state is also my excuse for relying on a GitHub download link—click the SetShot beta link under Assets to download it.
The impetus for SetShot came from helping a friend track down an iPhone connectivity problem that turned out to be related to iCloud Private Relay being enabled during an iOS update (see “Yet Another Story of an iOS Update Silently Changing Settings,” 10 May 2026). Similar things have happened in macOS as well, and while iOS sandboxing presents a significant barrier, I wondered if it would be possible to scan the property list (.plist) files Apple uses to store macOS settings. If that were possible, perhaps I could write something that would take a snapshot of all those settings files, install a macOS update, take another snapshot, and then compare them to see if Apple had silently changed any settings.
Or rather, perhaps Claude Code could write something at my direction. The first step was a proof-of-concept shell script that demonstrated that a script could create and compare snapshots. But since I’m not a command-line guy, I found it awkward to use and difficult to parse the differences—many of which turned out to be random macOS chatter rather than actual settings changes. That’s when I asked Claude Code to walk me through setting up Xcode for creating a native Swift app that would provide a proper Mac interface. From that initial app, I then spent quite a bit of time over the next month polishing the knowledge base that identifies changes (from over 500 files!), adding features, pondering and refining the interface, capturing baseline snapshots for clean macOS installs, writing documentation, and prompting ChatGPT repeatedly until I got the icon I wanted.
I’m done, in the sense that I don’t currently have any more ideas for new features or interface changes, and the knowledge base is sufficiently mature to show it to others. So now it’s your turn. If you’re intrigued by the idea of tracking changes to macOS settings—whether they’re made by you or macOS—give it a try. SetShot is free and open source, and it should run on macOS 13 Ventura or later, although I’ve tested it only with macOS 15 Sequoia and macOS 26 Tahoe.
What I enjoyed most was making SetShot into a really good Mac app, with all the behaviors and interface niceties that I’d encourage in apps I review. I’ll call out some of those as I describe SetShot. So, let’s start at the beginning.
SetShot has four views:
- Snapshots: Most of your time in SetShot will take place in Snapshots, where you take, select, and compare snapshots.
- Journal: The Journal provides a chronological log of all recognized changes across all your comparisons.
- Settings: Here you turn on automatic snapshots and adjust their schedule, give permissions that allow SetShot to scan additional settings, change the snapshot sort order, and control software update checking.
- About: Full documentation of SetShot’s capabilities lives here. On first launch, SetShot displays the About view to encourage you to read the docs; on all subsequent launches, it defaults to the Snapshots view. It’s searchable, and all the text is selectable.
Snapshots
While developing and testing SetShot, I would take a snapshot, change one or more settings, capture another snapshot, and compare them to see if it recognized my changes. Initially, I started with an interface that listed all the snapshots in two columns, one for Before and one for After, but that ran into some awkwardness when changing the selection. TidBITS reader Brian Matthews suggested a single-column approach that worked much better, with the lower snapshot being Before and the upper one After. It was particularly interesting working through the selection and deselection logic: the first click selects a snapshot, and the second click determines which is Before and which is After. But you can also Command-click for an explicit Before and Shift-click for After—the area at the bottom between the buttons reminds you of this when nothing is selected.
Note that SetShot names each snapshot with its timestamp, complete with Today and Yesterday relative dates that update automatically. It then briefly summarizes the changes so you can identify what changed in each snapshot at a glance, counts the changes, and shows the snapshot size. (In fact, snapshots are more like 5–15 MB; they’re stored in ~/Library/Application Support/SetShot/snapshots as gzip-compressed files that take up much less space.) The selected snapshots get Before and After labels.
The bottommost snapshot is a provided baseline snapshot that I captured from a clean macOS install in a virtual machine, one for Sequoia and another for Tahoe. The snapshot right above the baseline doesn’t list the number of changes because it’s not particularly helpful to learn that there are hundreds of changes from the baseline. But it’s worth running that comparison to get a sense of how thoroughly you’ve customized your Mac.
Of course, clicking Take Snapshot creates a snapshot and clicking Compare runs the comparison. Neither action is instantaneous, so each button is replaced by a spinner with a verb (Capturing or Comparing) while it’s working.
You can rename snapshots, which may be useful for indicating the state of your Mac at that point—I leave mine with their default names. Control-click and choose Rename. You can also delete snapshots like that top one that has no recognized changes.
In real-world usage, I have SetShot run an automatic snapshot once per day. If it notices any changes, it displays a notification that, when clicked, runs a comparison against the previous snapshot. Daily snapshots are a low-impact way to track changes, and by default, SetShot deletes snapshots that contain no changes from the previous snapshot so you don’t have to worry about them consuming disk space.
Comparisons
Comparisons appear in their own windows, and if there’s room, they appear precisely to the right of the main SetShot window so you can see both at once. If you perform multiple comparisons, each subsequent comparison window tiles slightly down and to the right so you can access all of them.
In each comparison window, changes are separated into two sections: recognized changes and unrecognized changes. SetShot recognizes nearly 1400 changes, about half of which are actual settings and the other half are just macOS noise.
For each change, SetShot displays a hopefully representative icon (usually from System Settings), a description of the setting, its location, and the Before and After values, which I’ve tried to make human-readable. Where possible, there’s an Open in Settings button that opens the associated pane in System Settings.
I have no way of knowing if SetShot can identify every possible macOS change, so I created a way to crowdsource information about changes. The Submit Feedback button next to recognized changes lets you tell me about the change’s icon, description, path, and values, plus provide context and commentary. For unrecognized changes, you can select whether you think it’s a real settings change or just noise, and tell me why.
Some people may be worried that SetShot submissions will contain sensitive data. The overarching answer to that concern is that no one has to submit anything—it’s entirely optional. The secondary answer is that the feedback dialogs show you exactly what will be shared. The only data that could identify you is what you type into the Additional Context fields—include your name only if you want me to know you submitted something.
Claude Code came up with a clever submission approach. It seemed like a good idea to use GitHub Issues to collect feedback, but most people don’t have GitHub accounts or know how to use it, and that would also link them to their submissions. Instead, Claude Code walked me through setting up a Cloudflare Worker that accepts submissions from SetShot and then creates a GitHub issue using my account. Like every other website on the Internet, Cloudflare does see an IP address associated with your Mac, but that’s it.
When I ask Claude Code to check submissions, it retrieves all the open issues, processes them, and asks me for input as necessary before updating the knowledge base.
I put quite a bit of thought into the knowledge base. I didn’t want to embed it in the app because even a small wording change to a knowledge base entry would require releasing a new version of the app. Instead, the knowledge base lives in a separate GitHub repository. SetShot checks for and downloads new versions on every launch, showing the current version in the SetShot > About SetShot window. You can also click Refresh there to download a new version if you know something has changed since launch. Most users won’t want to do that, but I needed it during testing.
I even built in a hidden feature that resets SetShot to factory defaults—press Control-Option-Command while choosing SetShot > About SetShot to bring up a dire warning dialog.
Journal
Although the initial goal of SetShot was to help us determine whether Apple was silently changing settings during macOS updates, it didn’t seem likely that many people would want to run it just in case or for the “Gotcha!” value. That’s when I realized that SetShot had all the data for another, more useful feature: a chronological log of all settings changes called the journal.
When you take your first snapshot, SetShot automatically compares it with the baseline to populate your journal with all your customizations. Then, should you have to reinstall macOS or set up a Mac from scratch, you can see what you need to change. Subsequent snapshots continue to add to the journal, and SetShot is smart enough to delete journal entries for settings that flip-flop so nothing ends up different.
The Journal view resembles a comparison window, complete with the Open in Settings and Submit Feedback buttons. However, there are quite a few additions:
- Search: A search field filters the changes to just those that match the search terms. It’s handy, given how many hundreds of changes you’ll have.
- Notes: Every journal entry is timestamped and described, but there’s also a note field at the bottom that lets you add your own comments.
- Export: Since SetShot’s data is tied to a particular Mac, an Export HTML button enables you to export the journal as a file you can open on another Mac in any Web browser. The export even includes Open in Settings buttons and a checkbox so you can mark off settings as you work your way through reconfiguring the Mac.

- Deletion: SetShot’s journal may occasionally capture irrelevant changes, so I’ve added the ability to delete any entry, any snapshot, or all the data. For the first two, Control-click the entry or the snapshot header; to clear the journal entirely, click Clear All. I’m not sure why someone would want to clear the entire journal, but it seemed like something that might be requested.
You’re probably thinking that reconfiguring a Mac from scratch would be a lot of work, even with SetShot’s journal as a reminder of what needs to be done. That’s true, but before you ask if SetShot could write those settings automatically, the answer is no. I don’t know if there’s a technical reason it wouldn’t work, but the idea of writing property list files fills me with dread. In the “what could go wrong” category, the answer is “almost everything,” so it’s not going to happen.
Settings
Any good Mac app has settings to give users control over how it works. Rather than hide them away in a Settings window, I decided to keep them front and center in one of SetShot’s four views.
Automatic Snapshots
The most interesting and important setting is automatic snapshots, which make it easy to track settings changes without manual intervention. When they’re enabled, SetShot installs a macOS LaunchAgent that triggers a background snapshot on the schedule you set. If it sees changes, a notification appears that you can click to run a compare against the previous snapshot. Given how infrequently these notifications will appear, you may want to make them persistent in System Settings > Notifications > SetShot so they stick around until you click them.
The schedule interface was an interesting puzzle. Although many apps have gotten such interfaces correct, there are lots of ways to do them wrong as well. I can’t remember how Claude Code started, but it was far more complicated, whereas I wanted a single interface “sentence” that adjusted itself to the chosen unit. Minutes and Hours get only a number, whereas Day lets you pick a time of day, and Week and Month let you pick the day and time. Additional complexity was possible but seemed unnecessary. I also like the little Next Run line, since it lets users see at a glance when SetShot’s next automatic snapshot will fire.
The worry with automatic snapshots is that they’ll build up and consume significant disk space, even with gzip compression. By default, then, when you enable automatic snapshots, you’ll also get “Delete scheduled snapshots with no changes.” But I was uncomfortable with an automatic behavior that deleted data unilaterally, so even though I can’t imagine a scenario where you’d want to keep these snapshots, deselecting that checkbox will allow that.
Optional Data Sources
Let’s talk about privacy. First off, SetShot doesn’t scan for personal information—it focuses solely on macOS settings. The most “sensitive” pieces of data I can think of being revealed in SetShot’s comparisons and journal are your text replacements, which are also high on the list of things you would want recorded for setting up a Mac from scratch. If you want to keep them completely private, don’t submit feedback on them.
However, reading some macOS settings requires granting SetShot access, and when those macOS permissions dialogs appeared on the first scan, it worried a few early testers. Allowing SetShot to read settings associated with the Music and TV apps, Home Sharing, and related systems for internal use doesn’t feel like much of a concern to me, but perhaps your Music and TV app libraries are more risqué than mine. Similarly, without Full Disk Access, SetShot can’t determine which apps have been granted access to the microphone, camera, contacts, and so on.
After working through various solutions, I decided the best approach was to reduce SetShot’s scanning capabilities by default and allow users to expand them by manually granting these permissions. So the second section in Settings is Optional Data Sources, which explains the situation. For Music & Media Settings access, you can click a button to open the associated dialog, which includes another explanation. For App Privacy Permissions, you must open System Settings > Privacy & Security > Full Disk Access and toggle SetShot’s switch manually. Both blue pathnames are links, so you can click them to jump right there.
I hope this provides the level of transparency and control people want. It turned out to be rather involved to implement because it’s not inherently clear which property list files Apple protects in this way. Claude Code eventually resorted to enabling a subset of files to scan, asking me if the dialog appeared during a snapshot run, and repeating the process until we had identified all the files that triggered it.
Display Order
I admit that the next setting, which lets you reverse the order of items in the Snapshots and Journal views, feels like a throwaway. I added it because it seemed easy at the time and I was concerned that not everyone thinks the way I do. Perhaps there’s a culture where, just as with right-to-left script systems, it’s assumed that the most recent item in a chronologically sorted list should be on the bottom. Whatever the reason, it’s a setting, and while writing this paragraph, I even found and fixed a bug that failed to flip the Before and After labels when selecting snapshots to compare.
Software Updates
From the start, I had Claude Code integrate the open source Sparkle framework for manual and automatic updates. Personally, I dislike having to find, download, extract, install, and clean up from updates manually, but others prefer to do that work. When automatic updates are enabled, SetShot checks for an update at launch and offers to install it. Update checking is enabled by default in Settings, but you can disable it in the Software Updates section of the Settings view. At that point, you’d want to check for updates manually by choosing SetShot > Check for Updates.
All the variables surrounding update checking proved troublesome, and I’m not entirely certain it’s perfect yet since I can test it only with actual releases, not just new builds. It should let you choose manual or automatic updates and switch back and forth easily in Settings, but if you run into an awkward scenario, let me know.
What’s Next for SetShot
I’m really curious to see what response SetShot gets. As far as I know, SetShot is unique—I’ve never heard of another utility that tracks macOS settings changes. But is it generally useful? You’ll have to tell me that. I’m certainly going to keep running it to see if I can catch Apple changing settings silently during macOS updates.
Assuming I haven’t missed anything major, I’ll probably take SetShot to a full 1.0 soon—betas shouldn’t go on indefinitely. I’ll also add support for macOS 27 Golden Gate soon, although the baseline snapshot should wait for the 27.0 release.
If SetShot turns out to be more than a curiosity, I’d like to build it a real website, rather than using GitHub for distribution. That’s one of those housekeeping tasks that seems simple but raises numerous additional questions, so I decided to table it until I could gauge the response.
It’s somewhat ironic that SetShot won’t help with the situation that caused me to create it—it’s solely for macOS, not iOS. I’m nearly certain there’s no way an iPhone version of SetShot could access iOS settings files because of sandboxing. SetShot might be able to parse iPhone or iPad backups stored on the Mac, but that feels like a significant effort, with a lot of research needed just to see whether Apple exposes enough settings files in the backups.
Finally, I might also integrate some sort of feedback mechanism into SetShot. The Submit Feedback buttons on changes seemed like they would cover most of what people want to report, and for more general feedback, I’m happy to respond in the comments below or by direct email. But if the volume grows, or it seems like an issue-tracking system would be helpful, I can build feedback reporting into the app.
Take a look and let me know what you think!










