<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Get Info: #macos</title>
    <description>Posts tagged “macos” — Blog of independent game and app developer Matt Sephton. Featuring vintage Macintosh, game development, digital artwork, Japanese esoterica, video game reviews, hacks and tips, and much more.</description>
    <link>https://blog.gingerbeardman.com/tag/macos/</link>
    <atom:link href="https://blog.gingerbeardman.com/tag/macos/index.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 03 Jul 2026 20:16:48 +0000</pubDate>
    <lastBuildDate>Fri, 03 Jul 2026 20:16:48 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>

    
      
        <item>
          <title>Transparent compression with Folder Actions in macOS</title>
          <description>&lt;p&gt;I just wired this up for my own &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;build&lt;/code&gt; folder—where my current project is quietly piling up data—and figured it was worth writing down. The same trick works on any big codebase, a pile of assets, or a crowded &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/Applications&lt;/code&gt; folder. I generally use it on folders that don’t have frequent churn, but do have large or compressible things added to them often enough.&lt;/p&gt;

&lt;p&gt;It relies on &lt;em&gt;transparent file system compression&lt;/em&gt; (sometimes called AFSC), which has been built into macOS for years. It’s nothing like a zip archive: files aren’t bundled up or locked away—they keep their names, stay right where they are, and every app opens them as normal. macOS simply stores them compressed on disk and unpacks them on the fly as they’re read. The only thing that changes is the &lt;em&gt;size on disk&lt;/em&gt;—often dramatically. Apps can even launch more quickly, which is why all Mac App Store downloads already have this sort of filesystem compression applied.&lt;/p&gt;

&lt;p&gt;The classic tool for this is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;afsctool&lt;/code&gt;, but these days I reach for &lt;a href=&quot;https://github.com/Dr-Emann/applesauce&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;applesauce&lt;/code&gt;&lt;/a&gt;, a modern Rust rewrite. It compresses much faster by working on blocks in parallel, uses less memory, and writes safely via atomic temp-file renames so you can’t corrupt a file.&lt;/p&gt;

&lt;p&gt;Rather than run it by hand in the Terminal or from a &lt;a href=&quot;/2024/07/30/taking-command-of-the-context-menu-in-macos/&quot;&gt;context menu&lt;/a&gt; every time, we can wire it into a &lt;em&gt;Folder Action&lt;/em&gt; so files get compressed the moment they land in a folder.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;install-applesauce&quot;&gt;Install applesauce&lt;/h2&gt;

&lt;p&gt;Two easy options:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Homebrew (lives in a custom tap, not the core repo)&lt;/span&gt;
brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;Dr-Emann/homebrew-tap/applesauce

&lt;span class=&quot;c&quot;&gt;# or the standalone installer, if you&apos;d rather skip brew&lt;/span&gt;
curl &lt;span class=&quot;nt&quot;&gt;--proto&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;=https&apos;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--tlsv1&lt;/span&gt;.2 &lt;span class=&quot;nt&quot;&gt;-LsSf&lt;/span&gt; https://github.com/Dr-Emann/applesauce/releases/latest/download/applesauce-cli-installer.sh | sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then find where it landed:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;which applesauce
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;On Apple silicon &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brew&lt;/code&gt; installs to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/opt/homebrew/bin/&lt;/code&gt;; older Intel Macs use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/bin/&lt;/code&gt;. We’ll need that path in a moment.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;create-the-folder-action&quot;&gt;Create the Folder Action&lt;/h2&gt;

&lt;p&gt;Folder Actions is a built-in macOS directory watcher. We’ll build one with Automator:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Open &lt;em&gt;Automator&lt;/em&gt;, choose &lt;em&gt;New Document&lt;/em&gt;, pick &lt;em&gt;Folder Action&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;At the top, set &lt;em&gt;receives files and folders added to:&lt;/em&gt; to your target folder.&lt;/li&gt;
  &lt;li&gt;If Automator drops in a &lt;em&gt;Get Selected Finder Items&lt;/em&gt; action, delete it—Folder Actions already pass incoming files along, so keeping it breaks the pipeline.&lt;/li&gt;
  &lt;li&gt;Search the sidebar for &lt;em&gt;Run AppleScript&lt;/em&gt; and drag it into the workflow.&lt;/li&gt;
  &lt;li&gt;Paste this, swapping the path if yours differs:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-applescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;parameters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;theItem&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
		&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;do shell script&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/opt/homebrew/bin/applesauce compress &quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;quoted form&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;POSIX&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;theItem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
		&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Save (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cmd + S&lt;/code&gt;) as something descriptive like “Compress”, drop a few files into the folder, and macOS shrinks them behind the scenes. Pretty easy!&lt;/p&gt;

&lt;p&gt;Just for you, here’s one I made earlier: &lt;a href=&quot;https://cdn.gingerbeardman.com/files/Compress.workflow.zip&quot;&gt;Compress.workflow.zip&lt;/a&gt; (93 KB)&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;no-sudo-required&quot;&gt;No sudo required&lt;/h2&gt;

&lt;p&gt;Changing a file’s compression &lt;em&gt;sounds&lt;/em&gt; like root territory, but &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;applesauce&lt;/code&gt; only writes to your own user-owned folders, so it isn’t. That means no Touch ID or password prompts breaking your flow, and nothing running with privileges it doesn’t need.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;what-triggers-it&quot;&gt;What triggers it&lt;/h2&gt;

&lt;p&gt;Worth knowing before you lean on this: a Folder Action only fires when items are &lt;em&gt;added&lt;/em&gt; to the folder (or removed from it), never when a file already sitting inside it changes. It isn’t recursive either—only the top level of the folder is watched, not the contents of any subfolders. That’s &lt;a href=&quot;https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/WatchFolders.html&quot;&gt;straight from Apple’s docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/Applications&lt;/code&gt; that comes with a catch. When an app updates itself it usually swaps in a whole new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.app&lt;/code&gt; bundle, which is technically a new item—but Folder Actions have always been flaky at noticing changes made by anything other than Finder, and updaters move files into place programmatically. So don’t count on self-updating apps getting re-compressed for you. When you want to be sure, drag the app out and back in, or just re-run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;applesauce compress&lt;/code&gt; on it by hand.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;choosing-the-algorithm&quot;&gt;Choosing the algorithm&lt;/h2&gt;

&lt;p&gt;By default &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;applesauce compress&lt;/code&gt; uses &lt;em&gt;LZFSE&lt;/em&gt;, Apple’s fast and well-balanced algorithm—a good pick for almost everything. Two others are available:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;LZVN&lt;/em&gt; — tuned for 64-bit, very fast to decompress.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;ZLIB&lt;/em&gt; — slower to compress, but often the best ratio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Force one with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-c&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-applescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;do shell script&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/opt/homebrew/bin/applesauce compress -c LZVN &quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;quoted form&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;POSIX&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;theItem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;applesauce info &amp;lt;path&amp;gt;&lt;/code&gt; will report the ratio and algorithm any file ended up with. You beauty!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;managing-setup&quot;&gt;Managing setup&lt;/h2&gt;

&lt;p&gt;Saving from Automator attaches the action to the folder you chose, but you can wire the same “Compress” action to more folders—or check it’s switched on if nothing’s happening—from the &lt;em&gt;Folder Actions Setup&lt;/em&gt; dialog. Right-click any folder in Finder and choose &lt;em&gt;Services → Folder Actions Setup…&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Tick &lt;em&gt;Enable Folder Actions&lt;/em&gt; (bottom-left).&lt;/li&gt;
  &lt;li&gt;Add the folder you want watched to the left column.&lt;/li&gt;
  &lt;li&gt;Pick “Compress” from the actions on the right.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now anything you drop into that folder gets squeezed automatically, no matter how it got there.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/folder-actions.png&quot; alt=&quot;IMG&quot; title=&quot;Compress workflow applied to build folder&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;

&lt;p&gt;We can confirm the savings with Finder’s Get Info (wouldn’t that be a great name for a blog?). The &lt;em&gt;Size&lt;/em&gt; line still reports the full, uncompressed size—that’s what apps see—while the smaller figure in brackets is what the folder now actually takes up &lt;em&gt;on disk&lt;/em&gt;. The gap between the two is the saving.&lt;/p&gt;

&lt;p&gt;For finer detail, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;applesauce info &amp;lt;path&amp;gt;&lt;/code&gt; prints the exact ratio and algorithm file by file.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/folder-actions-compression-results.png&quot; alt=&quot;IMG&quot; title=&quot;Check size on disk&quot; /&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Wed, 01 Jul 2026 15:44:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2026/07/01/transparent-compression-with-folder-actions-in-macos/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2026/07/01/transparent-compression-with-folder-actions-in-macos/</guid>
        </item>
      
    
      
        <item>
          <title>Today I shipped 20 apps and a screensaver</title>
          <description>&lt;p&gt;Shipping software is &lt;em&gt;hard&lt;/em&gt;. My secret to doing it successfully is a combination of careful scoping, with strict avoidance of feature creep. But even then, it’s still insanely difficult to ship something.&lt;/p&gt;

&lt;p&gt;Shipping multiple pieces of software one after the other in quick succession would be an even more gruelling task. Nobody in their right mind would choose to do such a thing…&lt;em&gt;right?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Right?&lt;/p&gt;

&lt;p&gt;I must have missed the memo because I’m shipping 20 apps and a screensaver…&lt;em&gt;today!&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;14 × macOS apps (Mac App Store)&lt;/li&gt;
  &lt;li&gt;3 × macOS apps (TestFlight)&lt;/li&gt;
  &lt;li&gt;2 × iOS apps (App Store)&lt;/li&gt;
  &lt;li&gt;1 × macOS app (GitHub download)&lt;/li&gt;
  &lt;li&gt;1 × macOS screensaver (Web download)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Get them at &lt;a href=&quot;https://www.gingerbeardman.com/apps/&quot;&gt;gingerbeardman.com/apps/&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/wall-of-apps.png&quot; alt=&quot;IMG&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;twenty&quot;&gt;Twenty!?&lt;/h2&gt;

