<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Get Info: #optimisation</title>
    <description>Posts tagged “optimisation” — 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/optimisation/</link>
    <atom:link href="https://blog.gingerbeardman.com/tag/optimisation/index.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 06 Jul 2026 14:37:40 +0000</pubDate>
    <lastBuildDate>Mon, 06 Jul 2026 14:37:40 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>

    
      
        <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>iOS Low Data Mode reveals true app update sizes</title>
          <description>&lt;p&gt;An interesting side-effect of iOS Low Data Mode is that it shows you the exact size of an app update for your device, often a tiny fraction of the listed app size. This is because (delta) updates contain only the files that have changed. Even a first-time install is smaller due to app slicing/thinning containing only what is needed for that device.&lt;/p&gt;

&lt;p&gt;The larger size is the universal app size containing assets for all devices. It’s simpler and less confusing for everybody to see the same size.&lt;/p&gt;

&lt;p&gt;There are more screenshots at the comment links.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/low-data-mode.png&quot; alt=&quot;IMG&quot; title=&quot;eBay 6.220.0 update size for an iPhone XS running iOS 17&quot; /&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Wed, 06 Aug 2025 19:43:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2025/08/06/ios-low-data-mode-reveals-true-app-update-sizes/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2025/08/06/ios-low-data-mode-reveals-true-app-update-sizes/</guid>
        </item>
      
    
      
        <item>
          <title>YOYOZO (or, how I made a Playdate game in 39KB)</title>
          <description>&lt;blockquote&gt;
  &lt;p&gt;2023-12-27—&lt;a href=&quot;https://arstechnica.com/gaming/2023/12/ars-technicas-best-video-games-of-2023/7&quot;&gt;Ars Technica: YOYOZO wins GOTY accolade!&lt;/a&gt; almost unbelievable to be listed alongside such games as: Chants of Sennaar, Cocoon, Dave the Diver, Humanity, The Legend of Zelda: Tears of the Kingdom, Pikmin 4, Puzzmo, Super Mario Bros. Wonder, Venba and Viewfinder.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A game I made for the Playdate handheld was released today! &lt;a href=&quot;https://play.date/games/yoyozo/&quot;&gt;Go buy it&lt;/a&gt; and then come back to read this blog post.&lt;/p&gt;

&lt;p&gt;It’s called YOYOZO and in it you control a space yo-yo and have to collect stars in a sort of cosmic ballet. Well, at first it might feel a little like being on a fairground ride, but eventually you’ll become good enough for it to feel like ballet. The concept is based on my memory of a game called &lt;a href=&quot;https://archive.org/details/Pendulumania-v1.3&quot;&gt;Pendulumania&lt;/a&gt; that I played 20 years ago.&lt;/p&gt;

&lt;p&gt;The most amazing thing about this game, for me, is that launch version weighs in at a file size of &lt;em&gt;only 39KiB&lt;/em&gt;. I’m using the KiB unit of measurement which equates to 1024 bytes. I still find it hard to believe as the game contains so much! In this blog post I’ll go into some of the nerdy details.&lt;/p&gt;

&lt;h2 id=&quot;playdate&quot;&gt;Playdate?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://play.date&quot;&gt;Playdate&lt;/a&gt; is a handheld gaming system with a unique crank input method. I don’t use the crank in this game, but I have done in the past and will do again in the future.&lt;/p&gt;

&lt;p&gt;If you own a Playdate you can buy the game now at &lt;a href=&quot;https://play.date/games/yoyozo/&quot;&gt;play.date/games/yoyozo/&lt;/a&gt;. If you don’t own a Playdate, well, &lt;a href=&quot;https://play.date&quot;&gt;what are you waiting for&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/yoyozo-teaser.gif#playdate&quot; alt=&quot;YOYOZO&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;butwhy&quot;&gt;But…&lt;em&gt;why?&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;The drive to produce a small game started after I sent the first playable version to testers. Steve at &lt;a href=&quot;http://scenicroutesoftware.com&quot;&gt;&lt;em&gt;Scenic Route Software&lt;/em&gt;&lt;/a&gt;, purveyor of quality video games, commented how tiny the game was. At that point it was 18KiB, but had no music or sound effects or polish. There was a long way to go.&lt;/p&gt;

