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>