site

personal website, served at mordaunt.dev/site
Log | Files | Refs

index.html (10678B)


      1 <!DOCTYPE html>
      2 <html lang="en">
      3 
      4 <head>
      5   <title>
      6   Icnsify · Jack Mordaunt
      7 </title>
      8   <meta charset="utf-8">
      9 <meta name="viewport" content="width=device-width, initial-scale=1.0">
     10 <meta name="color-scheme" content="light dark">
     11 
     12 
     13 
     14 
     15 <meta name="author" content="Jack Mordaunt">
     16 <meta name="description" content="Build and preview .icns icons cross platform.">
     17 <meta name="keywords" content="blog,developer,personal,software,robust,performance,sovereign">
     18 
     19 
     20 
     21   <meta name="twitter:card" content="summary">
     22   <meta name="twitter:title" content="Icnsify">
     23   <meta name="twitter:description" content="Build and preview .icns icons cross platform.">
     24 
     25 <meta property="og:url" content="http://jackmordaunt.com/projects/icnsify/">
     26   <meta property="og:site_name" content="Jack Mordaunt">
     27   <meta property="og:title" content="Icnsify">
     28   <meta property="og:description" content="Build and preview .icns icons cross platform.">
     29   <meta property="og:locale" content="en">
     30   <meta property="og:type" content="article">
     31     <meta property="article:section" content="projects">
     32     <meta property="article:published_time" content="2018-02-21T12:14:44-03:00">
     33     <meta property="article:modified_time" content="2018-02-21T12:14:44-03:00">
     34     <meta property="article:tag" content="Go">
     35     <meta property="article:tag" content="Gio">
     36     <meta property="article:tag" content="Portfolio">
     37 
     38 
     39 
     40 
     41 <link rel="canonical" href="http://jackmordaunt.com/projects/icnsify/">
     42 
     43 
     44 <link rel="preload" href="/fonts/fa-brands-400.woff2" as="font" type="font/woff2" crossorigin>
     45 <link rel="preload" href="/fonts/fa-regular-400.woff2" as="font" type="font/woff2" crossorigin>
     46 <link rel="preload" href="/fonts/fa-solid-900.woff2" as="font" type="font/woff2" crossorigin>
     47 
     48 
     49   
     50   
     51   <link rel="stylesheet" href="/css/coder.min.6445a802b9389c9660e1b07b724dcf5718b1065ed2d71b4eeaf981cc7cc5fc46.css" integrity="sha256-ZEWoArk4nJZg4bB7ck3PVxixBl7S1xtO6vmBzHzF/EY=" crossorigin="anonymous" media="screen" />
     52 
     53 
     54 
     55 
     56 
     57 
     58   
     59     
     60     
     61     <link rel="stylesheet" href="/css/coder-dark.min.a00e6364bacbc8266ad1cc81230774a1397198f8cfb7bcba29b7d6fcb54ce57f.css" integrity="sha256-oA5jZLrLyCZq0cyBIwd0oTlxmPjPt7y6KbfW/LVM5X8=" crossorigin="anonymous" media="screen" />
     62   
     63 
     64 
     65 
     66  
     67   
     68     
     69     <link rel="stylesheet" href="/css/custom.min.931a9d02d6f7655cd0cd50317fac1204e00c54ffd0232085acc957b2db5e1283.css" integrity="sha256-kxqdAtb3ZVzQzVAxf6wSBOAMVP/QIyCFrMlXstteEoM=" crossorigin="anonymous" media="screen" />
     70   
     71 
     72 
     73 
     74 
     75 
     76 <link rel="icon" type="image/svg+xml" href="/images/self-tiny-white.svg" sizes="any">
     77 <link rel="icon" type="image/png" href="/images/self-tiny-white.png" sizes="32x32">
     78 <link rel="icon" type="image/png" href="/images/self-tiny-white.png" sizes="16x16">
     79 
     80 <link rel="apple-touch-icon" href="/images/apple-touch-icon.png">
     81 <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png">
     82 
     83 <link rel="manifest" href="/site.webmanifest">
     84 <link rel="mask-icon" href="/images/safari-pinned-tab.svg" color="#5bbad5">
     85 
     86 
     87 
     88 
     89 
     90 
     91 
     92 <script defer data-domain="jackmordaunt.com" src="https://plausible.io/js/script.js"></script>
     93 
     94 
     95 
     96 
     97 </head>
     98 
     99 
    100 
    101 
    102 
    103 
    104 <body class="preload-transitions colorscheme-auto">
    105   
    106 <div class="float-container">
    107     <a id="dark-mode-toggle" class="colorscheme-toggle">
    108         <i class="fa-solid fa-adjust fa-fw" aria-hidden="true"></i>
    109     </a>
    110 </div>
    111 
    112 
    113   <main class="wrapper">
    114     <nav class="navigation">
    115   <section class="container">
    116     
    117     <a class="navigation-title" href="http://jackmordaunt.com/">
    118       Jack Mordaunt
    119     </a>
    120     
    121     
    122       <input type="checkbox" id="menu-toggle" />
    123       <label class="menu-button float-right" for="menu-toggle">
    124         <i class="fa-solid fa-bars fa-fw" aria-hidden="true"></i>
    125       </label>
    126       <ul class="navigation-list">
    127         
    128           
    129             <li class="navigation-item">
    130               <a class="navigation-link " href="/posts/">Blog</a>
    131             </li>
    132           
    133             <li class="navigation-item">
    134               <a class="navigation-link " href="/about/">About</a>
    135             </li>
    136           
    137             <li class="navigation-item">
    138               <a class="navigation-link " href="/projects/">Projects</a>
    139             </li>
    140           
    141             <li class="navigation-item">
    142               <a class="navigation-link " href="/contact/">Contact</a>
    143             </li>
    144           
    145             <li class="navigation-item">
    146               <a class="navigation-link " href="/pay-with-bitcoin/">Pay</a>
    147             </li>
    148           
    149         
    150         
    151       </ul>
    152     
    153   </section>
    154 </nav>
    155 
    156 
    157     <div class="content">
    158       
    159   <section class="container page">
    160   <article>
    161     <header>
    162     
    163       <h1 class="title">
    164         <a class="title-link" href="http://jackmordaunt.com/projects/icnsify/">
    165           Icnsify
    166         </a>
    167       </h1>
    168     
    169     </header>
    170 
    171     <style>
    172 .carousel {
    173   display: flex;
    174   overflow: scroll;
    175 }
    176 </style>
    177 <div class="carousel">
    178   <img src="/images/icnsify/icns-macos-preview.webp" alt="icnsify-preview macOS" />
    179   <img src="/images/icnsify/icns-windows-preview.webp" alt="icnsify-preview Windows" />
    180 </div>
    181 <h2 id="icnsify-a-lean-cross-platform-icon-tool-for-macos-icns-format">
    182   icnsify: A Lean, Cross-Platform Icon Tool for macOS <code>.icns</code> Format
    183   <a class="heading-link" href="#icnsify-a-lean-cross-platform-icon-tool-for-macos-icns-format">
    184     <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
    185     <span class="sr-only">Link to heading</span>
    186   </a>
    187 </h2>
    188 <p><a href="https://github.com/JackMordaunt/icns"  class="external-link" target="_blank" rel="noopener">GitHub →</a></p>
    189 <h3 id="overview">
    190   Overview
    191   <a class="heading-link" href="#overview">
    192     <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
    193     <span class="sr-only">Link to heading</span>
    194   </a>
    195 </h3>
    196 <p><code>icnsify</code> is a fast, lightweight utility for creating and previewing <code>.icns</code>
    197 files—the proprietary Apple Icon Image format—without relying on macOS.</p>
    198 <p>I built the first version in a Swedish café in 2018 as my first serious
    199 open-source contribution. Since then, it has grown into a widely used
    200 tool among developers—especially those building cross-platform apps with
    201 <a href="https://gioui.org"  class="external-link" target="_blank" rel="noopener">Gio</a>—to automate icon generation as part of their CI
    202 pipelines or local development.</p>
    203 <p>The native Apple tool, <code>iconutil</code>, is macOS-only, hard to script, and requires a
    204 rigid folder structure with pre-sized PNGs. <code>icnsify</code> simplifies this:</p>
    205 <ul>
    206 <li><strong>Cross-platform</strong> (runs on Linux, macOS, Windows)</li>
    207 <li><strong>CLI-first</strong> with support for piping and scripting</li>
    208 <li><strong>Intelligently resizes a single image</strong> to required sizes</li>
    209 <li><strong>Auto-converts common formats to PNG</strong></li>
    210 <li><strong>Preview GUI</strong> for inspecting <code>.icns</code> on any OS</li>
    211 </ul>
    212 <p>Install with a single Go command: <code>go install github.com/jackmordaunt/icns/cmd/icnsify@latest</code></p>
    213 <h3 id="my-role">
    214   My Role
    215   <a class="heading-link" href="#my-role">
    216     <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
    217     <span class="sr-only">Link to heading</span>
    218   </a>
    219 </h3>
    220 <p>I designed and implemented <code>icnsify</code> from scratch, using the <code>.icns</code> format
    221 specification and reverse-engineering documentation like the Wikipedia entry.
    222 Key design goals:</p>
    223 <ul>
    224 <li><strong>Keep it lean:</strong> Minimal dependencies, instant startup, small binary</li>
    225 <li><strong>Make it ergonomic:</strong> Smart defaults, clear CLI, and usable in Unix pipelines</li>
    226 <li><strong>Simplify a complex task:</strong> Resize and convert images automatically</li>
    227 <li><strong>Support the ecosystem:</strong> Designed for developers publishing to macOS from any OS</li>
    228 </ul>
    229 <h3 id="results">
    230   Results
    231   <a class="heading-link" href="#results">
    232     <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
    233     <span class="sr-only">Link to heading</span>
    234   </a>
    235 </h3>
    236 <p><code>icnsify</code> is now used in multiple open-source projects targeting macOS,
    237 particularly in the Go/Gio ecosystem. It has become a go-to tool for developers
    238 who value simplicity, cross-platform compatibility, and automation in their
    239 toolchain.</p>
    240 <h3 id="used-by">
    241   Used By
    242   <a class="heading-link" href="#used-by">
    243     <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
    244     <span class="sr-only">Link to heading</span>
    245   </a>
    246 </h3>
    247 <div style="display: flex; flex-wrap: wrap; gap: 2rem;">
    248   <a href="https://github.com/fyne-io">
    249     <img style="max-height: 100px; border-radius: 8px;" src="/images/brands/fyne-io.webp" alt="Fyne"/>
    250   </a>
    251   <a href="https://github.com/wailsapp/wails">
    252     <img style="max-height: 100px;" src="/images/brands/wails.webp" alt="Wails"/>
    253   </a>
    254 </div>
    255 <h3 id="platforms">
    256   Platforms
    257   <a class="heading-link" href="#platforms">
    258     <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
    259     <span class="sr-only">Link to heading</span>
    260   </a>
    261 </h3>
    262 <div style="display: flex; flex-wrap: wrap; gap: 2rem;">
    263   <i class="fa-4x fa-brands fa-windows"></i>
    264   <i class="fa-4x fa-brands fa-apple"></i>
    265   <i class="fa-4x fa-brands fa-linux"></i>
    266 </div>
    267 <h3 id="languages">
    268   Languages
    269   <a class="heading-link" href="#languages">
    270     <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
    271     <span class="sr-only">Link to heading</span>
    272   </a>
    273 </h3>
    274 <div style="display: flex; flex-wrap: wrap; gap: 2rem;">
    275   <img style="max-height: 100px;" src="/images/brands/go.svg"/>
    276 </div>
    277 <h3 id="tech">
    278   Tech
    279   <a class="heading-link" href="#tech">
    280     <i class="fa-solid fa-link" aria-hidden="true" title="Link to heading"></i>
    281     <span class="sr-only">Link to heading</span>
    282   </a>
    283 </h3>
    284 <div style="display: flex; flex-wrap: wrap; gap: 2rem;">
    285   <img style="max-height: 100px;" src="/images/brands/gio.svg" class="invert-me"/>
    286 </div>
    287 
    288   </article>
    289 </section>
    290 
    291   
    292 
    293     </div>
    294 
    295     <footer class="footer">
    296   <section class="container">
    297     ©
    298     
    299     2025
    300      Jack Mordaunt 
    301     ·
    302     
    303     Powered by <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a> & <a href="https://github.com/luizdepra/hugo-coder/" target="_blank" rel="noopener">Coder</a>.
    304     
    305   </section>
    306 </footer>
    307 
    308   </main>
    309 
    310   
    311 
    312   
    313   
    314   <script src="/js/coder.min.6ae284be93d2d19dad1f02b0039508d9aab3180a12a06dcc71b0b0ef7825a317.js" integrity="sha256-auKEvpPS0Z2tHwKwA5UI2aqzGAoSoG3McbCw73gloxc="></script>
    315   
    316 
    317   
    318 
    319   
    320 
    321 
    322   
    323 
    324   
    325 
    326   
    327 
    328   
    329 
    330   
    331 
    332   
    333 
    334   
    335 
    336   
    337 
    338   
    339 
    340   
    341 
    342   
    343 
    344   
    345 
    346   
    347 
    348   
    349 
    350   
    351 
    352   
    353 
    354   
    355 </body>
    356 </html>