&lt;p&gt;Even so, I wondered how doable it would be to build the game out with an eye on keeping file size “low”. I thought back to the days of my youth where whole games would fit on a single floppy disk, with room to spare. If they could do it, shouldn’t I give it a try?&lt;/p&gt;

&lt;p&gt;It’s worth noting that even with this mindset, I didn’t make a huge sustained effort to meet the goal. On the contrary, it was just something I simply kept in mind as development proceeded. For that reason, I’m sure there are more ways the game could be made even smaller than it is, with the exact same code and content. For example, I never tried finding the most optimal format for things like music and particle data which are the two largest sets of embedded data.&lt;/p&gt;

&lt;p&gt;Finally, this is not a challenge, or me throwing down the gauntlet in any way. It’s easy enough to make a smaller game, be it similar or entirely different, you’d just have to make different choices along the way. This was just me doing something nerdy as an additional constraint on top of the already enjoyable constraints of developing for Playdate.&lt;/p&gt;

&lt;p&gt;That said, I think every game developer should regularly make a point of writing code for an underpowered device as part of their own personal development—there are so many lessons to learn.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;reasons&quot;&gt;Reasons&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The main reason for the small file size is the fact that &lt;em&gt;the game does not use any digital sound files, and very few bitmap images&lt;/em&gt; (the launch card and animation have to be bitmaps, and in-game only the logo and fonts are bitmaps). Game graphics are all drawn using only shapes (lines, rects, circles) and fills (black, white, and dither patterns).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A second reason is that whilst I use the base Playdate Lua SDK, &lt;em&gt;I don’t use any of the additional “CoreLibs”&lt;/em&gt;. The only extra graphics functions I needed were for drawing outlined or filled circles, so I use two of my own wrapper functions that are similar to those from CoreLibs/graphics but mine are smaller and more specific. For timers, I use a simple frame/tick system, an approach which has pros and cons, but it’s good enough for me.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A third reason is that I made the tough decision to reduce system assets, which means &lt;em&gt;there is no animated launcher card&lt;/em&gt;. This was a tough one, but it added so much to the file size I decided against it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Finally, I noticed that &lt;em&gt;including data inside your game code&lt;/em&gt; often trumps how well you can compress it and store it externally. For example I tried compressing the music data and storing it in an external file, but the game final file size was larger than if I embedded the data in my Lua code. Plus, it’s faster as it doesn’t need to load an additional external file.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;breakdown&quot;&gt;Breakdown&lt;/h2&gt;

&lt;p&gt;I thought it would be cool to outline the main features and how each contributes to the total file size. Note that the sizes are expressed as quantities of the compiled binary, rather than uncompiled source code. It’s also worth noting that a blank project with an empty update function results in a compiled binary of only 147 bytes. Playdate compiles to Lua bytecode.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/yoyozo-chart.png&quot; alt=&quot;CHART&quot; /&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Content&lt;/th&gt;
      &lt;th&gt;Kilobytes&lt;/th&gt;
      &lt;th&gt;%&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Main code&lt;/td&gt;
      &lt;td&gt;19&lt;/td&gt;
      &lt;td&gt;49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Two music tracks&lt;/td&gt;
      &lt;td&gt;5.5&lt;/td&gt;
      &lt;td&gt;14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Three bitmap fonts&lt;/td&gt;
      &lt;td&gt;2.5&lt;/td&gt;
      &lt;td&gt;6&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Synthesized sound effects&lt;/td&gt;
      &lt;td&gt;2.5&lt;/td&gt;
      &lt;td&gt;6&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Custom particle system&lt;/td&gt;
      &lt;td&gt;2.0&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Animated system icon&lt;/td&gt;
      &lt;td&gt;2.0&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Animated system card&lt;/td&gt;
      &lt;td&gt;2.0&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Pulp music engine (modified)&lt;/td&gt;
      &lt;td&gt;1.5&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Online scoring system&lt;/td&gt;
      &lt;td&gt;0.5&lt;/td&gt;
      &lt;td&gt;1.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;How to play instructions&lt;/td&gt;
      &lt;td&gt;0.4&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Custom soundtrack capability&lt;/td&gt;
      &lt;td&gt;0.1&lt;/td&gt;
      &lt;td&gt;0.25&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;“Main code” contains: physics simulation, game structure and state management, multi-layered scoring and bonus system, score/stat tracking, loading and saving stats and settings, path recording and playback, animated introduction, plus the following &lt;em&gt;dynamic&lt;/em&gt; systems: scrolling starfield, screen shake, music system, sound effects system. All running at 40fps.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;abandoned-and-removed-features&quot;&gt;Abandoned and removed features&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;I tried a bunch of stuff during development. Such as asteroid fields or meteor showers that introduced obstacles that needed to be avoided, and black holes that would magnetically attract the ball. But I felt they detracted from the pureness of the concept, so I didn’t go any further with them.&lt;/li&gt;
  &lt;li&gt;The positions of stars are randomly generated, but I have implemented a fixed “daily” layout in the game, which is really fun. It’s a different experience to be able to play the same layout over and over, improving your execution of the same moves and eking out higher and higher scores. I did plan to reintroduce that option when Playdate Catalog got score boards that reset daily, but by the time that happened &lt;a href=&quot;/2025/04/15/when-playdate-stopped-being-fun/&quot;&gt;I was no longer developing Playdate&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;manualguide&quot;&gt;Manual/Guide&lt;/h2&gt;

