SetShot Tracks macOS Settings Changes

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.

Release assets list highlighting SetShot-1.0b26.zip

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.

App icon combining a basketball hoop and gear, representing a sports settings or scheduling app

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.

SetShot Snapshots list showing timestamped system setting snapshots with change summaries and file sizes, from Jun 29 to today

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.

Screenshot of a settings-change tracker listing 5 recognized changes between Jul 31 6:20 PM and Aug 6 3:28 PM, including macOS build number (25G72 to 25G76), macOS version (26.6 to 26.6.1), default Finder view style (List to Column), previous macOS build before upgrade (25F84 to 25G72), and previous macOS version before upgrade (26.5.2 to 26.6); each item has Open in Settings and Submit Feedback buttons; Unrecognized Changes count is 0, noting all changes were identified

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.

Two feedback dialogs: Submit Feedback with setting details, improvement checkboxes, and comment field; Submit Unknown Setting with plist details and radio options for expected change or macOS noise

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.

About SetShot window showing version 1.0b26 (build 38), credits, copyright, and MIT License information

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.

SetShot journal showing tracked settings changes, including macOS build and version updates from 25G72 to 25G83 on Aug 17, 2026, and Finder status bar enabled on Aug 14, 2026

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.Screenshot of SetShot Journal for August 18, 2026, listing 467 changes across 14 comparisons, showing system setting changes like macOS build number and version updates, and Finder status bar setting, each with checkboxes, before and after values, and Open in Settings buttons
  • 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.

SetShot Settings tab showing Automatic Snapshots enabled daily at 9:41 AM, with delete-unchanged option checked

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.

Screenshot showing a comparison from Aug 17 3:55 PM to today 10:35 AM with 1 recognized change: a text replacement adding "tst" to "test" in Keyboard Text Replacements settings, and 0 unrecognized changes

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.

SetShot Settings tab showing Optional Data Sources, with a macOS dialog requesting Apple Music access, offering Don't Allow or Allow

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.

SetShot Settings tab showing Display Order option with a "Show oldest first" toggle, applying to Snapshots list and Journal

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.

SetShot Settings tab showing Software Updates section with "Check for updates automatically" enabled, checking hourly

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!

5 Likes

Wow, Adam! That’s a really cool app. And it scratches an itch I’ve had for a while: There are so many settings and sometimes it just feels like wasn’t that one set differently the last time I checked?

I’m running it on Sequoia 15.7.7 (set to German) and compared a snapshot to the baseline. A lot of settings have been changed from (none) to something else, which is to be expected, I guess. I’ve found a few settings that don’t show human-readable values and have used the feedback button. As I can’t see new issues in Github for the knowledge-base I’m not sure whether it worked.

Would it be helpful for you if I include the reported value and the actual settings in the “Additional details” field?

For example the setting Controls whether the Wi-Fi indicator appears in the menu bar or only in Control Center gets reported as 18 and is set to In Menüleiste anzeigen („Show in Menu Bar“). In the knowledge-base values 2 and 8 are mapped, but not 18. Is that maybe a difference between languages?

Thanks again for creating this app and daring to publish it. I think it’s a fantastic app and look forward to what it will reveal.

Best

phillip

1 Like

I have been running SetShot for a ~month. It has not found anything alarming. More a curiosity. I like curiosities.

Innovative îs a good description.

Are going to introduce automatic submission of changes - without user intervention? And analysis at your end - looking for common threads? And without introducing privacy issues!

Anyway, I like it!

Comparison with your “macOS Tahoe 26.5.1 baseline defaults” on my Mac running (Japanese) macOS 26.6.2:

216 recognized changes

Most of the 216 items are “(none) → Off”.
“Primary system language” is “en-US → ja-JP”.

/***
Most of them seemed to be fine, but AT LEAST one thing seemed to be wrong:

Action when double-clicking a window title bar
(none) → Maximize

‘Open in Settings’ button opens the correct System Settings page, but the “Action when double-clicking a window title bar” (ウィンドウのタイトルバーをダブルクリックしたときの動作) setting is set to “拡大/縮小” which is the 2nd choice that means something like “Enlarge/Shrink” actually. SetShot reported “Maximize” which seems to be the 1st choice “画面全体に表示”.
***/

Now, SetShot reported 33,326 unrecognized changes, and said:

500 of 33,326 unrecognized changes shown. The remaining 32,826 are likely from a snapshot taken before a SetShot update changed what is captured — retake your baseline snapshot to clear them.

What do you mean by “retake your baseline snapshot”? (How can I do that? This is the first time for me to install any version of SetShot on my Mac. SetShot’s version number is 1.0b26.)

Please never mind the “(none) → Maximize” part. I just tried switching to the 1st choice “画面全体に表示” and told SetShot to re-take snapshot. I reported “Maximize → Fill”.

So, it seems that “拡大/縮小” (Enlarge/Shrink) is actually “Maximize”, and “画面全体に表示” os actually “Fill”. Mea culpa.

Really nice app! Yes, it fills a gap for a huge annoyance. I’ll be using it. Some minor nitpicks:

  • If you deliver an app that unzips itself it will start in translocation mode for lazy users like me. This means only temporary Little Snitch rules.
  • You are a writer. For the first time ever I can say that the instructions are too long.
  • If you can to improve anything then make taking a snapshot faster. Also the cancel button is missing.
  • What is the View menu for? Show/Hide Tab bar and Show all Tabs don’t do anything useful.
  • I’m not sure how useful the full list in the Journal tab is. It might be more useful to just have a search. The list for sure can grow very large.