&lt;p&gt;Yup. So I think it’s a bit of a myth that software takes huge teams to make. Some of the most successful software of all time was created by individuals: MacPaint, HyperCard, Minecraft, RollerCoaster Tycoon, BitTorrent, Stardew Valley, WinAmp, Flappy Bird, Vim, the World Wide Web, HTML, URLs, and HTTP (those last four by the same person, Tim Berners-Lee). Or perhaps it was made by power duos: Photoshop, Doom, Quake, Google, WhatsApp, Figma, Sensible Soccer. It’s still quite common today, especially in the indie scene, but perhaps it’s not talked about as much?&lt;/p&gt;

&lt;p&gt;I started making software in &lt;a href=&quot;https://blog.gingerbeardman.com/2025/03/14/digging-up-the-past-with-discmaster/&quot;&gt;1990 on the Atari ST, moved to Windows and the web in 1995&lt;/a&gt;, then to Macintosh in 2000, and iPhone in 2007. My apps and games have been &lt;a href=&quot;https://www.gingerbeardman.com/archive/tektonix/featured.htm&quot;&gt;featured in publications around the world&lt;/a&gt;, been &lt;a href=&quot;/2004/06/20/wire-hang-redux/&quot;&gt;downloaded millions of times,&lt;/a&gt; and &lt;a href=&quot;https://blog.gingerbeardman.com/2023/11/21/yoyozo-how-i-made-a-playdate-game-in-39kb/&quot;&gt;one of my games—which happens to be only 39 KB—received a “best game of the year” accolade alongside Mario and Zelda&lt;/a&gt;. The only time I wasn’t actively making and releasing software was during my time working for Apple as a Technology Evangelist, because they don’t allow it.&lt;/p&gt;

&lt;p&gt;So I had a bunch of apps that I’d built for myself over the years, and friends kept encouraging me to release them. Making an app for yourself is one thing, but shipping an app to the public is much more difficult. If I was to release one app every month it would take me almost two years to release them all! Doing the &lt;em&gt;App Store Dance&lt;/em&gt; to that kind of beat is my idea of hell. So I decided to do it “once” for all my apps. It still took a couple of months to get them ready, and a further month to get them all approved. I do not advise anybody else do this, because it was painful. But I did it, and here we are!&lt;/p&gt;

&lt;h2 id=&quot;wth&quot;&gt;WTH!?&lt;/h2&gt;

&lt;p&gt;To ship this many apps at once I had to optimise my workflow to an unprecedented level: Xcode projects set up as similarly as possible to reduce cognitive load, shell scripts to automate common build and test tasks, a script to generate changelogs ready for submission, another to automate incremental website builds based on changed files, and one more to generate screenshots of my screenshots, followed by &lt;a href=&quot;https://asccli.app&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;asc&lt;/code&gt;&lt;/a&gt; to automate uploading data to App Store Connect.&lt;/p&gt;

&lt;p&gt;Code hygiene got the same treatment. I ran &lt;a href=&quot;https://github.com/peripheryapp/periphery&quot;&gt;Periphery&lt;/a&gt; across every project to find and remove dead/unused code, which shrinks the binary. Then &lt;a href=&quot;https://github.com/kucherenko/jscpd&quot;&gt;jscpd&lt;/a&gt; to spot copy-paste duplication or similar code sections and refactor them into shared helpers, which can sometimes &lt;em&gt;increases&lt;/em&gt; binary size slightly, but it’s a price worth paying for maintainability across so many codebases. There are several Xcode/compiler optimisations that can help strip unused data from the final binary, if you’re careful. I also “cheat” by adding only the largest icon size to macOS apps to avoid over 100 KB of additional icon size variations.&lt;/p&gt;

