site

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

icnsify.md (3247B)


      1 +++
      2 date = '2018-02-21T12:14:44-03:00'
      3 draft = false
      4 title = 'Icnsify'
      5 description = "Build and preview .icns icons cross platform."
      6 tags = ["Go", "Gio", "Portfolio"]
      7 categories = ["development"]
      8 +++
      9 
     10 <style>
     11 .carousel {
     12   display: flex;
     13   overflow: scroll;
     14 }
     15 </style>
     16 
     17 <div class="carousel">
     18   <img src="/images/icnsify/icns-macos-preview.webp" alt="icnsify-preview macOS" />
     19   <img src="/images/icnsify/icns-windows-preview.webp" alt="icnsify-preview Windows" />
     20 </div>
     21 
     22 ## icnsify: A Lean, Cross-Platform Icon Tool for macOS `.icns` Format  
     23 [GitHub →](https://github.com/JackMordaunt/icns)
     24 
     25 ### Overview  
     26 `icnsify` is a fast, lightweight utility for creating and previewing `.icns`
     27 files—the proprietary Apple Icon Image format—without relying on macOS.
     28 
     29 I built the first version in a Swedish café in 2018 as my first serious
     30 open-source contribution. Since then, it has grown into a widely used
     31 tool among developers—especially those building cross-platform apps with
     32 [Gio](https://gioui.org)—to automate icon generation as part of their CI
     33 pipelines or local development.
     34 
     35 The native Apple tool, `iconutil`, is macOS-only, hard to script, and requires a
     36 rigid folder structure with pre-sized PNGs. `icnsify` simplifies this:
     37 - **Cross-platform** (runs on Linux, macOS, Windows)  
     38 - **CLI-first** with support for piping and scripting  
     39 - **Intelligently resizes a single image** to required sizes  
     40 - **Auto-converts common formats to PNG**  
     41 - **Preview GUI** for inspecting `.icns` on any OS  
     42 
     43 Install with a single Go command: `go install github.com/jackmordaunt/icns/cmd/icnsify@latest`
     44 
     45 ### My Role  
     46 I designed and implemented `icnsify` from scratch, using the `.icns` format
     47 specification and reverse-engineering documentation like the Wikipedia entry.
     48 Key design goals:
     49 - **Keep it lean:** Minimal dependencies, instant startup, small binary  
     50 - **Make it ergonomic:** Smart defaults, clear CLI, and usable in Unix pipelines  
     51 - **Simplify a complex task:** Resize and convert images automatically  
     52 - **Support the ecosystem:** Designed for developers publishing to macOS from any OS  
     53 
     54 ### Results  
     55 `icnsify` is now used in multiple open-source projects targeting macOS,
     56 particularly in the Go/Gio ecosystem. It has become a go-to tool for developers
     57 who value simplicity, cross-platform compatibility, and automation in their
     58 toolchain.
     59 
     60 ### Used By
     61 
     62 <div style="display: flex; flex-wrap: wrap; gap: 2rem;">
     63   <a href="https://github.com/fyne-io">
     64     <img style="max-height: 100px; border-radius: 8px;" src="/images/brands/fyne-io.webp" alt="Fyne"/>
     65   </a>
     66   <a href="https://github.com/wailsapp/wails">
     67     <img style="max-height: 100px;" src="/images/brands/wails.webp" alt="Wails"/>
     68   </a>
     69 </div>
     70 
     71 ### Platforms
     72 
     73 <div style="display: flex; flex-wrap: wrap; gap: 2rem;">
     74   <i class="fa-4x fa-brands fa-windows"></i>
     75   <i class="fa-4x fa-brands fa-apple"></i>
     76   <i class="fa-4x fa-brands fa-linux"></i>
     77 </div>
     78 
     79 ### Languages
     80 
     81 <div style="display: flex; flex-wrap: wrap; gap: 2rem;">
     82   <img style="max-height: 100px;" src="/images/brands/go.svg"/>
     83 </div>
     84 
     85 ### Tech
     86 
     87 <div style="display: flex; flex-wrap: wrap; gap: 2rem;">
     88   <img style="max-height: 100px;" src="/images/brands/gio.svg" class="invert-me"/>
     89 </div>
     90