Normal view

There are new articles available, click to refresh the page.
Before yesterdayThe Eclectic Light Company

Last Week on My Mac: snapshots, the elephant in APFS

By: hoakley
10 May 2026 at 15:00

When Apple announced APFS at WWDC ten years ago, snapshots were demonstrated as one of its major features, and intended to form the basis of Time Machine’s backups in the future. Shortly after its initial release in High Sierra, Rich Trouton at Der Flounder documented their use, including how to roll back to a snapshot using Time Machine System Restore in Recovery mode. Apple described this in a support note now replaced by its successor, last revised six months ago, which carefully avoids any mention of rollback.

Snapshots are widely available in modern file systems, in some being referred to as shadow copies, and rolling back to them is a popular if not indispensable feature. Except in APFS, where there appears to be only one supported method, which is severely restricted, as I described last week. That enables you to roll back your Mac’s current Data volume to a snapshot, but doesn’t work for any other volume as far as I can discover.

Disk Utility can display and delete snapshots on any mounted disk, but can’t create or roll back to them. Its command line equivalent diskutil has the same limits (unless you’re ChatGPT). tmutil appears to be the only way to create a snapshot in macOS, but can’t perform that for an arbitrary volume, only the current Data volume and those being backed up by Time Machine.

If I wanted to make a one-off snapshot of a volume on an external SSD, I’d thus have to turn to a third-party utility. Even here I’m up against Apple again, as the API for snapshots is controlled by two restricted entitlements, com.apple.developer.vfs.snapshot for creating and deleting them, and com.apple.private.apfs.revert-to-snapshot for rollback. So far, Apple appears to have approved only apps that make backups and automatically delete their old snapshots to prevent them from overwhelming storage space, and I’m not aware of one with the com.apple.private.apfs.revert-to-snapshot entitlement to allow rollback.

As Adam Leventhal has documented in his open source command tool snaputil, the API call fs_snapshot_revert() is used to perform a rollback, but without the com.apple.private.apfs.revert-to-snapshot entitlement is non-functional.

Having drawn a blank with Apple’s tools, you might feel tempted to ask AI to help. If you’re lucky it might talk you through using Time Machine System Restore in Recovery mode, although as we’ve seen that can’t help with any volume other than the current Data volume.

ChatGPT’s responses to two queries from different people are more concerning, as it repeatedly asserted that you can roll back using a completely imaginary verb with the diskutil command, in one case using a command of the form
diskutil apfs revertToSnapshot -n com.apple.TimeMachine.YYYY-MM-DD-HHMMSS /
or using
diskutil apfs revertToSnapshot disk1s5 -n com.apple.TimeMachine.YYYY-MM-DD-HHMMSS
instead.

I have checked that in normal user mode and in Recovery mode, only to be told the revertToSnapshot verb isn’t recognised. With the aid of virtual machines, I’ve confirmed that as far back as macOS 12 Monterey, and there’s absolutely no sign of it. When challenged, ChatGPT maintained that it was “directionally right” that revert capability exists in APFS, as we already know from Time Machine System Restore, and that Apple’s entitlement structure “proves it”. It’s a shame I had to do so much checking to confirm that ChatGPT was plain wrong, and had apparently made up those commands.

Not being able to make a one-off snapshot of a volume on an external SSD might appear a small if annoying oversight, but it has consequences. Snapshots are not only blazingly quick in rollback, but they are also the only means of restoring some important volume content, such as document versions, which is easily demonstrated.

When files are restored by copying from a mounted snapshot, all their saved versions are lost. They are also lost from Time Machine backups, and in any case would be lost during migration. The only way to preserve those versions would be using a third-party tool such as my Versatility or Revisionist.

Ten years after Apple first promised us snapshots in APFS, we still don’t have access to their full capabilities, and their use remains largely undocumented. Yet they’re readily available in competing operating systems and file systems.

The macOS Natural Language framework and Nalaprop

By: hoakley
22 April 2026 at 14:30

One of the Mac’s great attractions has been its support for those whose first language isn’t English. That means many of you, as WordPress tells me that you speak German, Dutch, Chinese, Spanish, French, Italian, Japanese, Polish, Swedish, and more, although perhaps not all at once. While English is great as a lingua franca, our mother tongue is our culture and our literary tradition, and a multilingual world is far richer for all our languages.