&lt;p&gt;I really loved the manuals that came with games in the 8-bit and 16-bit era. So I thought it would be fun to write a manual/player’s guide in the old-school style. I love reading those sorts of manuals, where the developer gives you a little glimpse behind the curtain so you get an understanding of how the game works, with some small hints and tips littered throughout—for the most inquisitive players! If that sounds like your thing, &lt;a href=&quot;https://play.date/games/yoyozo/#gameListingMoreInfo&quot;&gt;download the manual from the game page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://play.date/games/yoyozo/#gameListingMoreInfo&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/yoyozo-manual.png&quot; alt=&quot;YOYOZO Manual&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;timeline&quot;&gt;Timeline&lt;/h2&gt;

&lt;p&gt;I worked on YOYOZO from September 5th to 27th, submitting it to Catalog on 21st and polishing it for the final week after that. After the game was approved I added online score boards one evening just prior to launch. It was in review and waiting for release longer than it was in development!&lt;/p&gt;

&lt;p&gt;The purpose of this section is not to say that developing a game quickly is better than developing one slowly, or vice versa, but rather to show the importance of scoping a game well and then sticking to the plan.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2023-09-05—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1699108587732119834&quot;&gt;initial prototype&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-09-07—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1699784106505290093&quot;&gt;playable prototype&lt;/a&gt; (3 days)&lt;/li&gt;
  &lt;li&gt;2023-09-07—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1699890693366517890&quot;&gt;quick progress&lt;/a&gt; (3 days)&lt;/li&gt;
  &lt;li&gt;2023-09-09—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1700612152707461396&quot;&gt;came up with the name&lt;/a&gt; (5 days)&lt;/li&gt;
  &lt;li&gt;2023-09-14—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1702103698749505670&quot;&gt;polishing and balancing&lt;/a&gt; (10 days)&lt;/li&gt;
  &lt;li&gt;2023-09-20—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1704608465522487681&quot;&gt;revelatory physics tweak&lt;/a&gt; (16 days)&lt;/li&gt;
  &lt;li&gt;2023-09-21—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1704991183573831711&quot;&gt;addicted to my own game&lt;/a&gt; (17 days)&lt;/li&gt;
  &lt;li&gt;2023-09-21—submitted to Catalog (17 days)&lt;/li&gt;
  &lt;li&gt;2023-09-23—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1705676134245875750&quot;&gt;game over replay&lt;/a&gt; (19 days)&lt;/li&gt;
  &lt;li&gt;2023-09-26—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1706765228879253972&quot;&gt;layout design using spreadsheet&lt;/a&gt; (22 days)&lt;/li&gt;
  &lt;li&gt;2023-09-26—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1706772586510643560&quot;&gt;game over stats screen&lt;/a&gt; (22 days)&lt;/li&gt;
  &lt;li&gt;2023-09-27—final version (23 days)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and then some waiting until:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2023-10-10—approved for Catalog (36 days)&lt;/li&gt;
  &lt;li&gt;2023-11-19—added online scoreboards (76 days)&lt;/li&gt;
  &lt;li&gt;2023-11-21—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1727030817116053611&quot;&gt;released on Catalog&lt;/a&gt; (78 days)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…so that is 78 days (11 weeks) from initial prototype to being live on the Catalog store!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;credits&quot;&gt;Credits&lt;/h2&gt;