&lt;p&gt;For the website I created a static site generator that uses a simple templating system to generate a static site for 20 apps, the whole thing is spat out in only 36ms. Each app has its own markdown content file with YAML front matter, markdown description for the press kit, privacy policy, RSS feed XML (managed by my app &lt;a href=&quot;https://www.gingerbeardman.com/apps/feedit/&quot;&gt;Feedit&lt;/a&gt;), maybe some FAQs, an SVG icon, and a bunch of screenshots in both light and dark mode. The press kit is zipped up on a full build and the static site is uploaded to my server over WebDAV. I even managed to hide a fun little mini game in there! The time and effort spent on this system over the last couple of months was roughly equivalent to building another app. But it was worth it.&lt;/p&gt;

&lt;p&gt;Most of my apps cost a small amount up front. That’s a way to show your appreciation for the time I spent making them. It also means I never need to use ads, tracking, or subscriptions to make it worth me doing this. After all making software is my job, not a hobby. All apps are actively maintained—if an app hasn’t been updated in a while, it means it has reached a stable state, rather than it being abandoned. Supporting older versions of macOS comes for free when you’re not tied to dependencies that have their own requirements and release schedule.&lt;/p&gt;

&lt;p&gt;Pricing is kept dead simple: $5, $10, or $15. Three tiers, no tricks, no “Pro” upsells, no subscriptions. Small utilities are $5, mid-size apps are $10, and the most capable or niche apps are $15. A couple are free, and there are some bundles to save money.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;fits-on-a-floppy&quot;&gt;Fits On A Floppy&lt;/h2&gt;

&lt;p&gt;Many of these apps are small enough to fit on a 1.44 MB floppy disk. Not as a gimmick but as a discipline. I use only native frameworks, avoid dependency bloat, and keep features focused. Writing small software is harder than writing big software because every line of code has to earn its place. But the result is apps that download in a blink, launch instantly, and respect your system resources. I don’t miss floppy disks, but I miss the mindset they demanded: that every byte matters, that constraints breed creativity, and that software should be light on its footprint.&lt;/p&gt;

&lt;p&gt;Read the full manifesto at &lt;a href=&quot;https://fitsonafloppy.com&quot;&gt;fitsonafloppy.com&lt;/a&gt; and &lt;em&gt;spread the word!&lt;/em&gt; ✨💾✨&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;the-app-list&quot;&gt;The App List&lt;/h2&gt;

&lt;p&gt;These apps were all built to fill personal needs, but friends have encouraged me to release them for others to use. This is the bit where I was set to claim oldest app was about 8 years old, while the newest apps was about 8 days old. But sadly App Store Review got in the way, by rejecting my oldest app that I’ve had installed on my own phone since 2019 for being “too derivative” (I’ll revisit that and launch it another time), and they took longer to review the newest app than it did for me to develop it. Other fun rejections along the way: inappropriate use of the word “Safari” in an app for managing Safari browser tabs and bookmarks, and use of web server entitlements in a web server app, sending a video of me ejecting a physical CD-ROM drive, the list goes on. But you get the idea: these apps have taken a while to arrive.&lt;/p&gt;

&lt;p&gt;Anyway, here they are, have fun with them:&lt;/p&gt;

&lt;h3 id=&quot;barfly-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/barfly/&quot;&gt;Barfly&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Analytics for your itch.io games, right in the menu bar. Track views, downloads, and purchases with delta tracking across configurable time periods from one hour to one week. Refresh on a schedule and keep historic data.&lt;/p&gt;

&lt;h3 id=&quot;brutify-macos-testflight&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/brutify/&quot;&gt;Brutify&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt; &lt;span class=&quot;chip chip-testflight&quot;&gt;TestFlight&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Lossless image optimisation using 14 engines running in parallel. Drop in images or folders and get perfectly optimised JPEG, PNG, GIF, and WebP assets without any quality loss. Fast, Slow, or Lossy modes to suit any workflow. A modern ImageOptim.&lt;/p&gt;

&lt;h3 id=&quot;ditto-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/ditto/&quot;&gt;Ditto&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Translate text without switching apps. Copy text twice with CMD+C and your clipboard is translated using Apple Translate or DeepL. Includes a floating window for real-time translation as you type. A DeepL alternative.&lt;/p&gt;

&lt;h3 id=&quot;dottie-macos-testflight&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/dottie/&quot;&gt;Dottie&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt; &lt;span class=&quot;chip chip-testflight&quot;&gt;TestFlight&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;A native Mac pixel art editor built from scratch. Drawing tools, layers with onion skinning, frame-based animation, custom palettes with Lospec import, and export to PNG, GIF, SVG, and sprite sheets. A native macOS alternative to Aseprite, Piskel, Pixen, etc.&lt;/p&gt;

&lt;h3 id=&quot;driveaway-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/driveaway/&quot;&gt;Driveaway&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Removes macOS metadata junk from external drives before you eject them. No more &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.DS_Store&lt;/code&gt; files, Spotlight indexes, and AppleDouble resource forks cluttering up your USB drives and SD cards.&lt;/p&gt;

&lt;h3 id=&quot;eqer-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/eqer/&quot;&gt;EQer&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;A system-wide 10-band equaliser that processes every app on your Mac in real time. Pick a preset, drag the curve, or paste your Audiogram and let it calculate the right listening curve for your hearing. Includes per-app control and dynamic range compression.&lt;/p&gt;

&lt;h3 id=&quot;feedit-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/feedit/&quot;&gt;Feedit&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;An editor for creating, managing, and publishing RSS 2.0 feeds. Import existing feeds, edit every field, validate against the spec, and publish to a local folder or WebDAV server. Drafts, iCloud sync, and Find &amp;amp; Replace built in. An alternative to Feeder.&lt;/p&gt;

&lt;h3 id=&quot;hubble-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/hubble/&quot;&gt;Hubble&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Interactive USB topology viewer for macOS. See your complete device tree as a zoomable canvas with speed-coded cables, throttle warnings, power diagnostics, and hot-plug animations—all updating in real time.&lt;/p&gt;

&lt;h3 id=&quot;last-dance-macos-download&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/last-dance/&quot;&gt;Last Dance&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt; &lt;span class=&quot;chip chip-direct&quot;&gt;download&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Solves a persistent macOS bug where SMB file sharing becomes unresponsive after restart. It automatically disables file sharing before shutdown and re-enables it at login. No worries.&lt;/p&gt;

&lt;h3 id=&quot;localmost-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/localmost/&quot;&gt;Localmost&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Spin up a local HTTP server by dragging a folder onto your menu bar. Multiple servers, automatic port assignment, access logs, and directory listings—all managed from a clean native interface.&lt;/p&gt;

&lt;h3 id=&quot;mojibaker-ios-free&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/mojibaker/&quot;&gt;Mojibaker&lt;/a&gt; &lt;span class=&quot;chip chip-ios&quot;&gt;iOS&lt;/span&gt; &lt;span class=&quot;chip chip-free&quot;&gt;free&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Create profile pictures with your choice of colours, gradients, images, then overlay emoji, genomji, memoji or stickers. Type a mood to get colour suggestions, compose your design, save presets, and export at high resolution.&lt;/p&gt;

&lt;h3 id=&quot;octoping-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/octoping/&quot;&gt;Octoping&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;GitHub notifications in your Mac menu bar. See what needs attention, grouped by repository with colour-coded icons matching github.com. Mark items as read or open them in your browser.&lt;/p&gt;

&lt;h3 id=&quot;papertrail-ios&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/papertrail/&quot;&gt;PaperTrail&lt;/a&gt; &lt;span class=&quot;chip chip-ios&quot;&gt;iOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Full TaskPaper editing on iOS. Projects, tasks, notes, and tags with a powerful search query language, collapsible projects, widgets, and more. Syncs via iCloud and works with TaskPaper on Mac.&lt;/p&gt;

&lt;h3 id=&quot;seeports-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/seeports/&quot;&gt;Seeports&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Shows every TCP port listening on your Mac from the menu bar. Ports are automatically grouped by service—Docker, OrbStack, Kubernetes, and more. Copy a localhost URL, open in browser, search for info on unknown ports, or terminate a rogue process.&lt;/p&gt;

&lt;h3 id=&quot;spindle-macos-testflight&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/spindle/&quot;&gt;Spindle&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt; &lt;span class=&quot;chip chip-testflight&quot;&gt;TestFlight&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Raw device access for byte-accurate CD and DVD extraction, with support for hybrid ISO 9660/HFS discs and triple hashing for verification. Rip from multiple drives simultaneously.&lt;/p&gt;

&lt;h3 id=&quot;stapler-macos-free&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/stapler/&quot;&gt;Stapler&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt; &lt;span class=&quot;chip chip-free&quot;&gt;free&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Bundle related files into logical projects without moving anything. Opening a single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.stapled&lt;/code&gt; document opens your artwork, code, todo list, and your reference docs—all at once.&lt;/p&gt;

&lt;h3 id=&quot;tabulator-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/tabulator/&quot;&gt;Tabulator&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;A bird’s-eye view of every Safari tab across local windows, tab groups, cloud tabs, and bookmarks. Search, sort, tag, export, and manage tabs from one place. Includes a vertical tabs mode, Safari extension to show open tab count, and automatic daily backup with easy restore.&lt;/p&gt;

&lt;h3 id=&quot;tsundoku-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/tsundoku/&quot;&gt;Tsundoku&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Quick access bookmarking for self-hosted services. A global hotkey captures the URL and title from your browser, suggests tags, and posts to Linkding, Raindrop, Shaarli, LinkAce, Karakeep, or Wallabag.&lt;/p&gt;

&lt;h3 id=&quot;vanishing-point-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/vanishing-point/&quot;&gt;Vanishing Point&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Perspective correction for photos and images. Four correction tools with Apple Vision auto-detection, 256+ aspect ratio presets, background removal via Vision framework, colour sampling, plus image adjustments. Export as PNG, JPG, or TIFF. QuickLook and Finder Thumbnails are supported.&lt;/p&gt;

&lt;h3 id=&quot;wavelet-macos&quot;&gt;&lt;a href=&quot;https://www.gingerbeardman.com/apps/wavelet/&quot;&gt;Wavelet&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Sound effect generator powered by synthesis, based on classic sfxr. One-click presets for laser zaps, coin pickups, explosions, and more. Layer multiple sounds with the built-in mixer and export as WAV, or as code in Lua, or Swift.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;fits-on-a-floppy-screensaver-macos-download-free&quot;&gt;&lt;a href=&quot;https://fitsonafloppy.com&quot;&gt;“Fits on a Floppy” Screensaver&lt;/a&gt; &lt;span class=&quot;chip chip-macos&quot;&gt;macOS&lt;/span&gt; &lt;span class=&quot;chip chip-direct&quot;&gt;download&lt;/span&gt; &lt;span class=&quot;chip chip-free&quot;&gt;free&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;And finally, technically, the 21st release: a macOS screen saver inspired by &lt;em&gt;After Dark&lt;/em&gt; and its classic &lt;em&gt;Flying Toasters&lt;/em&gt;. It features flying disks that do barrel rolls and spins as they drift across your screen. Thanks to my friend &lt;a href=&quot;https://jbmorley.co.uk/about/&quot;&gt;Jason Morley&lt;/a&gt; for the idea, which I built while waiting for App Store Review to finish processing the rest. To make this easier, I upgraded the old test harness I built for my &lt;a href=&quot;/2009/04/09/today-screensaver/&quot;&gt;&lt;em&gt;Today&lt;/em&gt; screensaver&lt;/a&gt; back in 2009.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Fri, 17 Apr 2026 18:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2026/04/17/today-i-shipped-twenty-apps-and-a-screensaver/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2026/04/17/today-i-shipped-twenty-apps-and-a-screensaver/</guid>
        </item>
      
    
      
        <item>
          <title>Dottie: a native macOS pixel art editor (WIP)</title>
          <description>&lt;p&gt;For the past several months I’ve been working on a pixel art app for macOS, with the goal of making it as much of a first class citizen and great Mac-like experience as possible. To that end it is fully native and built using Swift and SwiftUI, with a tiny bit of AppKit.&lt;/p&gt;

&lt;p&gt;As with all the macOS apps I build, they start with a personal need. This one was to replace the aging and unsupported &lt;a href=&quot;/2023/05/10/piskel-for-playdate/&quot;&gt;Piskel electron/web app&lt;/a&gt;. I like it and I loathe it, so I wondered if I could do better. My friend &lt;a href=&quot;https://jbmorley.co.uk/about/&quot;&gt;Jason Morley&lt;/a&gt; was the additional momentum I needed to actually get moving and try some things out—so thanks Jason!&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/dottie-mushroom-by-maya.png&quot; alt=&quot;IMG&quot; title=&quot;A mushroom drawn by Maya&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;a-little-bit-of-history-repeating&quot;&gt;A little bit of history repeating&lt;/h2&gt;

&lt;p&gt;I’ve been into pixel art since &lt;a href=&quot;/about&quot;&gt;Deluxe Paint ST&lt;/a&gt; (yes, on Atari ST not Commodore Amiga!), and of course on the classic Macintosh. I also collect &lt;a href=&quot;/2023/10/21/list-of-vintage-japanese-pixel-dot-art-software/&quot;&gt;information about the multitude of Japanese “dot art” pixel art apps&lt;/a&gt;, which are quite different to the apps that I grew up with. All this to say that I already had a list of features I missed, pined for, or otherwise thought should make a return. &lt;a href=&quot;/2024/07/14/shibuya-pixel-art-contest-2024/#bonus&quot;&gt;Naturally&lt;/a&gt;, dithering should be a tent pole feature affecting all tools.&lt;/p&gt;

&lt;p&gt;A dither smudge like the one shown below was last seen by me in 1992’s Multi Paint System (PC-98).&lt;/p&gt;

&lt;lite-youtube style=&quot;aspect-ratio: 320/243;&quot; videoid=&quot;XKyDG7aF3xU&quot; params=&quot;start=0&amp;amp;modestbranding=2&quot;&gt;
&lt;/lite-youtube&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;look-mano-dependencies&quot;&gt;Look, Ma—no dependencies!&lt;/h2&gt;

&lt;p&gt;And as an additional constraint—&lt;a href=&quot;/2023/11/21/yoyozo-how-i-made-a-playdate-game-in-39kb/&quot;&gt;which you may know I love to set for myself&lt;/a&gt;—I decided that I would use no packages or external dependencies, just system frameworks. Yes, that means I had to write my own colour picker (but, that’s my idea of a good time!) and some things took longer than just adding a package, but I can say that there is precious little wasted code inside this app. In fact, at the time of writing a single-architecture build of the app that has been readied for distribution still fits on a &lt;a href=&quot;/2025/05/19/media-darling-t-shirt-design/&quot;&gt;3.5” 2HD floppy disk&lt;/a&gt;!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;pre-mortem&quot;&gt;Pre-mortem&lt;/h2&gt;

&lt;p&gt;A full post-mortem will come after release.&lt;/p&gt;

&lt;p&gt;The trickiest parts of development so far:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;drawing pixelated circles of any width and height (all the classic graphics programming text books require the circle to have odd dimensions so that the coordinate of the centre pixel is an integer)&lt;/li&gt;
  &lt;li&gt;figuring out the intricacies of the document-based application model&lt;/li&gt;
  &lt;li&gt;trying to get the “New Document” button to appear on the file selector that appears at app launch (in fact this one still evades me for reasons I can’t figure out, &lt;a href=&quot;/support&quot;&gt;get in touch if you can help&lt;/a&gt;!)&lt;/li&gt;
  &lt;li&gt;automating help book compilation (&lt;a href=&quot;https://marioaguzman.wordpress.com/2020/09/12/auth/&quot;&gt;thanks Mario&lt;/a&gt;!)&lt;/li&gt;
  &lt;li&gt;performance bottlenecks with some aspects of SwiftUI (thanks &lt;a href=&quot;https://developer.apple.com/wwdc25/labs/overview/&quot;&gt;WWDC Lab&lt;/a&gt;!)&lt;/li&gt;
  &lt;li&gt;surprise performance gains from using AppKit for better gestures&lt;/li&gt;
  &lt;li&gt;selections and marching ants&lt;/li&gt;
  &lt;li&gt;dealing with some bad early decisions (tech debt)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most fun aspects so far:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;designing and iterating on the UI&lt;/li&gt;
  &lt;li&gt;coming up with a name and brand&lt;/li&gt;
  &lt;li&gt;implementing palette management and trying new ideas&lt;/li&gt;
  &lt;li&gt;implementing a custom colour picker, twice&lt;/li&gt;
  &lt;li&gt;drawing the various tool and app icons&lt;/li&gt;
  &lt;li&gt;getting to a point where it feels done and every new feature is icing on the cake&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One interesting thing about the app:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;there is no settings window&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;launching-late-2025&quot;&gt;Launching late-2025&lt;/h2&gt;

&lt;p&gt;I hope to launch the app this autumn, but until then: if you’re a pixel artist feel free to &lt;a href=&quot;/support&quot;&gt;get in touch&lt;/a&gt; with your email address and I’ll send you a TestFlight invite!&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Thu, 28 Aug 2025 10:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2025/08/28/dottie-native-macos-pixel-art-editor-wip/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2025/08/28/dottie-native-macos-pixel-art-editor-wip/</guid>
        </item>
      
    
      
        <item>
          <title>The menu bar items I use on macOS</title>
          <description>&lt;p&gt;This is an expanded version of &lt;a href=&quot;https://talk.macpowerusers.com/t/787-revisiting-our-mac-menu-bars/40090/44?u=gingerbeardman&quot;&gt;a post I made to the MPU Talk forum&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;visible&quot;&gt;Visible&lt;/h2&gt;

&lt;p&gt;Those I often need to interact with:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.macbartender.com&quot;&gt;Bartender&lt;/a&gt; (menu bar item manager; old version)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sindresorhus.com/dato&quot;&gt;Dato&lt;/a&gt; (alt clock and calendar with timezones; old version)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://bjango.com/mac/istatmenus/&quot;&gt;iStat Menus&lt;/a&gt; (network speed; old version)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://xbarapp.com&quot;&gt;xBar&lt;/a&gt; (custom menu items powered by my own shell scripts)
    &lt;ul&gt;
      &lt;li&gt;Proxy Status&lt;/li&gt;
      &lt;li&gt;Software Sales Stats&lt;/li&gt;
      &lt;li&gt;GitHub Issues&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;/2025/02/08/automating-the-cleaning-of-macos-specific-files-on-eject/&quot;&gt;Eject Volumes&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.caffeine-app.net&quot;&gt;Caffeine&lt;/a&gt; (used to set Mac not to sleep)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;hidden&quot;&gt;Hidden&lt;/h2&gt;

&lt;p&gt;Those I infrequently need to interact with:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Bookmark manager hotkey app (my own, unreleased; supports &lt;a href=&quot;https://github.com/sissbruecker/linkding&quot;&gt;linkding&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://apps.apple.com/us/app/otp-auth/id1471867429&quot;&gt;OTP Auth&lt;/a&gt; (2FA codes)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://c-command.com/toothfairy/&quot;&gt;ToothFairy&lt;/a&gt; (Bluetooth/AirPods helper)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/Pyroh/Fluor&quot;&gt;Fluor&lt;/a&gt; (specify function key behaviour per-app)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;always-hidden&quot;&gt;Always Hidden&lt;/h2&gt;

&lt;p&gt;Those I rarely need to interact with:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/odlp/bluesnooze&quot;&gt;Bluesnooze&lt;/a&gt; (turns off Bluetooth when Mac sleeps)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://micropixels.software/apps/neptunes&quot;&gt;NepTunes&lt;/a&gt; (audio scrobbler and track notifications)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://rogueamoeba.com/soundsource/&quot;&gt;SoundSource&lt;/a&gt; (custom audio equaliser with my hearing profile audiogram)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.deepl.com/en/macos-app&quot;&gt;DeepL&lt;/a&gt; (instant translation of copied text when doing Cmd+C twice)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.alfredapp.com&quot;&gt;Alfred&lt;/a&gt; (multi-tool with clipboard history and custom workflows)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/apexskier/DefaultBrowser&quot;&gt;Default Browser&lt;/a&gt; (open links in your most recently used/active browser)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://freemacsoft.net/tiles/&quot;&gt;Tiles&lt;/a&gt; (window manager)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.hammerspoon.org&quot;&gt;Hammerspoon&lt;/a&gt; (my own window and workspace manager functions written in Lua)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🤓&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Fri, 21 Mar 2025 18:08:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2025/03/21/the-menu-bar-items-i-use-on-macos/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2025/03/21/the-menu-bar-items-i-use-on-macos/</guid>
        </item>
      
    
      
        <item>
          <title>Automating the cleaning of macOS-specific files on Eject</title>
          <description>&lt;blockquote&gt;
  &lt;p&gt;I’ve released a native macOS app that does all this script can do &lt;em&gt;and much more!&lt;/em&gt;&lt;br /&gt;Read all about it: &lt;a href=&quot;https://www.gingerbeardman.com/apps/driveaway/&quot;&gt;gingerbeardman.com/apps/driveaway/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dot underscore &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;._&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.DS_Store&lt;/code&gt; files are macOS-specific metadata cruft generated for foreign filesystems (like FAT32 or exFAT) that are not usually needed for disks that are mainly used on other platforms. Digital cameras, music players, e-book readers, and handheld gaming devices can get confused when they encounter these odd files during file system parsing and directory listing. The problem is compounded if the devices naïvely process files by looking only at the file extension as they will then see the dot underscore version of a file as a duplicate and try to preview/play/open it.&lt;/p&gt;

&lt;p&gt;For years I’ve used an app called &lt;a href=&quot;https://web.archive.org/web/20250208072547/https://macpaw.com/cleanmymac&quot;&gt;CleanMyDrive&lt;/a&gt; to remove such files, but &lt;a href=&quot;https://macpaw.com/news/cleanmydrive-no-longer-developed&quot;&gt;it was discontinued in October 2023&lt;/a&gt;. I continued to use it until it recently stopped working completely …so I needed to find an alternative solution. There are some apps on the Mac App Store that look like they’ll do the trick, but I don’t really want to spend the time buying and trialling multiple apps to find one that fits my usage habits. I can make one!&lt;/p&gt;

&lt;p&gt;I already use an app called &lt;a href=&quot;https://xbarapp.com&quot;&gt;xbar&lt;/a&gt; for keeping track of my GitHub issues, itch.io sales, network/server status, and more. So I decided to flex my shell script muscles and put together an xbar script to do it.&lt;/p&gt;

&lt;p&gt;The script adds a menu bar item that allows you to:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Eject (click)&lt;/li&gt;
  &lt;li&gt;Unmount (option-click)&lt;/li&gt;
  &lt;li&gt;Eject All (without cleaning, useful when you want to disconnect all drives from your computer)&lt;/li&gt;
  &lt;li&gt;All with a handy notification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it! Straight to the point, no frills, functional software.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/xbar-volumes.png&quot; alt=&quot;IMG&quot; title=&quot; &quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;noscript&gt;&lt;p&gt;&lt;a href=&quot;https://gist.github.com/gingerbeardman/610f22180117ad20465d7c529cc5faa0&quot;&gt;View the source code as a Gist&lt;/a&gt;&lt;/p&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/gingerbeardman/610f22180117ad20465d7c529cc5faa0.js&quot;&gt;&lt;/script&gt;

</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 08 Feb 2025 20:45:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2025/02/08/automating-the-cleaning-of-macos-specific-files-on-eject/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2025/02/08/automating-the-cleaning-of-macos-specific-files-on-eject/</guid>
        </item>
      
    
      
        <item>
          <title>Stapler: I remade a 32 year old classic Macintosh app</title>
          <description>&lt;blockquote&gt;
  &lt;p&gt;The latest version of this app is now available as a free download on the Mac App Store.&lt;br /&gt;
More info on my apps website at: &lt;a href=&quot;https://www.gingerbeardman.com/apps/stapler&quot;&gt;gingerbeardman.com/apps/stapler/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A couple of days ago I was &lt;a href=&quot;https://news.ycombinator.com/item?id=41192547&quot;&gt;reading on Hacker News about a feature in some &lt;em&gt;Linux&lt;/em&gt; window managers where they allow collections of tabs from different apps&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This reminded me of &lt;em&gt;BeOS&lt;/em&gt;, but at the same time it reminded me of an app from 1992 for classic Macintosh called &lt;a href=&quot;https://macintoshgarden.org/apps/stapler-11&quot;&gt;&lt;em&gt;Stapler&lt;/em&gt;&lt;/a&gt;, and how &lt;a href=&quot;https://twitter.com/gingerbeardman/status/1590051288951443456&quot;&gt;I’d talked about that&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/gingerbeardman/status/1596573654674034691&quot;&gt;it’s one-time spiritual successor&lt;/a&gt;, &lt;a href=&quot;http://hasseg.org/launchList/&quot;&gt;&lt;em&gt;LaunchList&lt;/em&gt;&lt;/a&gt;, in the past. These were both similar apps that allowed you to collect and launch all the apps, files, folders, documents, related to a specific task, thus saving time. Or as Ali Rantakari so succinctly put it in 2009: “&lt;a href=&quot;http://hasseg.org/blog/post/249/launching-lots-of-stuff-at-once-on-your-mac/&quot;&gt;Opening a Bunch of Stuff at Once on Your Mac&lt;/a&gt;”.&lt;/p&gt;

&lt;p&gt;So over the past day or so I built my own take on this concept for modern macOS!&lt;/p&gt;

&lt;p&gt;Whilst my app is inspired by both Stapler (right down to the name) and LaunchList, my app adds improvements and features of its own and is more of a hybrid of both. For example, Stapler didn’t have drag and drop and LaunchList didn’t have zero-click auto-launch. My goal was to keep it as simple as possible, but no simpler. To that end, there are no preferences or settings in the app.&lt;/p&gt;

&lt;hr /&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/stapler.png&quot; alt=&quot;PNG&quot; title=&quot;Stapler, for modern macOS (12.0 or newer)&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;tell-me-more&quot;&gt;Tell me more&lt;/h2&gt;

&lt;p&gt;The idea is you set up a Stapler Document per project containing related apps, files, folders, etc. Then you can open them all at once by launching the single document. Each document contains a list of aliases that can be managed, inspected, launched using the app. The key time-saver is that if you launch a Stapler Document directly, all the items in its list will automatically be launched. Cool!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Work: text editor, run current game, pixel art editor, bitmap font app, todo list&lt;/li&gt;
  &lt;li&gt;Play: Music app, Hacker News app, Twitter app, script to position windows&lt;/li&gt;
  &lt;li&gt;Movie: run Caffeine to keep your computer on, shortcut to put displays to sleep&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s an odd way of thinking about working on a computer—it’s task-based rather than app-based or document-based. Indeed, some might say it’s an outdated way of approaching things. But I’m always &lt;a href=&quot;https://www.youtube.com/playlist?list=PLfF-zlMNYMd_ZioGb0BKdqwWnx0wCDSgU&quot;&gt;banging the drum&lt;/a&gt; about there being so much good stuff that was prematurely left behind along with the memories of System 7 (&lt;a href=&quot;/2021/04/17/turning-an-ipad-pro-into-the-ultimate-classic-macintosh/&quot;&gt;though I still use that&lt;/a&gt;), BeOS, OS/2, Amiga Workbench, GEM and the many alternative desktops of Atari ST, etc. So I thought I’d see if I could walk the walk as well as talk the talk.&lt;/p&gt;

&lt;h2 id=&quot;details&quot;&gt;Details&lt;/h2&gt;

&lt;p&gt;It’s written in Swift and SwiftUI and weighs in at 640KB, about one third of which is a multitude of icon files at many different sizes and resolutions. By creating a Document-Based App you get a ton of functionality for free, such as document/tab/window management, undo/redo (though I still needed to watch for it and refresh the app window), and much more.&lt;/p&gt;

&lt;p&gt;The editor is a native macOS window that’s kind of like list view in a file manager, or a spreadsheet, or a little folder…depending on your point of view. Plus some menu commands and keyboard equivalents. You can have multiple windows open at once, for example one window each for all your common tasks, giving you the ability to launch full tasks or parts of them with minimal effort.&lt;/p&gt;

&lt;p&gt;The items in each list are macOS &lt;a href=&quot;https://eclecticlight.co/2020/05/21/bookmarks-a-type-of-alias-their-access-and-use/&quot;&gt;bookmarks&lt;/a&gt; (sometimes: security scoped bookmarks) which are a type of authorised/verified/secure alias (in fact, they’re still called aliases in the code) that have been around for about 10–15 years. They contain the path plus a bunch more info. As macOS becomes more locked-down the recommended way of accessing files is to retrieve these bookmarks through the normal layers of system permissions and security. Without the bookmarks, for example just using plain text paths, I would not be able to show the full images in Quick Look or easily launch the list items. A key benefit is that the bookmark will still resolve if the file is moved somewhere else on the same disk, or even to a different volume!&lt;/p&gt;

&lt;p&gt;I store the items as JSON in the saved file, simply because I prefer it to XML (which is the main/default option). I wanted the files to still be human readable and editable to a degree.&lt;/p&gt;

&lt;p&gt;The files are launched using the default app specified by that file, so it can be changed on a per-file basis. Individual images might open in an image editor, image viewer, app to run OCR, script to run OCR on it, etc.&lt;/p&gt;

&lt;p&gt;Dealing with files was both cool and annoying, cool that you can get the bookmarks to files so easily, but annoying that you have to jump through so many hoops to work around the security and sandbox protections and end up having to do file requests in a long-winded way, and then there’s having to tweak plist entries to give the app just the right permissions. I’m using some features of SwiftUI that mean the app can’t run on anything before macOS 14 Sonoma. All-in-all I’d say modern macOS development is a bit of a mixed bag. Take it or leave it.&lt;/p&gt;

&lt;h2 id=&quot;bonus-tip&quot;&gt;Bonus tip&lt;/h2&gt;

&lt;p&gt;Make sure to &lt;em&gt;uncheck&lt;/em&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;System Settings&lt;/code&gt; &amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Desktop &amp;amp; Dock&lt;/code&gt; &amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Windows&lt;/code&gt; &amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Close windows when quitting an application&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then leave the windows of an app open as you quit it. When you next launch the app its windows will restore to their previous size and position. If you close the windows first, then the app will restore to having no windows open.&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;h2 id=&quot;thanks&quot;&gt;Thanks&lt;/h2&gt;

  &lt;p&gt;My good friend Dave Roberts (Serendipity App Company) for brainstorming why it was so damned difficult to get the app to react differently when a document was opened from Finder. Rip it up and start again! To Dustin Mierau for kickstarting this trend of remaking forgotten old apps for modern macOS. And eternal thanks to &lt;a href=&quot;https://twitter.com/chrispatterson/status/1822396663425532259&quot;&gt;Chris Patterson&lt;/a&gt; and Ali Rantakari for their apps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;since-launch&quot;&gt;Since launch&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;support added for macOS 12 and newer (was originally macOS 14 and newer)&lt;/li&gt;
  &lt;li&gt;new features added&lt;/li&gt;
  &lt;li&gt;omissions addressed&lt;/li&gt;
  &lt;li&gt;bug fixes&lt;/li&gt;
  &lt;li&gt;new icon on the way&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;elsewhere&quot;&gt;Elsewhere&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=41212193&quot;&gt;Hacker News&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tidbits.com/2024/09/02/appbits-stapler-opens-multiple-apps-documents-and-folders/&quot;&gt;TidBits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 10 Aug 2024 21:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2024/08/10/stapler-i-remade-a-32-year-old-classic-macintosh-app/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2024/08/10/stapler-i-remade-a-32-year-old-classic-macintosh-app/</guid>
        </item>
      
    
      
        <item>
          <title>Search Moby Games using Alfred app</title>
          <description>&lt;p&gt;Earlier this year I made a workflow for &lt;a href=&quot;https://alfred.app&quot;&gt;Alfred app&lt;/a&gt; to allow easy searching of &lt;a href=&quot;https://www.mobygames.com&quot;&gt;Moby Games&lt;/a&gt;. Earlier this week it was released on &lt;a href=&quot;https://alfred.app/workflows/gingerbeardman/moby-games/&quot;&gt;Alfred Gallery&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/alfred-moby-games.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;download&quot;&gt;Download&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://alfred.app/workflows/gingerbeardman/moby-games/&quot;&gt;alfred.app/workflows/gingerbeardman/moby-games/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The workflow &lt;a href=&quot;https://www.mobygames.com/info/api/&quot;&gt;requires an API key that you can get instantly&lt;/a&gt; via your Moby Games profile page.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you’d like access to the free API (not-for-profit use), create a MobyGames account and then visit your profile page. Click the ‘API’ link under your user name to sign up for an API key. If you wish to use the API key with an existing game launcher or plugin please specify which launcher and plugin you will be using.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Enter “Alfred app Moby Games workflow”. Then paste your API into the Workflow configuration.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;open-source&quot;&gt;Open Source&lt;/h2&gt;
&lt;p&gt;Suggestions and PRs are welcome at: &lt;a href=&quot;https://github.com/gingerbeardman/alfred-moby-games/&quot;&gt;github.com/gingerbeardman/alfred-moby-games/&lt;/a&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sun, 04 Aug 2024 12:57:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2024/08/04/search-moby-games-using-alfred-app/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2024/08/04/search-moby-games-using-alfred-app/</guid>
        </item>
      
    
      
        <item>
          <title>Taking command of the Context Menu in macOS</title>
          <description>&lt;p&gt;Yesterday on Twitter the inimitable &lt;a href=&quot;https://twitter.com/mortenjust/status/1817991110544744764&quot;&gt;Morten Just posted a preview of a tool he’s created&lt;/a&gt; that wrap ffmpeg to allow movies, such screen recordings but pretty much anything, to be re-encoded to a smaller filesize.&lt;/p&gt;

&lt;p&gt;I responded with a trick I use to do the same on “right-click” context menu using a macOS app called ContextMenu, and others said it was possible to do it using Automator (with some caveats). In this blog post I’ll compare the two.&lt;/p&gt;

&lt;p&gt;But first… let’s talk about how we will make this work.&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;processing-files-through-shell-scripts&quot;&gt;Processing files through shell scripts&lt;/h1&gt;

&lt;p&gt;We’ll be making use of command line tools to do the heavy lifting, but don’t worry I’ll show that this can be as simple as a single-line command to process a single file, or a shell scripts of a few lines to process multiple files.&lt;/p&gt;

&lt;h3 id=&quot;single-files&quot;&gt;Single files&lt;/h3&gt;

&lt;p&gt;The one-line command to convert a video or audio file can be as simple as the following:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/opt/homebrew/bin/ffmpeg &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$@&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@%.*&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.mp4&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There are some assumptions here:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ffmpeg&lt;/code&gt; has been installed using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brew&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;my Mac is Apple silicon, so &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brew&lt;/code&gt; installs commands to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/opt/homebrew/bin/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;(older Intel Macs will have them installed to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/bin/&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;the script is called with parameters passed by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;argv&lt;/code&gt; so the file is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$@&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;the new file will have the same name as the original, but with a new .mp4 file extension&lt;/li&gt;
  &lt;li&gt;it only works on single files (read on)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We &lt;em&gt;could&lt;/em&gt; add an extra parameter to the command line to use hardware encoding (hevc_videotoolbox) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-c:v hevc_videotoolbox&lt;/code&gt;, which would be something like twice as fast, but this will not reduce the file size. So we stick with ffmpeg default settings.&lt;/p&gt;

&lt;p&gt;You can take the exact same approach with any destination format as it is decided by the file extension. Cool. You could convert any of ffmpeg’s supported file types to any other, such as WAV, OGG, MKV, etc.&lt;/p&gt;

&lt;p&gt;And as we’ll see later we can take this simple command and change it to use other command line tools to compress GIFs, with or without upscaling, and many other timesaving tasks. Powerful stuff!&lt;/p&gt;

&lt;h3 id=&quot;multiple-files&quot;&gt;Multiple files&lt;/h3&gt;

&lt;p&gt;To extend this approach for multiple files you can use the following for loop:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;f &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$@&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    /opt/homebrew/bin/ffmpeg &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$f&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%.*&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.mp4&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;multiple-files-in-parallel&quot;&gt;Multiple files in parallel&lt;/h3&gt;

&lt;p&gt;And to process those multiple files in parallel (be careful not to overwhelm your computer!) we can background each execution using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;amp;&lt;/code&gt; symbol.&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;f &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$@&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    /opt/homebrew/bin/ffmpeg &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$f&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%.*&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.mp4&quot;&lt;/span&gt; &amp;amp;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;automator&quot;&gt;Automator&lt;/h2&gt;

&lt;p&gt;This has been a built-in macOS app since 2005. Setup is relatively straightforward:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Create a new &lt;em&gt;Quick Action&lt;/em&gt; workflow&lt;/li&gt;
  &lt;li&gt;Workflow receives current: &lt;em&gt;movie files&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;in: &lt;em&gt;Finder&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Add a new action of type action &lt;em&gt;Run Shell Script&lt;/em&gt; (search for it in the sidebar)&lt;/li&gt;
  &lt;li&gt;Pass input: &lt;em&gt;as arguments&lt;/em&gt; (this will give us a template command)&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Replace the echo line with your command&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Save&lt;/em&gt;, name it “Duplicate as MP4”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/take-command-automator-setup.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The menu item is now available on the context menu, inside the &lt;em&gt;Quick Actions&lt;/em&gt; submenu. After repeated use I find this submenu too annoying, but you may fare better.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/take-command-automator-finder.png&quot; alt=&quot;PNG&quot; title=&quot;Automator Quick Action in Finder Context Menu&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So, pretty easy! But, there are some caveats or limitations that may, or may not, annoy you. Perhaps we don’t want the menu item to appear for such a broad range of files (all “movie files”), or maybe we want it to appear for multiple types of files (both “audio files” and “movie files”). Sadly this is not so easy with Automator.&lt;/p&gt;

&lt;p&gt;Automator stores these files at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/Library/Services/&lt;/code&gt; and they will migrate to a new Mac.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;contextmenu&quot;&gt;ContextMenu&lt;/h2&gt;

&lt;p&gt;Many years ago I found &lt;a href=&quot;https://apps.apple.com/us/app/context-menu/id1236813619?mt=12&quot;&gt;ContextMenu&lt;/a&gt; ($4.99) which solves all of the issues I have with the Automator approach. There’s also a free version, &lt;a href=&quot;https://apps.apple.com/gb/app/context-menu-lite/id1261373706?mt=12&quot;&gt;ContextMenu Lite&lt;/a&gt;, that supports up to 3 actions to give you a taste of the good stuff.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Submenu is optional&lt;/li&gt;
  &lt;li&gt;Apply to multiple types (files or directories; can be as granular as file extension)&lt;/li&gt;
  &lt;li&gt;Show output (sometimes you want to see the results of the command)&lt;/li&gt;
  &lt;li&gt;Confirmation before running (if it’s a potentially dangerous operation)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/take-command-context-menu-setup.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The menu item displays in Finder as follows:&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/take-command-context-menu-finder.png&quot; alt=&quot;PNG&quot; title=&quot;ContextMenu Action in Finder Context Menu&quot; /&gt;&lt;/p&gt;

&lt;p&gt;ContextMenu stores these files in its own group folder, right click an action and choose &lt;em&gt;Show in Finder&lt;/em&gt;, but you can specify your own folder in a location of your choice. Both will migrate to a new Mac, but the later might give you more control.&lt;/p&gt;

&lt;p&gt;Edit: we can limit actions to running on files with specific extensions or, since update 1.4.4 &lt;a href=&quot;https://gist.github.com/RhetTbull/7221ef3cfd9d746f34b2550d4419a8c2&quot;&gt;specific UTI types&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;compressing-a-gif&quot;&gt;Compressing a GIF&lt;/h2&gt;

&lt;p&gt;We can use the &lt;a href=&quot;https://www.lcdf.org/gifsicle/&quot;&gt;gifsicle&lt;/a&gt; command line tool to optimise (compress) an Animated GIF. The a parameters I use here are explained in the &lt;a href=&quot;https://www.lcdf.org/gifsicle/man.html&quot;&gt;gifsicle man page&lt;/a&gt;, and I arrived at them with &lt;a href=&quot;/2016/06/16/post-processing-animated-gifs/&quot;&gt;years of experimentation&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/opt/homebrew/bin/gifsicle &lt;span class=&quot;nt&quot;&gt;-O1&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-Okeep-empty&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--careful&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$@&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@%.gif&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.o.gif&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can also do the same thing whilst scaling it up by a factor of 2:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/opt/homebrew/bin/gifsicle &lt;span class=&quot;nt&quot;&gt;-O1&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-Okeep-empty&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--careful&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--scale&lt;/span&gt; 2 &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$@&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@%.gif&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.o.gif&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;repository-of-contextmenu-actions&quot;&gt;Repository of ContextMenu Actions&lt;/h2&gt;

&lt;p&gt;Here’s my repo of shared actions. Inside each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.cmaction&lt;/code&gt; file is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main.sh&lt;/code&gt; file which contains the command that you can use in Automator if you’d like.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/gingerbeardman/contextmenu-actions&quot;&gt;github.com/gingerbeardman/contextmenu-actions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These include many useful commands such as:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Convert BIN+CUE to ISO&lt;/li&gt;
  &lt;li&gt;Change sample rate of audio&lt;/li&gt;
  &lt;li&gt;Convert image to 1-bit&lt;/li&gt;
  &lt;li&gt;Convert image format&lt;/li&gt;
  &lt;li&gt;Create Clean ZIP&lt;/li&gt;
  &lt;li&gt;Duplicate audio as alternative format&lt;/li&gt;
  &lt;li&gt;Duplicate image as alternative format&lt;/li&gt;
  &lt;li&gt;Duplicate movie as alternative format&lt;/li&gt;
  &lt;li&gt;File information&lt;/li&gt;
  &lt;li&gt;Generate images for web&lt;/li&gt;
  &lt;li&gt;Make script executable&lt;/li&gt;
  &lt;li&gt;Move file (includes helper app)&lt;/li&gt;
  &lt;li&gt;New file with clipboard&lt;/li&gt;
  &lt;li&gt;Open file with specific apps&lt;/li&gt;
  &lt;li&gt;Optimize GIF&lt;/li&gt;
  &lt;li&gt;Set GIF to loop infinitely&lt;/li&gt;
  &lt;li&gt;Show GIF info&lt;/li&gt;
  &lt;li&gt;Playdate Colorize IMG&lt;/li&gt;
  &lt;li&gt;Replace Existing App (warning)&lt;/li&gt;
  &lt;li&gt;Scale image to certain percentage&lt;/li&gt;
  &lt;li&gt;Set as MacJapanese encoding&lt;/li&gt;
  &lt;li&gt;Show hashes (includes helper app)&lt;/li&gt;
  &lt;li&gt;Stub out file (warning)&lt;/li&gt;
  &lt;li&gt;Touch file&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Tue, 30 Jul 2024 16:14:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2024/07/30/taking-command-of-the-context-menu-in-macos/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2024/07/30/taking-command-of-the-context-menu-in-macos/</guid>
        </item>
      
    
      
        <item>
          <title>Running modern macOS on non-retina displays</title>
          <description>&lt;p&gt;It’s 2024 and for some years now Apple have stopped supporting non-retina displays. From their perspective it makes sense given that all of their devices run retina displays, but from the user’s perspective it’s annoying given that so many of us are still using non-retina displays as either an external main display or as a secondary display. Not all of us are capable or comfortable buying multi-thousand dollar 5K displays.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;My personal situation is that I run a portrait display so that I can display a long page of code. Hey, if portrait was good enough for the &lt;a href=&quot;https://en.wikipedia.org/wiki/Xerox_Alto&quot;&gt;Xerox Alto&lt;/a&gt; and is good enough for the &lt;a href=&quot;https://en.wikipedia.org/wiki/IPhone&quot;&gt;iPhone&lt;/a&gt; then it’s good enough for me. I have shortcut keys to arrange windows into halves, thirds or quarters and I’m super productive with it. I’ve been using this setup for a handful of years now, with my current setup consisting of a 1920×1200 display rotated 90-degrees giving me a desktop of 1200×1920.&lt;/p&gt;

  &lt;p&gt;You might be thinking, “why not use a rotated 1080p display?” and the answer to that question is that a lot of software won’t display correctly or even fit on a desktop of width 1080px, but is fine at 1200px. You might also be thinking “why not buy a 4K display?” and that’s because none of them are wide enough in portrait. Finally, if you’re asking “why not buy a 5K display?” then, yes, that’s a very good point. But until I do that, there’s a problem waiting to be solved.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;problem&quot;&gt;Problem&lt;/h2&gt;

&lt;p&gt;There are a number of issues running modern macOS on non-retina displays that Apple seems to not want to fix, and in fact they are introducing new problems with every new version of macOS. Apple’s stance is that they don’t make resolution-specific adjustments, but I find that to not be quite true. Of course, abandoning non-retina elements or not paying attention to how they display on non-retina displays has the affect of being a resolution-specific adjustment. Plus, one of the most recent issues proves that there was a specific change made for non-retina displays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Text cursor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since macOS 14, Sonoma, there’s a new redesign text cursor. It changes colour and flashes in a different way than the normal cursor, but more importantly it is 50% wider (1.5x) on non-retina displays! On retina displays the cursor is equivalent to 2px wide and on non-retina displays it is equivalent to 3px side. You might think that a single pixel might not make much of a difference, but when there’s only 2px between characters it means &lt;a href=&quot;https://forums.macrumors.com/attachments/cursor-non-retina-png.2338640/&quot;&gt;the neighbouring text is obscured&lt;/a&gt;. So it’s difficult, perhaps even impossible, to tell whether a c character to the left of the cursor is a c, d, o, q, etc. In some situations, depending on your choice of font or text size the new wider cursor will completely obscure the letters i, I, l, 1 that are next to the cursor. Reported to Apple as FB13536508.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abandoned icons&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Across macOS from Finder to Safari &lt;a href=&quot;https://twitter.com/gingerbeardman/status/1539963156570820608&quot;&gt;icons are stretched and badly positioned&lt;/a&gt; on non-retina displays, which may or may not be limited to icons made from SF Symbols. As recent as Monterey, System Preferences app would &lt;a href=&quot;https://twitter.com/gingerbeardman/status/1539963168654589954&quot;&gt;transition using retina icons and then after the transition they would be replaced with non-retina icons&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;workaround&quot;&gt;Workaround&lt;/h2&gt;

&lt;p&gt;The most useful workaround to these problems is to trick macOS into thinking that your non-retina display is retina. This is done by changing the scale value of your display.&lt;/p&gt;

&lt;p&gt;An alternative way of doing this is to use &lt;a href=&quot;https://github.com/waydabber/BetterDisplay&quot;&gt;BetterDisplay&lt;/a&gt; where you can simply click the High Resolution (HiDPI) toggle for your non-retina display.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you want to do it by hand you can open up the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;com.apple.windowserver.displays...plist&lt;/code&gt; at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/Library/Preferences/ByHost/&lt;/code&gt;, in something like PlistEdit Pro, and search for “Scale” to change each instance of a value 1 into 2. Thanks to &lt;a href=&quot;https://www.getvladimir.com&quot;&gt;Vladimir Kochkovski&lt;/a&gt; for sharing this solution!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;improves cursor width issue (it’s less wide so neighbouring text is not obscured quite as much)&lt;/li&gt;
  &lt;li&gt;fixes many other user interface elements that are bad on non-retina displays&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;screenshots are @2x, which might be unexpected or undesirable&lt;/li&gt;
  &lt;li&gt;websites that do not provide retina-ready images may appear slightly blurry&lt;/li&gt;
  &lt;li&gt;(in other words: the same things as a real retina display)&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Thu, 25 Jan 2024 16:25:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2024/01/25/running-modern-macos-on-non-retina-displays/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2024/01/25/running-modern-macos-on-non-retina-displays/</guid>
        </item>
      
    
      
        <item>
          <title>Japanese language support on Classic Macintosh</title>
          <description>&lt;p&gt;Collecting &lt;a href=&quot;/2021/10/30/macintosh-magazine-media/&quot;&gt;Japanese Macintosh Magazine Media&lt;/a&gt; was not without its challenges. After buying those discs, and &lt;a href=&quot;/2022/03/31/working-with-classic-macintosh-text-encodings-in-the-age-of-unicode/&quot;&gt;figuring out a way to index the content&lt;/a&gt;, I wanted to run some of that software! So I needed a way to work with Japanese files and display them correctly in a real Classic Macintosh environment. For the reasons outlined below I decided to use only System J7.5.3 and Mac OS 9.&lt;/p&gt;

&lt;h2 id=&quot;system-6&quot;&gt;System 6&lt;/h2&gt;

&lt;p&gt;You’d install a third party solution like &lt;a href=&quot;https://macintoshgarden.org/apps/sweetjam&quot;&gt;SweetJAM&lt;/a&gt; or &lt;a href=&quot;https://macintoshgarden.org/apps/gomtalk&quot;&gt;GomTalk&lt;/a&gt;. This method only for the truly hardcore!&lt;/p&gt;

&lt;h2 id=&quot;kanjitalk&quot;&gt;KanjiTalk&lt;/h2&gt;

&lt;p&gt;You could install KanjiTalk 7 on top of US System 7. It includes all the features of System 7, plus utilities for entering and displaying Japanese.&lt;/p&gt;

&lt;h2 id=&quot;native-japanese-system-7&quot;&gt;Native Japanese System 7&lt;/h2&gt;

&lt;p&gt;Later you could get official Japanese installers for System 7. I’ve found that it’s easiest to install &lt;a href=&quot;https://macintoshgarden.org/apps/kanjitalk753&quot;&gt;System J7.5.3&lt;/a&gt; and dual boot to it using &lt;a href=&quot;https://macintoshgarden.org/apps/system-picker&quot;&gt;System Picker&lt;/a&gt;. This allows full display of Japanese text, opening of Japanese documents and you can still type in English when you need to, by using the language input method icon in the menu bar.&lt;/p&gt;

&lt;h2 id=&quot;language-kits&quot;&gt;Language Kits&lt;/h2&gt;

&lt;p&gt;For later versions of the system you can install Language Kits provided by Apple. For System 7 and 8 the Language Kits had to be bought. For OS 9 they came for free.&lt;/p&gt;

&lt;h2 id=&quot;example-mac-os-9&quot;&gt;Example: Mac OS 9&lt;/h2&gt;

&lt;p&gt;After installation the process requires some additional steps: set your system to a specific font, and register specific apps to display in Japanese (if they don’t automatically).&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Install “Language Kits”
Result:
    &lt;ul&gt;
      &lt;li&gt;You’ll gain the language input menu&lt;/li&gt;
      &lt;li&gt;You’ll be able to see Japanese in Text control panel&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Set “Control Panels -&amp;gt; Appearance -&amp;gt; Fonts -&amp;gt; Views Font” to Osaka
Result:
    &lt;ul&gt;
      &lt;li&gt;You’ll be able to see Japanese in Finder&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Use “Language Register” to set Japanese on a per-app basis
Result:
    &lt;ul&gt;
      &lt;li&gt;You’ll be able to see Japanese in the app menus and windows&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Further details at &lt;a href=&quot;http://www.kenkyuu.net/computer-01.html&quot;&gt;Japanese-ization of OS (Mac OS 9 edition)&lt;/a&gt;.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Tue, 07 Nov 2023 12:50:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2023/11/07/japanese-lanuage-support-on-classic-macintosh/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2023/11/07/japanese-lanuage-support-on-classic-macintosh/</guid>
        </item>
      
    
      
        <item>
          <title>Resurrecting an ASMedia USB hard drive enclosure</title>
          <description>&lt;p&gt;A while ago I bought a 2.5” Crucial SSD and a &lt;em&gt;UGREEN USB 3.1 Gen 2 Hard Drive Enclosure&lt;/em&gt; (SKU: &lt;a href=&quot;https://www.ugreen.com/collections/hard-drive-enclosure/products/usb-3-1-gen-2-hard-drive-enclosure&quot;&gt;70499&lt;/a&gt;) on which to keep some working files whilst connected to a Mac mini. I used that on macOS 10.13 High Sierra, 10.14 Mojave, and 11 Big Sur (I skipped 10.15 Catalina). Over the years the setup served me well.&lt;/p&gt;

&lt;p&gt;After I upgraded to an M1 MacBook Pro I didn’t need to use that sort of setup, so I just kept the external drive in my travel bag to be used as a backup drive.&lt;/p&gt;

&lt;h2 id=&quot;the-problem&quot;&gt;The problem&lt;/h2&gt;

&lt;p&gt;The first time I plugged it in on macOS 12 Monterey it didn’t show up, but I didn’t have time to troubleshoot so I put it away again. Today I had some free time so I plugged it in and, unsurprisingly, it did not mount. Time to do some research!&lt;/p&gt;

&lt;p&gt;First, I tried it in my Windows VM. No joy. Then I tried it on a real Windows PC: it mounted briefly and then disappeared. Interesting! Thankfully Windows gave me a little more information to go on than macOS, it showed the chipset model number: ASMT2235&lt;/p&gt;

&lt;h2 id=&quot;the-diagnosis&quot;&gt;The diagnosis&lt;/h2&gt;

&lt;p&gt;A quick web search found some &lt;a href=&quot;https://www.station-drivers.com/index.php/en/outils/Drivers/Asmedia/ASM-105x-115x-215x-(ASMT-xxxx)-Sata-USB-3.x-controllers/ASM2235-Sata-USB-3.1-controllers/ASMedia-ASM2235-SATA-USB-3.1-Firmware-Version-161102_D1_05_01/lang,en-gb/&quot;&gt;references to a firmware update&lt;/a&gt; that “resolves intermittent mounting issues in Windows” which sounded like just the ticket!&lt;/p&gt;

&lt;h2 id=&quot;the-plan&quot;&gt;The plan&lt;/h2&gt;

&lt;p&gt;I found a great &lt;a href=&quot;https://www.youtube.com/watch?v=DOxrXnEwqJY&quot;&gt;YouTube video that showed the process&lt;/a&gt; and explained what you should and should not do. The video was created in late 2022 and advised installing the firmware that started with the same number as the one on your drive, but my drive already had that installed (version 171120_D1_1E_80). Then, whilst I was looking at all the other available firmware, I noticed that the first part of the filename looked more like a date to me, one that roughly matched when the firmware was released.&lt;/p&gt;

&lt;h2 id=&quot;the-solution&quot;&gt;The solution&lt;/h2&gt;

&lt;p&gt;So I decided to try flashing the firmware with the most recent date (version &lt;a href=&quot;https://www.usbdev.ru/files/asmedia/asmt2235firmware/&quot;&gt;220906_D1_45_01&lt;/a&gt;). The flashing tool, MPTools, needs to have its interface unlocked using the password “asmedia” and then you should select the line in the window that corresponds to your drive. It shouldn’t let you flash the wrong drive, but please be careful!&lt;/p&gt;

&lt;p&gt;After displaying a green progress bar, the tool declared the process was a “PASS”, and everything looked great. I unmounted the disk from Windows and it appeared in macOS — it had worked!&lt;/p&gt;

&lt;h2 id=&quot;lights-out&quot;&gt;Lights out?&lt;/h2&gt;

&lt;p&gt;The only change after all of this is that the drive enclosure no longer shows a LED when powered on, which is a minor inconvenience in the grand scheme of things.&lt;/p&gt;

&lt;p&gt;The LED can be enabled by flashing a slightly less than newest firmware (version &lt;a href=&quot;https://www.usbdev.ru/files/asmedia/asmt2235firmware/&quot;&gt;200416_D1_43_00&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;At this point, given that it’s proven these firmware updates do contain fixes, the choice is yours whether to have the light or not.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 22 Apr 2023 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2023/04/22/resurrecting-an-asmedia-usb-hard-drive-enclosure/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2023/04/22/resurrecting-an-asmedia-usb-hard-drive-enclosure/</guid>
        </item>
      
    
      
        <item>
          <title>One-click restore most recent backup of a file from Time Machine</title>
          <description>&lt;p&gt;Often I want to restore the latest version of a file from Time Machine, but using the Time Machine interface to do so is awkward and slow. So I came up with my own solution that can be triggered from the Finder context menu of any file.&lt;/p&gt;

&lt;figure&gt;&lt;img src=&quot;/images/posts/restore-time-machine-context-menu.png&quot; width=&quot;245px&quot; height=&quot;521px&quot; /&gt;&lt;/figure&gt;

&lt;h2 id=&quot;usage&quot;&gt;Usage&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;right-click on a file&lt;/li&gt;
  &lt;li&gt;select “Restore from Time Machine”&lt;/li&gt;
  &lt;li&gt;file is trashed (recoverable using Trash’s Put Back feature)&lt;/li&gt;
  &lt;li&gt;most recent backup of that file is restored from Time Machine&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This takes a seconds or two, depending on the size of the file in question. Most importantly this saves interrupting my workflow by having to opening the Time Machine interface and zooming through all those windows looking for the file.&lt;/p&gt;

&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://apps.apple.com/gb/app/context-menu/id1236813619?mt=12&quot;&gt;ContextMenu&lt;/a&gt; (paid)
    &lt;ul&gt;
      &lt;li&gt;or &lt;a href=&quot;https://github.com/Mortennn/FiScript&quot;&gt;FiScript&lt;/a&gt; (free)&lt;/li&gt;
      &lt;li&gt;or &lt;a href=&quot;https://apps.apple.com/gb/app/service-station/id1503136033?mt=12&quot;&gt;Service Station&lt;/a&gt; (limited trial, paid)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These apps let you add items to Finder’s right-click context menu, from where you can run your own scripts that do something with the full path of the file/s selected.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/morgant/tools-osx/blob/master/src/trash&quot;&gt;trash&lt;/a&gt;, a shell script to delete files with support for Put Back&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;tmutil, built-in macOS utility for interacting with Time Machine&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;contextmenuapp&quot;&gt;ContextMenu.app&lt;/h2&gt;

&lt;p&gt;Create a “New Action with Shell Script…” as follows:&lt;/p&gt;

&lt;figure&gt;&lt;img src=&quot;/images/posts/restore-time-machine-context-menu-setup.png&quot; width=&quot;578px&quot; height=&quot;485px&quot; /&gt;&lt;/figure&gt;

&lt;h2 id=&quot;scripts&quot;&gt;Scripts&lt;/h2&gt;

&lt;p&gt;There are a couple of scripts because backups are stored differently on USB and Network. Of course, you’ll also need to change the path names to suit your setup.&lt;/p&gt;

&lt;noscript&gt;&lt;p&gt;&lt;a href=&quot;https://gist.github.com/gingerbeardman/ea0a213eb5e361ba9e7e8d004300c91b&quot;&gt;View the source code as a Gist&lt;/a&gt;&lt;/p&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/gingerbeardman/ea0a213eb5e361ba9e7e8d004300c91b.js&quot;&gt;&lt;/script&gt;

&lt;h2 id=&quot;other-uses&quot;&gt;Other uses&lt;/h2&gt;

&lt;p&gt;You could also install the script to enable it to be used from the command line.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Thu, 05 May 2022 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2022/05/05/one-click-restore-of-the-most-recent-time-machine-backup-of-a-file/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2022/05/05/one-click-restore-of-the-most-recent-time-machine-backup-of-a-file/</guid>
        </item>
      
    
      
        <item>
          <title>File hash calculator app for macOS</title>
          <description>&lt;p&gt;I often need to calculate the hash of a file for verification purposes, to confirm that a download has completed successfully or that an ISO I have dumped from a CD is a correct match with known good dumps.&lt;/p&gt;

&lt;p&gt;I couldn’t find a nice easy to use app for this so I put together my own app. Download it here: &lt;a href=&quot;https://github.com/sunjw/fhash/files/2302036/Hash.app.zip&quot;&gt;Hash.app.zip&lt;/a&gt; (version 1.3).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/hash-app.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Auto clear text field on each operation&lt;/li&gt;
  &lt;li&gt;Finder “Open with…”&lt;/li&gt;
  &lt;li&gt;Select file on first launch&lt;/li&gt;
  &lt;li&gt;Drag and drop after window is open&lt;/li&gt;
  &lt;li&gt;Single or multiple files&lt;/li&gt;
  &lt;li&gt;Accepts many binary file types&lt;/li&gt;
  &lt;li&gt;Resizable window&lt;/li&gt;
  &lt;li&gt;Hold alt/option to only calculate quickest hashes (CRC32, XHH, MD5)&lt;/li&gt;
  &lt;li&gt;Default is to calculate all hash types, including slower hashes (SHA1, SHA256)&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sun, 06 May 2018 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2018/05/06/file-hash-calculator-app-for-macos/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2018/05/06/file-hash-calculator-app-for-macos/</guid>
        </item>
      
    
      
        <item>
          <title>Look Up</title>
          <description>&lt;p&gt;One of my favourite little touches in macOS: &lt;a href=&quot;https://support.apple.com/kb/PH25145&quot;&gt;Look Up&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://miro.medium.com/max/1400/1*o0qDHgYheXx7f5-hIf7Fvw.png&quot; alt=&quot;PNG&quot; title=&quot;Example of the Context Menu in Safari showing “Look Up”&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And don’t forget that you can add look up support for Emoji symbols using my &lt;a href=&quot;http://emojipedia.org/app/&quot;&gt;Emojipedia Dictionary&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;detecting-data&quot;&gt;Detecting Data&lt;/h2&gt;

&lt;p&gt;On iOS (since version 10) and macOS (since 10.5 Leopard) there’s a feature called &lt;a href=&quot;https://support.apple.com/kb/PH25702&quot;&gt;Data Detectors&lt;/a&gt; that helps recognise various forms of data in text, such as phone numbers, street addresses, contacts, and so on.&lt;/p&gt;

&lt;p&gt;A simple version of this is the use of capitalised words as markers to detect phrases during &lt;em&gt;Look Up&lt;/em&gt;. It’s not foolproof, as we can see in my video, but it works well more often than not.&lt;/p&gt;

&lt;lite-youtube style=&quot;aspect-ratio: 9/10;&quot; videoid=&quot;4yTATXHic_c&quot; params=&quot;start=0&amp;amp;modestbranding=2&quot;&gt;
&lt;/lite-youtube&gt;

</description>
          <author>by Matt Sephton</author>
          <pubDate>Thu, 08 Dec 2016 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2016/12/08/look-up/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2016/12/08/look-up/</guid>
        </item>
      
    
      
        <item>
          <title>Emoji Dictionary 🤓 📖</title>
          <description>&lt;p&gt;One of my favourite features of Mac OS X is the ability to point the mouse cursor at a word and press &lt;em&gt;Command+Control+D&lt;/em&gt; to quickly see a popup definition courtesy of Dictionary.app:&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://miro.medium.com/max/804/1*z1FhHq7vt1X2oNOsnsH9xg.png&quot; alt=&quot;&quot; title=&quot;(you can also get this popup through a Force Click, or three-finger click/tap)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It annoys me when I use this feature on an Emoji and it doesn’t work. 😠&lt;/p&gt;

&lt;h2 id=&quot;diy&quot;&gt;D.I.Y.&lt;/h2&gt;

&lt;p&gt;During my job as a Technology Evangelist at Apple, I took great pride in learning as much as possible about the frameworks and tools that are provided to developers. One such toolkit allowed the creation of custom dictionaries for Mac OS X.&lt;/p&gt;

&lt;p&gt;So I thought it would be fun to use the Dictionary Development Kit to create a simple dictionary of Emoji and their meanings. It was! You can grab the finished dictionary here: &lt;a href=&quot;https://github.com/gingerbeardman/Emojipedia&quot;&gt;github.com/gingerbeardman/Emojipedia&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://miro.medium.com/max/1282/1*1zrc24g1nE6yyEVfjUHW5g.png&quot; alt=&quot;&quot; title=&quot; &quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;how-it-works&quot;&gt;How it works&lt;/h1&gt;

&lt;p&gt;I grabbed a comprehensive list of &lt;a href=&quot;http://unicode.org/emoji/charts/emoji-list.html&quot;&gt;Emoji Data&lt;/a&gt; from the Unicode website, and then set about converting it. The process was as follows:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Convert Emoji Data table to plain text (select all &amp;amp; copy in Chrome).&lt;/li&gt;
  &lt;li&gt;Write some simple PHP to parse the text file and write out the XML.&lt;/li&gt;
  &lt;li&gt;Setup build process.&lt;/li&gt;
  &lt;li&gt;Test and repeat many times.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For each Emoji I store the name and emoji itself, along with a list of keywords and aliases. That way you can search by word or theme and more easily find the emoji you’re looking for. I also list the keywords in the definition, which Dictionary.app automatically converts into hyperlinks allowing you to browse the Emojipedia dictionary just like a website.&lt;/p&gt;

&lt;h2 id=&quot;emojipedia&quot;&gt;Emojipedia&lt;/h2&gt;

&lt;p&gt;There’s only one place to go to find out information on any Emoji and that’s &lt;a href=&quot;http://emojipedia.org&quot;&gt;Emojipedia&lt;/a&gt;, a fantastic resource created by Jeremy Burge. I put a link to Emojipedia in every definition, so you can easily click through to find out more and continue learning about Emoji. I plan to work even closer with Emojipedia to include even more information in the dictionary file.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://miro.medium.com/max/840/1*Pn7tHXghkM3yK1YPGJTBkQ.png&quot; alt=&quot;&quot; title=&quot; &quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;for-hire&quot;&gt;For Hire&lt;/h2&gt;

&lt;p&gt;I offer a consultancy service that helps companies make better use of technology; from low level tools through to user interface and experience. &lt;a href=&quot;http://www.gingerbeardman.com&quot;&gt;Get in touch with me&lt;/a&gt; if you’d like to work together.&lt;/p&gt;

&lt;p&gt;It only remains for me to wish you a Happy &lt;a href=&quot;https://twitter.com/search?q=%23WorldEmojiDay&quot;&gt;#WorldEmojiDay&lt;/a&gt;! 🌍&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sun, 17 Jul 2016 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2016/07/17/emoji-dictionary/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2016/07/17/emoji-dictionary/</guid>
        </item>
      
    
      
        <item>
          <title>Today screensaver</title>
          <description>&lt;p&gt;&lt;em&gt;Today&lt;/em&gt; is a Mac OS X screensaver inspired by &lt;a href=&quot;https://en.wikipedia.org/wiki/On_Kawara#Today_series&quot;&gt;On Kawara’s &lt;em&gt;Today Series&lt;/em&gt;&lt;/a&gt;—nearly 3,000 date paintings made over five decades, each a monochrome background with the current date inscribed on it in the language and calendrical conventions of wherever Kawara happened to be that day.&lt;/p&gt;

&lt;p&gt;The screensaver displays today’s date in the same spirit. It can show the date, time, or day of the week, on a background colour of your choosing—or a random one.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://www.gingerbeardman.com/today/today.png&quot; alt=&quot;Today screensaver&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;download&quot;&gt;Download&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.gingerbeardman.com/today/&quot;&gt;gingerbeardman.com/today/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Thu, 09 Apr 2009 12:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2009/04/09/today-screensaver/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2009/04/09/today-screensaver/</guid>
        </item>
      
    

  </channel>
</rss>