What you may not realise is the deep support for your languages in macOS. I’m not here referring to Language & Region settings, or translation support, but to the features in the Natural Language framework, introduced in macOS 10.14. It provides support for apps to analyse text in many different natural languages and do useful things with those analyses. These days, that not only includes support provided by Apple, but enables apps to deploy custom natural language models using Machine Learning, or AI if you prefer the term.

AI seems a particular problem for non-English languages at present. In the headlong rush to be first with the most powerful Large Language Model, an industry dominated by monolingual US corporations has focussed its efforts almost entirely on English. Although most of the leading LLMs are claimed to be multilingual, and some include over 50 languages, their models are in reality overwhelmingly built on English, with less than 10% representing all other languages. And that small minority breaks down to even less when you consider individual languages: even major European languages like Italian barely get a look-in.

I’d be interested to hear of your experience accessing LLMs using non-English languages.

This is an area that Apple’s enthusiastic support for smaller, local models could make them more useful than hugely expensive LLMs built in all those US-run data centres.

When the Natural Language framework was first released for macOS, I built an app to demonstrate some of its powers, Nalaprop, and its current version still runs happily in Tahoe. Although it remains useful for some, I feel the time has come to make better use of this framework, or let Nalaprop slip away quietly with the arrival of macOS 27 this autumn/fall. Let me explain what it currently does.

Nalaprop relies on linguistic support modules loaded into macOS. As far as I can tell at present, those provide full support for English, French, Spanish, German, Italian, Portuguese, Russian and Turkish. It can also recognise many other languages, but support for those doesn’t extend to analysing them more fully.

Load your Mac up with a good selection of those, some you’d like it to aspire to, and give it an hour or so to download and install additional language support. Then open Nalaprop’s bundled demonstration text file drawn from Wikipedia’s many languages.

It then analyses the text (on the left) for the common parts of speech, such as nouns, verbs, adjectives, and colours all the words according to that classification (in the centre). As you can see here, it’s not afraid to do this on texts containing multiple languages, and appears to make a good job of all those its supports.

The next stage is initiated by clicking on the MultiParse button, which performs an even more thorough analysis, including lemmas, converting words into their ‘root’ form. For example, the English word is is a form of the verb to be, just as the French est is of être, so Nalaprop displays that root form of the word in the centre panel. As you can see, this doesn’t do much for English, which doesn’t decline words much, but for many languages it can be a great help when you’re trying to understand them.

Given all those lemmatised forms, Nalaprop can then build word lists by parts of speech, classifying the word young as an adjective, and finding a total of 28 examples (on the right) in the text of Charles Dickens’ novella A Christmas Carol.

Since I wrote Nalaprop, the Natural Language framework has extended its capabilities, and there’s a great deal more that the app could do, even down to building gazetteers of place-names, exploring similarities between words and sentences using semantic distance, and of course integrating AI built into macOS.

Nalaprop is available from its Product Page.

Should I put it into retirement, or do something more useful with it, and if so, what would you find most useful?

Painting Spring blossom 2

By: hoakley
19 April 2026 at 19:30

Following their popularisation in the nineteenth century, paintings of Spring blossom continued to flourish, reinforced perhaps by increasing urbanisation.

allinghambuckspenstreet
Helen Allingham (1848-1926), A Buckinghamshire house at Penstreet (c 1900), watercolour, 36 x 50.5 cm, Private collection. Wikimedia Commons.

Helen Allingham’s Buckinghamshire house at Penstreet (c 1900) shows a house in the hamlet of Penn Street, near the village of Penn, in Buckinghamshire, England. This remains a relatively unspoilt part of the Chilterns to the north-west of London.

metcalfdogwoodblossoms
Willard Metcalf (1858–1925), Dogwood Blossoms (1906), oil on canvas, dimensions not known, Florence Griswold Museum, Old Lyme, CT. Wikimedia Commons.

For Willard Metcalf, Dogwood Blossoms (1906) also provide the opportunity to explore the shimmering effects of dappled light, and how it can break the forms of large boulders.

bonnardearlyspring1908
Pierre Bonnard (1867-1947), Early Spring (1908), oil on canvas, 87.6 x 132.1 cm, The Phillips Collection, Washington, DC. The Athenaeum.