&lt;p&gt;YOYOZO is a game by Matt Sephton, with music by Jamie Hamshere.&lt;/p&gt;

&lt;p&gt;Thanks to CANO-Lab and Testers.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;further-reading&quot;&gt;Further reading&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/2023/11/26/easter-egg-emoji-converting-pixels-into-particles/&quot;&gt;Easter egg emoji: converting pixels into particles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/2023/12/09/dynamic-music-and-sound-techniques-for-video-games/&quot;&gt;Dynamic music and sound techniques for video games&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://play.date/games/yoyozo/#gameListingMoreInfo&quot;&gt;&lt;em&gt;YOYOZO&lt;/em&gt; manual/player’s guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
  &lt;li&gt;2024-10-16—&lt;a href=&quot;https://gamerepublic.net/news/best-indie-game-made-in-the-north-of-england-2024-award/&quot;&gt;Game Republic 2024 Awards: Best Indie Game Made in the North of England&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2024-03-08—&lt;a href=&quot;https://play.date/games/community-awards-2023/&quot;&gt;Playdate Community Awards 2023: Best Arcade Game&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-12-27—&lt;a href=&quot;https://arstechnica.com/gaming/2023/12/ars-technicas-best-video-games-of-2023/7&quot;&gt;Ars Technica: YOYOZO wins GOTY accolade!&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-11-30—&lt;a href=&quot;https://arstechnica.com/gaming/2023/11/my-long-quest-to-revive-a-90s-windows-gaming-cult-classic/&quot;&gt;Ars Technica&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-11-24—&lt;a href=&quot;http://eepurl.com/iEHB8M&quot;&gt;Hacker Newsletter&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-11-23—&lt;a href=&quot;https://www.timeextension.com/news/2023/11/yoyozo-is-a-new-playdate-game-inspired-by-the-japanese-cult-classic-pendulumania&quot;&gt;Time Extension&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-11-22—&lt;a href=&quot;https://news.ycombinator.com/item?id=38372936&quot;&gt;Hacker News&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-11-22—&lt;a href=&quot;https://tildes.net/~games/1cbz/yoyozo_or_how_i_made_a_playdate_game_in_39kb&quot;&gt;Tildes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Tue, 21 Nov 2023 23:59:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2023/11/21/yoyozo-how-i-made-a-playdate-game-in-39kb/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2023/11/21/yoyozo-how-i-made-a-playdate-game-in-39kb/</guid>
        </item>
      
    
      
        <item>
          <title>PNGenie image optimiser</title>
          <description>&lt;p&gt;PNGenie is lossless PNG optimiser for Mac OS X.&lt;/p&gt;

&lt;p&gt;A PNG file contains image related data. This data can be stored in a multitude of different ways and the file size will vary for each storage method—even with the same raw image data. Image files often have an attached resource fork that also artificially increases the size of the file.&lt;/p&gt;

&lt;p&gt;PNGenie optimises any given PNG file—trying out different methods of compression—with a goal of achieving the smallest file size. Smaller files are good for a number of number practical reasons as well as, obviously, saving disk space. Let’s say you want to reduce the size of data files belonging to an iPhone application, or you want to speed up loading of a website that uses PNG images, for example. Resource forks, gamma values and software-specific tags are automatically stripped, too.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://www.gingerbeardman.com/pngenie/processing.png&quot; alt=&quot;Remote&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.gingerbeardman.com/pngenie/&quot;&gt;www.gingerbeardman.com/pngenie/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Fri, 03 Jul 2009 12:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2009/07/03/pngenie-image-optimiser/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2009/07/03/pngenie-image-optimiser/</guid>
        </item>
      
    

  </channel>
</rss>
