Archive for August 27, 2025

Wednesday, August 27, 2025

Archaeology 1.4

Mothers Ruin Software (Mastodon):

Enhanced the decoding of Saved Application State to extract a couple of categories of data that were previously being ignored:

  • For a sandboxed, document-based app, the security-scoped bookmarks that are associated with an NSDocument will now be shown, usually as an additional archive labeled _NSDocument [Security-Scoped Bookmarks]. This is an array of bookmark data blobs, and is where AppKit squirrels away the security-scoped URL for a document, such that the app can re-open it upon restoration.
  • For an NSResponder that opts into the +restorableStateKeyPaths mechanism, the associated data will now be shown as an archive with the suffix [Keyed State Data]. This is a dictionary of saved values, by key path.

[…]

When showing Mach-O information (after opening a bundle or a bare executable), if the executable is part of a Universal binary, Archaeology now shows the offset and size of the architecture slice within that binary (since we can never remember the right otool(1) incantation for this). Archaeology also now shows the linker-assigned UUID for each Mach-O architecture (which is even more arcane to extract).

Previously:

Apparency 2.3

Mothers Ruin Software (Mastodon):

Changed the info pane to show Quarantine rather than Downloaded. Modern macOS likes to quarantine files that are opened by a sandboxed app, seemingly resulting in more non-download quarantines than actual downloads. You can still click on the quarantine date here to see what app triggered it and how — for example, “Downloaded by Safari” (for a true download) or “Opened by Hex Editor” (for a sandboxed app). If the quarantine has already triggered a Gatekeeper prompt (and you proceeded with opening the item anyway, in whatever tortured way macOS now requires), the quarantine text is grayed out.

[…]

Added the linker-assigned UUID to the Executable Information inspector.

This is what Local Network Privacy uses.

The appy command line tool has a new ‑‑show-components (-c) option, to show the details of an app’s components right in Terminal, without launching the Apparency app. This gives information such as bundle identifiers, versions, signing identities, and various flags (Gatekeeper, notarization, etc), all in a single plain text table. You can customize which columns are included using the ‑‑add-column (-C) option.

Previously:

iOS Simulator Files.app Broken by Symlink

Jeff Johnson:

I found that the Apple Files app was broken in the simulator, which prevented me from setting up my app properly for my screenshots. I couldn’t share a file on my Mac with the simulator. I couldn’t save a file on the simulator, for example from my own app or from the Apple Photos app, in the Files app. I couldn’t even create a new folder in the Files app.

[…]

The cause was that I had created a symbolic link from ~/Library/Developer/CoreSimulator to /Users/Shared/Developer/CoreSimulator on my Mac. Apparently the Simulator app did not like that now, even though it worked before: my symlink is not new. Perhaps the Xcode 16.4 update broke it. The solution was to delete the symlink and go back to keeping the CoreSimulator directory inside the ~/Library/Developer directory.

JavaScript Runtimes of the Last Decade

Whatever, Jamie (via Hacker News):

This last decade has seen an inundation of new JavaScript runtimes (and engines in equal measure), enabling us to run JavaScript in all manner of contexts with precise fitness for task. Through these, we’ve seen the language spread to the Cloud, the edge, Smart TVs, mobile devices, and even microcontrollers.

In this article, we’ll explore what’s driving this diversity, and why no one runtime or engine suffices for all purposes.

[…]

The earliest polyglot engine was Rhino, which was made in 1997 as an effort to write Netscape Navigator – JavaScript engine and all – fully in Java. Rhino supports two-way interop between Java and JavaScript, based on the JVM. That is to say, it allows JavaScript to implement Java interfaces and call Java class methods, while allowing Java to define JavaScript classes, run scripts, and more. By 2006, it was included in JDK 6, and by 2008, it was the basis of the Helma runtime, nowadays known as RingoJS.

[…]

While Deno and CloudFlare Workers (which run on the workerd runtime) continue Node.js’s tradition of using V8, we see Bun employing JavaScriptCore, WinterJS using SpiderMonkey, and LLRT on QuickJS. No longer is the backend solely a stage for Node.js and V8 – it’s now fashionable to pick a runtime and engine optimised for the task.