Pierre Bonnard painted Early Spring in 1908, shortly after his return to France from a visit to North Africa. The children are probably the artist’s friends from the Terrasse family, enjoying their garden as it comes into bloom in the improving weather.

bonnardsmallhousespringevening
Pierre Bonnard (1867-1947), The Small House, Spring Evening (1909),oil on canvas, 50.8 x 61.5 cm, Private collection. The Athenaeum.

The Small House, Spring Evening is an unusual landscape painted by Bonnard in 1909. It offsets the rich blossom on the trees at the left against the plain wall of a house, seen in failing light.

ripplsourcherry
József Rippl-Rónai (1861–1927), Sour Cherry Tree in Blossom (1909), oil on cardboard, 68 x 90 cm, Rippl-Ronai Museum, Kaposvár, Hungary. Wikimedia Commons.

József Rippl-Rónai was the founding father of modern painting in Hungary, and in 1909 painted this Sour Cherry Tree in Blossom, in which the flowers overwhelm the whole painting, just as they had for Samuel Palmer nearly eighty years earlier.

clairinonbalcony
Georges Clairin (1843–1919), On the Balcony (c 1910), oil on canvas, 110.8 × 94.9 cm, location not known. Wikimedia Commons.

One of the eclectic Georges Clairin’s later paintings from about 1910 brings an elegant group out among lush blossoms On the Balcony.

waterhousesongspringtime
John William Waterhouse (1849–1917), A Song of Springtime (1913), oil on canvas, 71.5 x 92.4 cm, Private collection. Wikimedia Commons.

John William Waterhouse’s A Song of Springtime from 1913 has lost much of the narrative from more classical accounts of Flora and the Spring, but still features plenty of cherry blossom. Flora appears with her breasts bared, and a skirtful of daffodils or narcissi, perhaps a cross-reference to Poussin’s figure of Narcissus in his Empire of Flora, and the Graces have been replaced by young children.

hydeblossomtimetokyo
Helen Hyde (1868–1919), Blossom Time in Tokyo (1914), colour woodcut print, dimensions not known, Library of Congress, Washington, DC. Wikimedia Commons.

By the First World War, Western artists weren’t just collecting and studying the art of south-east Asia, but some went to live in countries such as Japan. Among these was the American printmaker Helen Hyde, who demonstrates her mastery of colour woodcut prints in her Blossom Time in Tokyo, from 1914. This shows the tea ceremony taking place during the Spring viewing of blossom.

IF
Théo van Rysselberghe (1862–1926), Almond Trees in Blossom (Morning) (1918), oil on canvas, 46.5 x 65 cm, Private collection. WikiArt.

By the end of the war, Théo van Rysselberghe’s colours had become as strong as those of the Fauves. In Almond Trees in Blossom (Morning) the more delicate pinks of the flowers pale in comparison with his full reds and blues, even down to the blue horse pulling a plough.

berkosapplebloom
Mykhaylo Berkos (1861–1919), Apple Tree in Blossom (1919), oil on wood, 23.5 x 43.8 cm, location not known. Image by Leonid Kulikov or Mykhailo Kvitka, via Wikimedia Commons.

The Ukrainian artist Mykhaylo Berkos painted this classic Impressionist motif of an Apple Tree in Blossom in 1919. But this was to be his last Spring, as he died of typhus just before Christmas that year, at the age of only 58.

astrupappletreesinbloom
Nikolai Astrup (1880–1928), Apple Trees in Bloom (after 1920), oil on canvas, 54 x 88 cm, Private collection. Wikimedia Commons.

In the far north of Europe, the Norwegian Nikolai Astrup included blossom in many of his paintings of Spring and early summer in the fjords, as in his Apple Trees in Bloom, painted after 1920.

astrupappletreeblossom
Nikolai Astrup (1880–1928), Apple Tree in Bloom (c 1927), oil on canvas, 78 x 100 cm, Bergen Kunstmuseum, KODE, Bergen, Norway. The Athenaeum.

In about 1927, Astrup painted Apple Tree in Bloom showing the trees in full blossom and marsh marigolds in flower.

bonnardopendoor1938
Pierre Bonnard (1867-1947), The Open Door (c 1937), media not known, 126.1 x 71.1 cm, Private collection. The Athenaeum.

