❌

Normal view

FruitMenu Redux

25 September 2026 at 20:26

Rosyna Keller:

FruitMenu Redux revives a utility (FruitMenu) that brings lost Mac OS Classic features to Mac OS X. Specifically, it restores the fully customizable Apple menu.

It’s no longer a haxie that works by patching the operating system. Now, it’s a regular app that hooks into other apps (e.g. to switch to a particular window) using the accessibility APIs.

The first step was to implement every FruitMenu feature that’s still possible in the current macOS security environment. That immediately ruled out features requiring patching menus (sigh, I really miss patching menus) and features that require privileges now gated behind restricted entitlements. I also added support for viewing and executing Shortcuts.

[…]

Additionally, you can set a hotkey to any item you add to FruitMenu Redux!

[…]

Because SwiftUI doesn’t support dynamic menus, I had to rewrite all the menu code to use AppKit’s NSStatusItem and NSMenu as NSMenu is now a first-class citizen on macOS and fully supports dynamic submenu building. This means that FMR doesn’t even try to build the contents of a folder under you actually attempt to show the contents of the folder. Not only is this significantly faster, but it also uses significantly less memory.

FruitMenu is now available (Mastodon):

A built-in visual editor displays your menu on the left and a library of over 30 item types on the right. You drag items from one to the other (almost like Font/DA Mover, the best UX ever created). The library includes files and folders, submenus, Running Applications (and you can enable an option to show open windows and tabs), Mounted Volumes, Recent Items, Force Quit, Sleep, Restart, Shut Down, Shortcuts, Software Update, separators, System Settings panes, and more!

Anything you put in the FruitMenu Redux Items folder in your Library also appears in Files, folders, and aliases.

$10 (with $7 intro price), not in the Mac App Store because of accessibility.

Rosyna Keller:

OMG, Core Transferable, why do I have to declare a public UTI in my info.plist for internally dragging from one list in my app to another list in my app?! It’ll never be decoded by another app!

This was the fix to a bug I reported. With the new SwiftUI drag API, you apparently have to declare private internal drag types in your plist (on Tahoe, but not on Golden Gate).

Xounds, which plays sounds in response to user interface actions, is also back. Unlike FruitMenu, this one never appealed to meβ€”I actually prefer to have the audio muted most of the time. I do find it interesting that it supports the old sound set files from Mac OS 8. Apple dropped the APIs for playing these way back during the 64-bit transition, but Xounds knows how to extract and play the audio.

Previously:

Golden Gate Window Corners

9 June 2026 at 19:16

Adam Overholtzer:

Corners!

Simon B. StΓΈvring:

β€œWe fixed corner radius” was a WWDC keynote highlight. Let that sink in.

Rudrank:

This should have been since macOS 26 #WWDC26

Folks getting excited for consistent corner radius πŸ˜‚

Kuba Suder:

Ehh, no change here, RIP Intel Macs… stuck on the v1 Liquid Glass forever 🫀

There was so much demand for this that the Liquid Radius haxie exists. People were willing to disable FileVault and System Integrity Protection to get consistent window corners.

Previously:

Update (2026-06-23): Marcin Wichary:

Then, there’s the website you’ve just seen: elaborate, with nice β€œbefore and after” animations, and a fun landing page. I thought the installation steps, given the complexity of the effort, were exemplary and even educational. There’s also a page listing all the apps confirmed to work, and a β€œHow Liquid Radius limits its blast radius” (ha) section, revealing the author is clear-eyed about their work being a hack, and even the dimensionality of its hackiness. Even within the tool there are nice design details.

But, as I was exploring the site, I kept switching between β€œthis is ridiculous!” (laudatory) and β€œthis is ridiculous!” (derogatory) in my head.

❌