In Pierre Bonnard’s Open Door from about 1937, we look out through the frame of French windows to a table that has escaped into the landscape, and dazzles against brilliant blossom beyond.

I wish you a happy blossom festival, and above all peace.

Who called git, and how Claude was caught red-handed

By: hoakley
17 March 2026 at 15:30

When the same unusual dialog appears twice within a few days for two different people, you begin to suspect a pattern. This article explores a rabbit hole that involves git, the log and the fickleness of AI.

On 8 March, Guy wondered whether an XProtect update earlier this month could have been responsible for a dialog reading The “git” command requires the following command line developer tools. Would you like to install the tools now? As the request seemed legitimate but its cause remained unknown, we mulled a couple of possible culprits, and he went off to investigate.

Five days later, after he had installed the update to SilentKnight 2.13, Greg emailed me and asked whether that might be responsible for exactly the same request appearing on his Mac. This time, Greg had consulted Claude, which asked him to obtain a log extract using the pasted command
log show --start "2026-03-13 07:07:00" --end "2026-03-13 07:10:00" --style compact --info | grep -E "14207|spawn|exec|git|python|ruby|make"

Armed with that extract, Claude suggested that SilentKight had been the trigger for that dialog.

I reassured Greg that, while SilentKnight does rely on some command tools, it only uses those bundled with macOS, and never calls git even when it’s feeling bored. While I was confident that my app couldn’t have been responsible, I wondered if its reliance on making connections to databases in my Github might somehow be confounding this.

While I knew Claude was wrong over its attribution, the log extract it had obtained proved to be conclusive. Within a few minutes of looking through the entries, I had found the first recording the request for command line tools:
30.212 git Command Line Tools installation request from '[private]' (PID 14205), parent process '[private]' (parent PID 14161)
30.212 git Command Line Tools installation request from '[private]' (PID 14206), parent process '[private]' (parent PID 14161)

As ever, the log chose to censor the most important information in those entries, but it’s dumb enough to provide that information elsewhere. All I had to do was look back to discover what had the process ID of 14161, as its parent. Less than 6 seconds earlier is:
24.868 launchd [pid/14161 [Claude]:] uncorking exec source upfront

Just to be sure, I found matching entries for SilentKnight and the system_profiler tool it called after the attempt to run git:
30.153 launchd [pid/14137 [SilentKnight]:] uncorking exec source upfront
30.336 launchd [pid/14139 [system_profiler]:] uncorking exec source upfront

There was one small mystery remaining, though: why did Claude’s log show command also look for process ID 14207? That was the PID of the installondemand process that caused the dialog to be displayed:
30.215 launchd [gui/502/com.apple.dt.CommandLineTools.installondemand [14207]:] xpcproxy spawned with pid 14207

Following its previous denial, when Claude was confronted with my reading of the log, it accepted that its desktop app had triggered this dialog. Its explanation, though, isn’t convincing:
“the Claude desktop app calls git at launch — likely for one of a few mundane reasons like checking for updates, querying version information, or probing the environment. It’s not malicious, but it’s poorly considered behavior for an app that can’t assume developer tools are present on every Mac.”

In fact, it was Guy who had probably found the real reason, that the Claude app has Github as one of its four external connectors. However, that shouldn’t give it cause to try running the git command, resulting in this completely inappropriate request.

Conclusions

  • Claude might know how to use the log show command, but it still can’t understand the contents of the Unified log.
  • If you’re ever prompted to install developer command tools to enable git to be run, suspect Claude.
  • What a fickle and ever-changing thing is an AI.*

I’m very grateful to Greg and Guy for providing the information about this curious problem.

* This is based on a well-known English translation of a line from Virgil’s Aeneid, Book 4: “Varium et mutabile semper femina”, “what a fickle and ever-changing thing is a woman”. While all of us should dispute that, there’s abundant evidence that it’s true of Claude and other AI.

Last Week on My Mac: Dependency and skill fade

By: hoakley
15 March 2026 at 16:00

I expected my first internship to be baptism by fire. As the most junior doctor to two teams of neurosurgeons, I knew I’d learn plenty of new skills, among them performing lumbar punctures. Within the first few days I had been guided through that, and for much of the next six months I averaged one every couple of days. In the 45 years since I completed that job, I haven’t performed another lumbar puncture, ventricular tap, tracheostomy, or any of the other techniques I had learned. I suppose if it was a matter or life or death, I could just about remember how to drill a burr hole in an emergency, but all those other skills have now faded, some in a matter of months.

Skill fade is a distinctively animal trait, and a function of our brain. It comes in degrees: the slight fade you get from a good vacation is quickly overcome once you’ve got your feet back under the desk; more noticeable amounts from a longer maternity or sickness absence might merit a couple of weeks ‘returning to work’; and after a year or two you’ll probably need a period of formal retraining.

For the last year or so there have been increasing concerns raised over the effects of AI on critical thinking, and the Harvard Gazette published an interesting range of opinions last November. There has been extensive discussion about the dangers of ‘cognitive atrophy’ and impairment of critical thought, but less about longer-term skill fade.

I write code because I enjoy doing so. I’m not good at coding by any means, but over the forty years that I’ve been learning to code I have had a great deal of pleasure. It’s a creative act, like painting, involving a rich range of cognitive skills including plenty of art. At the end you have created something of substance, that might also benefit others.

So when someone comes along and advises me to start using Claude or another AI to write code for me, I can’t understand why I might want to stop coding and learn how to brief something else to steal my pleasure, any more than I might ask an AI to make me a painting. Moreover, were I to hand over one of my pleasures in life to AI, I know I’d find it progressively harder to code myself. While I might grow increasingly skilled at getting the AI to do much of the work, I’d also become increasingly dependent on its coding skills rather than mine.

At my age, that would remove one of my defences against the onset of dementia, and free up time to go painting more often. But what would it mean to a young engineer at the start of what they intend to be a bright career? At a time when their skills should only be developing, they’d be letting them fade. And who is going to have skills to transfer when they teach the next generation?

This extends beyond coding. Many of us are handing our writing to AI for it to summarise, one of its undisputed strengths. I started learning to write summaries before I turned 11, and have continued to develop and refine those skills for 60 years. If you’re only 20 now and leave this task to your favourite AI, how long before your summarising skills fade away?

Of course the vendors of AI want your dependence on their products. For a modest $200 to $3,600 a year you can abandon most of your independent skills to Claude, ChatGPT or Grok. If that was investing in further development of your skills, I could see the sense in that. While there are plenty of substitutes for cognitive challenges and critical thought you’re getting AI to do, there’s no substitute for developing and maintaining your essential professional skills.

I’m not advocating that you should avoid AI altogether; there are times when it has its uses, and skilful use of any tool can always be turned to advantage. But if you write code, summaries or whole novels, you need to retain and develop your own skills alongside that. Like morphine, AI has great powers, but overused it can so readily become both addictive and destructive.

Why does AI tell you to use Terminal so much?

By: hoakley
11 March 2026 at 15:30

There’s a striking difference between troubleshooting recommendations made by AI and those of humans. If you’ve tried using AI to help solve a problem with your Mac, you’ll have seen how heavily it relies on commands typed into Terminal. Look through advice given by humans, though, and you’ll see they rely more on apps with GUI interfaces. Rather than sending you straight to fsck_apfs, for instance, most humans will prefer to direct you to Disk Utility and its First Aid feature.

This is because most popular AI like ChatGPT, Claude and Grok is based on LLMs, Large Language Models, built on tokens for words. The great majority of humans using Macs work primarily in its GUI, using apps rather than Terminal commands. Verbalising the use of GUI apps is relatively difficult, and with the popularity of YouTube rather than written blogs, is becoming a dying art.

Command tools are all very well, but in this context they have disadvantages, among them being:

  • Few understand the commands used, and AI seldom explains those provided unless explicitly asked to do so. This results in the human learning little other than a long list of incomprehensible commands, and acquiring neither understanding nor insight.
  • Commands often lack the safeguards normally built into in apps, so can more readily cause damage or mislead.
  • Commands can readily generate overwhelmingly large output, even when piped to a file for later browsing.
  • Pasting commands into Terminal has become a favourite way to trick the unsuspecting into installing malware.

Even for an advanced user, confident assertions made by an AI can mislead. Here’s an example taken from ChatGPT’s advice on potential detections of malicious software. For this I have set ChatGPT’s output in italics, together with its commands as code. It’s worth noting that each command was explicitly given for the bash command shell, although in macOS Catalina (in 2019) Terminal changed to use zsh rather than bash as its default.

ChatGPT starts this exchange with a teaser that few could resist:
If you want, I can also show you how to tell in 10 seconds whether a Mac actually has malware despite these logs (there are 3 very specific indicators in Console).

Vague predicate

Here’s the most reliable way to see if macOS has ever detected malware on your Mac using Apple’s internal security logs.
1. Check the XProtect malware history
Open Terminal and run:

log show --predicate 'subsystem == "com.apple.XProtectFramework"' --last 30d

This log show command doesn’t access “Apple’s internal security logs”, which don’t exist, but the Unified log. Nor does the recommendation use Console to access the log, as promised. The predicate given is too non-specific to be useful for the stated purpose, and the time period of 30 days is absurdly long and doesn’t match the claimed period either.

On my Mac with the longest log records, its oldest Special tracev3 log file was created on 9 Feb 2026, and now has only 43 KB left from its original size of 11,298 KB, and the next oldest from 10 Feb has 34 KB left from 11,148 KB. On an older Intel Mac, the oldest creation date of a Special log file was 6 March, just 4 days previously, not 30.

When run on the first of those on 10 March, with longer log records, that log show command returns two Fault entries from 11 Feb, and more complete records from Special logs starting on 2 March, but no full log records until 6 March.

The predicate used is too general to select useful entries and is overwhelming, as it returns a total of 1,505 log entries for that command.

Log entries a year old

2. Specifically check for remediation events
To filter just real detections:

log show --predicate 'eventMessage CONTAINS "remediat"' --last 365d
If nothing prints, no malware has been removed in the last year.

ChatGPT here defines “real detections” as those for which remediation was attempted. I know of no evidence from research to support that assumption. Given the limitations in retrieving log entries from 30 days noted above, it seems absurd to assume that any log entries will be retained from over 360 days ago.

It’s malware only if blocked

3. Check Gatekeeper malware blocks
Run:

--predicate 'process == "syspolicyd" AND eventMessage CONTAINS "malware"' --last 365d

ChatGPT has here redefined its original claim to limit it to malware that was blocked by Gatekeeper, and once again assumes it can retrieve log entries from over 360 days ago.

No verification

4. Verify XProtect definitions are current
Run:

system_profiler SPInstallHistoryDataType | grep -i xprotect
You should see recent updates like:
XProtectPlistConfigData
XProtectPayloads
Apple updates these silently in the background.

This is one of its most curious recommendations, as system_profiler is the command line interface to System Information, a familiar and far more accessible app. What that command does is look for the case-insensitive string “xprotect” in the Installations list. Unfortunately, it proves useless, as all you’ll see is a long list containing those lines, without any dates of installation or version numbers. On my older Mac, piping the output to a file writes those two words on 6,528 lines without any other information about those updates.

I know of two ways to determine whether XProtect and XProtect Remediator data are current, one being SilentKnight and the other Skint, both freely available from this site. You could also perhaps construct your own script to check the catalogue on Apple’s software update server against the versions installed on your Mac, and there may well be others. But ChatGPT’s command simply doesn’t do what it claims.

How not to verify system security

Finally, ChatGPT makes another tempting offer:
If you want, I can also show you one macOS command that lists every XProtect Remediator module currently installed (there are about 20–30 of them and most people don’t realize they exist). It’s a good way to verify the system security stack is intact.

This is yet another unnecessary command. To see the scanning modules in XProtect Remediator, all you need do is look inside its bundle at /Library/Apple/System/Library/CoreServices/XProtect.app. The MacOS folder there should currently contain exactly 25 scanning modules, plus the XProtect executable itself. How listing those can possibly verify anything about the “system security stack” and whether it’s “intact” escapes me.

Conclusions

  • Of the five recommended procedures, all were Terminal commands, despite two of them being readily performed in the GUI. AI has an unhealthy preference for using command tools even when an action is more accessible in the GUI.
  • None of the five recommended procedures accomplished what was claimed, and the fourth to “verify XProtect definitions are current” was comically incorrect.
  • Using AI to troubleshoot Mac problems is neither instructive nor does it build understanding.
  • AI is training the unsuspecting to blindly copy and paste Terminal commands, which puts them at risk of being exploited by malicious software.

Previously

Claude diagnoses the log

❌
❌