<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>icns, branch HEAD</title>
<subtitle>Easily create .icns files (Mac Icons) with this Go library or the included CLI. </subtitle>
<entry>
<id>83d064702dfec5f6f64f1db75151c6daa3c089c9</id>
<published>2026-09-21T10:41:15Z</published>
<updated>2026-09-21T10:41:15Z</updated>
<title type="text">appicon: spell a specialised value the way the manifest does</title>
<link rel="alternate" type="text/html" href="commit/83d064702dfec5f6f64f1db75151c6daa3c089c9.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 83d064702dfec5f6f64f1db75151c6daa3c089c9
parent 5001ec05889189ad6f7463133ec7d80e5bb4da34
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Mon, 21 Sep 2026 07:41:15 -0300

appicon: spell a specialised value the way the manifest does

A specialised translucency marshalled through the exported type, which
carried no tags, so it went out with Go&#39;s spelling and actool read nothing
where it wanted enabled and value.

</content>
</entry>
<entry>
<id>5001ec05889189ad6f7463133ec7d80e5bb4da34</id>
<published>2026-09-21T10:30:54Z</published>
<updated>2026-09-21T10:30:54Z</updated>
<title type="text">appicon: arrange the oracle the way a shipping icon is arranged</title>
<link rel="alternate" type="text/html" href="commit/5001ec05889189ad6f7463133ec7d80e5bb4da34.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 5001ec05889189ad6f7463133ec7d80e5bb4da34
parent 2c9154ea19a8d2bf0878dcdc41467af482242fa9
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Mon, 21 Sep 2026 07:30:54 -0300

appicon: arrange the oracle the way a shipping icon is arranged

The first fixture crashed actool, which the note about that crash had said
adding lighting or a blend mode would avoid. It does not: the same values
across two groups still fall over, so the note now says what was seen.

</content>
</entry>
<entry>
<id>2c9154ea19a8d2bf0878dcdc41467af482242fa9</id>
<published>2026-09-21T10:26:49Z</published>
<updated>2026-09-21T10:26:49Z</updated>
<title type="text">appicon: hold the bundle against actool</title>
<link rel="alternate" type="text/html" href="commit/2c9154ea19a8d2bf0878dcdc41467af482242fa9.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 2c9154ea19a8d2bf0878dcdc41467af482242fa9
parent 7b995cb665238b4cd65050777c8d63d36a5b8b8e
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Mon, 21 Sep 2026 07:26:49 -0300

appicon: hold the bundle against actool

A manifest actool ignores looks exactly like one it honours, and it crashes
on some rather than reporting them, so being well formed proves nothing. The
tool has to be asked.

</content>
</entry>
<entry>
<id>7b995cb665238b4cd65050777c8d63d36a5b8b8e</id>
<published>2026-09-20T19:52:49Z</published>
<updated>2026-09-20T19:52:49Z</updated>
<title type="text">appicon: record the compiler crash rather than guard against it</title>
<link rel="alternate" type="text/html" href="commit/7b995cb665238b4cd65050777c8d63d36a5b8b8e.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 7b995cb665238b4cd65050777c8d63d36a5b8b8e
parent 756ab6e2777342468a076de70cf0dccd0ab361fb
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 16:52:49 -0300

appicon: record the compiler crash rather than guard against it

A first guess at the trigger would have refused a manifest a shipping app
compiles. The shapes that fail and the ones that do not are written down
instead, since a rule that cannot be defended is worse than none.

</content>
</entry>
<entry>
<id>756ab6e2777342468a076de70cf0dccd0ab361fb</id>
<published>2026-09-20T19:41:37Z</published>
<updated>2026-09-20T19:41:37Z</updated>
<title type="text">appicon: vary a bundle by appearance</title>
<link rel="alternate" type="text/html" href="commit/756ab6e2777342468a076de70cf0dccd0ab361fb.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 756ab6e2777342468a076de70cf0dccd0ab361fb
parent 92b4a77e48c6a42886b318eb36f9387d2f274592
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 16:41:37 -0300

appicon: vary a bundle by appearance

An icon drawn once looks wrong tinted or in the dark, which is why the
manifest holds a list per value rather than a value. The plain field and the
list say the same thing, so only one of the two is written.

</content>
</entry>
<entry>
<id>92b4a77e48c6a42886b318eb36f9387d2f274592</id>
<published>2026-09-20T19:36:19Z</published>
<updated>2026-09-20T19:36:19Z</updated>
<title type="text">docs: describe the macOS 26 icon bundle</title>
<link rel="alternate" type="text/html" href="commit/92b4a77e48c6a42886b318eb36f9387d2f274592.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 92b4a77e48c6a42886b318eb36f9387d2f274592
parent 2368c2fcc1e15fb4254f5d140d6303534026b366
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 16:36:19 -0300

docs: describe the macOS 26 icon bundle

The compile step is the part people will expect to need a Mac for, so the
workflow that does it without one belongs beside the API.

</content>
</entry>
<entry>
<id>2368c2fcc1e15fb4254f5d140d6303534026b366</id>
<published>2026-09-20T19:35:51Z</published>
<updated>2026-09-20T19:35:51Z</updated>
<title type="text">icnsify: write an icon bundle</title>
<link rel="alternate" type="text/html" href="commit/2368c2fcc1e15fb4254f5d140d6303534026b366.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 2368c2fcc1e15fb4254f5d140d6303534026b366
parent e27066fa0261cfbe308bca6f57104db9be5d70e5
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 16:35:51 -0300

icnsify: write an icon bundle

A bundle is the one output that is a directory rather than a file, so it is
built where the output path is resolved rather than through the writer every
other format goes out by.

</content>
</entry>
<entry>
<id>e27066fa0261cfbe308bca6f57104db9be5d70e5</id>
<published>2026-09-20T19:34:35Z</published>
<updated>2026-09-20T19:34:35Z</updated>
<title type="text">appicon: write the icon bundle macOS 26 compiles</title>
<link rel="alternate" type="text/html" href="commit/e27066fa0261cfbe308bca6f57104db9be5d70e5.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit e27066fa0261cfbe308bca6f57104db9be5d70e5
parent 1831a88e7dc159ad18a560eca08969765b152a13
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 16:34:35 -0300

appicon: write the icon bundle macOS 26 compiles

The bundle is a manifest and its layer images, so the part a Windows machine
cannot do is only the compile. Authoring it here leaves that one step for a
runner that has actool.

</content>
</entry>
<entry>
<id>1831a88e7dc159ad18a560eca08969765b152a13</id>
<published>2026-09-20T19:24:55Z</published>
<updated>2026-09-20T19:24:55Z</updated>
<title type="text">icns: stop warning about ARGB padding</title>
<link rel="alternate" type="text/html" href="commit/1831a88e7dc159ad18a560eca08969765b152a13.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 1831a88e7dc159ad18a560eca08969765b152a13
parent 29025adfb526b462e403b312df8b6e270f20eb2e
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 16:24:55 -0300

icns: stop warning about ARGB padding

actool on macOS 26 writes an ARGB element whose stream ends on its last run.
The evidence for the dropped value was only ever the three plane types, and
a check that accuses Apple&#39;s own output loses its authority.

</content>
</entry>
<entry>
<id>29025adfb526b462e403b312df8b6e270f20eb2e</id>
<published>2026-09-20T19:04:42Z</published>
<updated>2026-09-20T19:04:42Z</updated>
<title type="text">docs: describe reading icons out of binaries</title>
<link rel="alternate" type="text/html" href="commit/29025adfb526b462e403b312df8b6e270f20eb2e.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 29025adfb526b462e403b312df8b6e270f20eb2e
parent d23e32332b2c909c6dfdec5f489c00e00ef1729d
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 16:04:42 -0300

docs: describe reading icons out of binaries

A package that only shows up in the module list is one nobody finds.

</content>
</entry>
<entry>
<id>d23e32332b2c909c6dfdec5f489c00e00ef1729d</id>
<published>2026-09-20T19:04:23Z</published>
<updated>2026-09-20T19:04:23Z</updated>
<title type="text">icnsify: read icons out of a Windows binary</title>
<link rel="alternate" type="text/html" href="commit/d23e32332b2c909c6dfdec5f489c00e00ef1729d.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit d23e32332b2c909c6dfdec5f489c00e00ef1729d
parent ebed95fc91a2d6f1e042400b283edfe8d19e4875
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 16:04:23 -0300

icnsify: read icons out of a Windows binary

The icon a program ships with has no file beside it, so checking or
converting it meant finding a copy of the artwork. Explorer draws what is in
the resources, which is what --check now reads.

</content>
</entry>
<entry>
<id>ebed95fc91a2d6f1e042400b283edfe8d19e4875</id>
<published>2026-09-20T19:02:27Z</published>
<updated>2026-09-20T19:02:27Z</updated>
<title type="text">exe: read the icons a Windows binary carries</title>
<link rel="alternate" type="text/html" href="commit/ebed95fc91a2d6f1e042400b283edfe8d19e4875.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit ebed95fc91a2d6f1e042400b283edfe8d19e4875
parent 1123bccf0f06705889b6919ade846e01af6e7cb4
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 16:02:27 -0300

exe: read the icons a Windows binary carries

An icon inside an executable is an ico taken apart: a directory in one
resource and its images in others. Putting it back together is the only way
to get at artwork that ships with no file beside it.

</content>
</entry>
<entry>
<id>1123bccf0f06705889b6919ade846e01af6e7cb4</id>
<published>2026-09-20T18:54:27Z</published>
<updated>2026-09-20T18:54:27Z</updated>
<title type="text">docs: describe validation</title>
<link rel="alternate" type="text/html" href="commit/1123bccf0f06705889b6919ade846e01af6e7cb4.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 1123bccf0f06705889b6919ade846e01af6e7cb4
parent d9f37c584c6c615ac1f6f0c0c45de61b275516cd
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 15:54:27 -0300

docs: describe validation

The findings are the reason to reach for this over a converter, so they
belong where someone deciding can read them.

</content>
</entry>
<entry>
<id>d9f37c584c6c615ac1f6f0c0c45de61b275516cd</id>
<published>2026-09-20T18:54:27Z</published>
<updated>2026-09-20T18:54:27Z</updated>
<title type="text">wasm: expose validation to the page</title>
<link rel="alternate" type="text/html" href="commit/d9f37c584c6c615ac1f6f0c0c45de61b275516cd.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit d9f37c584c6c615ac1f6f0c0c45de61b275516cd
parent 952d580cc7f3df1b9affea829ddfef91120d1ef5
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 15:54:27 -0300

wasm: expose validation to the page

The page can already convert without uploading; telling someone their icon
is broken is the same argument, and it is what the conversion is worth
trusting for.

</content>
</entry>
<entry>
<id>952d580cc7f3df1b9affea829ddfef91120d1ef5</id>
<published>2026-09-20T18:54:15Z</published>
<updated>2026-09-20T18:54:15Z</updated>
<title type="text">icnsify: check an icon from the command line</title>
<link rel="alternate" type="text/html" href="commit/952d580cc7f3df1b9affea829ddfef91120d1ef5.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 952d580cc7f3df1b9affea829ddfef91120d1ef5
parent 39e1831ec6f3c31a4a1793dc0ccebd412b76535c
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 15:54:15 -0300

icnsify: check an icon from the command line

Validation is worth having in a build, where nobody is looking at the icon.
The exit code separates the findings that change what is drawn from the ones
that only note something absent.

</content>
</entry>
<entry>
<id>39e1831ec6f3c31a4a1793dc0ccebd412b76535c</id>
<published>2026-09-20T18:41:09Z</published>
<updated>2026-09-20T18:41:09Z</updated>
<title type="text">icns: report what macOS will make of a file</title>
<link rel="alternate" type="text/html" href="commit/39e1831ec6f3c31a4a1793dc0ccebd412b76535c.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 39e1831ec6f3c31a4a1793dc0ccebd412b76535c
parent 4e362e59742bc67ef4aad4fb6527118b7e8c94f2
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 15:41:09 -0300

icns: report what macOS will make of a file

The traps this package knows about are invisible in the output: planes that
end on their last run lose their tail to Apple silicon, an icon without its
mask draws opaque, and icp4 renders everywhere but an app bundle.

</content>
</entry>
<entry>
<id>4e362e59742bc67ef4aad4fb6527118b7e8c94f2</id>
<published>2026-09-20T18:35:40Z</published>
<updated>2026-09-20T18:35:40Z</updated>
<title type="text">ico: report what Windows will make of a file</title>
<link rel="alternate" type="text/html" href="commit/4e362e59742bc67ef4aad4fb6527118b7e8c94f2.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 4e362e59742bc67ef4aad4fb6527118b7e8c94f2
parent b18d6e718a37b11a153f4ccdd8b2654a5568cc54
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 15:35:40 -0300

ico: report what Windows will make of a file

An icon Windows silently passes over looks exactly like one it draws: an
opaque PNG frame loses its alpha channel on the way out, and every Windows
decoder skips it. A failure that presents as success has to be asked for.

</content>
</entry>
<entry>
<id>b18d6e718a37b11a153f4ccdd8b2654a5568cc54</id>
<published>2026-09-20T10:47:09Z</published>
<updated>2026-09-20T11:14:39Z</updated>
<title type="text">build: separate minting a tag from releasing one</title>
<link rel="alternate" type="text/html" href="commit/b18d6e718a37b11a153f4ccdd8b2654a5568cc54.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit b18d6e718a37b11a153f4ccdd8b2654a5568cc54
parent 3e85d61358e5c418fd6e7df5f3964a5c864855a1
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 07:47:09 -0300

build: separate minting a tag from releasing one

One positional argument meant that asking for a new tag and asking for an
existing one looked identical, and a tag left unpushed made GitHub release
the default branch tip rather than the commit named.

</content>
</entry>
<entry>
<id>3e85d61358e5c418fd6e7df5f3964a5c864855a1</id>
<published>2026-09-20T10:32:53Z</published>
<updated>2026-09-20T10:32:53Z</updated>
<title type="text">ci: leave the winget job without an ambient token</title>
<link rel="alternate" type="text/html" href="commit/3e85d61358e5c418fd6e7df5f3964a5c864855a1.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 3e85d61358e5c418fd6e7df5f3964a5c864855a1
parent b77d8f9375bcff3810c7b3604e1c247648838afc
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 07:32:53 -0300

ci: leave the winget job without an ambient token

The job authenticates entirely with its own secret, so the token GitHub
injects was an unused credential sitting in the environment where a third
party action runs.

</content>
</entry>
<entry>
<id>b77d8f9375bcff3810c7b3604e1c247648838afc</id>
<published>2026-09-20T10:23:57Z</published>
<updated>2026-09-20T10:24:08Z</updated>
<title type="text">ci: pin govulncheck to a release</title>
<link rel="alternate" type="text/html" href="commit/b77d8f9375bcff3810c7b3604e1c247648838afc.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit b77d8f9375bcff3810c7b3604e1c247648838afc
parent 7ed3aef71850d972b3d4dabf20c62f499e68d745
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 07:23:57 -0300

ci: pin govulncheck to a release

At latest, a different scanner runs each week and a bad release reaches CI
the day it lands. Naming a version makes an upgrade a reviewed change; the
advisory data is still fetched at run time.

</content>
</entry>
<entry>
<id>7ed3aef71850d972b3d4dabf20c62f499e68d745</id>
<published>2026-09-20T10:14:58Z</published>
<updated>2026-09-20T10:14:58Z</updated>
<title type="text">ci: pin the actions to commit hashes</title>
<link rel="alternate" type="text/html" href="commit/7ed3aef71850d972b3d4dabf20c62f499e68d745.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 7ed3aef71850d972b3d4dabf20c62f499e68d745
parent df287f9adc7f7a8ea35928d2015019afa9499204
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sun, 20 Sep 2026 07:14:58 -0300

ci: pin the actions to commit hashes

A mutable tag lets whoever controls the action&#39;s repository change what runs
against this one&#39;s secrets. The version stays legible in a trailing comment,
which is what dependabot reads when it bumps the pin.

</content>
</entry>
<entry>
<id>df287f9adc7f7a8ea35928d2015019afa9499204</id>
<published>2026-09-19T18:43:43Z</published>
<updated>2026-09-20T10:04:41Z</updated>
<title type="text">build: move the release config to goreleaser v2</title>
<link rel="alternate" type="text/html" href="commit/df287f9adc7f7a8ea35928d2015019afa9499204.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit df287f9adc7f7a8ea35928d2015019afa9499204
parent 18ce13189bf7f5251a139fdc8e9ee1dcf16d3175
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sat, 19 Sep 2026 15:43:43 -0300

build: move the release config to goreleaser v2

Version 2 refuses a config that does not declare its version, and renamed
the snapshot and archive format fields. The generated formula and manifest
are unchanged but for template cosmetics.

</content>
</entry>
<entry>
<id>18ce13189bf7f5251a139fdc8e9ee1dcf16d3175</id>
<published>2026-09-19T18:30:57Z</published>
<updated>2026-09-20T10:04:41Z</updated>
<title type="text">build: restore the shell extension&#39;s out-of-workspace build</title>
<link rel="alternate" type="text/html" href="commit/18ce13189bf7f5251a139fdc8e9ee1dcf16d3175.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 18ce13189bf7f5251a139fdc8e9ee1dcf16d3175
parent aec6cb14cb6f62f1b4808b274371c9220cce0c2c
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sat, 19 Sep 2026 15:30:57 -0300

build: restore the shell extension&#39;s out-of-workspace build

The step was dropped because no published library carried the decoder the
module calls. v4.1.0 does, so the check that a go.sum learned the published
version can cover this module again.

</content>
</entry>
<entry>
<id>aec6cb14cb6f62f1b4808b274371c9220cce0c2c</id>
<published>2026-09-19T18:30:51Z</published>
<updated>2026-09-20T10:04:41Z</updated>
<title type="text">build: take the published library in the command modules</title>
<link rel="alternate" type="text/html" href="commit/aec6cb14cb6f62f1b4808b274371c9220cce0c2c.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit aec6cb14cb6f62f1b4808b274371c9220cce0c2c
parent a289d07afc0c1a5cb43cf960d470c872bf8bd110
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sat, 19 Sep 2026 15:30:51 -0300

build: take the published library in the command modules

Outside the workspace both modules resolved v4.0.0, which predates the
decoder they call and still carried the old resize dependency. v4.1.0 is
published, so the requirement can name what go install actually gets.

</content>
</entry>
<entry>
<id>a289d07afc0c1a5cb43cf960d470c872bf8bd110</id>
<published>2026-09-19T17:15:33Z</published>
<updated>2026-09-20T10:04:41Z</updated>
<title type="text">ci: follow the winget releaser to its new owner</title>
<link rel="alternate" type="text/html" href="commit/a289d07afc0c1a5cb43cf960d470c872bf8bd110.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit a289d07afc0c1a5cb43cf960d470c872bf8bd110
parent 76ed5c9c98d9f5f37347fd888ecb8a4ef6692f98
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Sat, 19 Sep 2026 14:15:33 -0300

ci: follow the winget releaser to its new owner

The action&#39;s repository was renamed, so the old path resolves only through
GitHub&#39;s redirect. Naming the owner it actually lives under keeps the step
working if that redirect ever lapses.

</content>
</entry>
<entry>
<id>76ed5c9c98d9f5f37347fd888ecb8a4ef6692f98</id>
<published>2026-09-18T20:09:39Z</published>
<updated>2026-09-18T20:09:39Z</updated>
<title type="text">wasm: expose the converters to a web page</title>
<link rel="alternate" type="text/html" href="commit/76ed5c9c98d9f5f37347fd888ecb8a4ef6692f98.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 76ed5c9c98d9f5f37347fd888ecb8a4ef6692f98
parent cadf5f4dc07baf465a309509f25dd181cce98118
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:39 -0400

wasm: expose the converters to a web page

Running the conversion in the browser means the artwork never leaves the
machine it was drawn on, which is the one claim a hosted converter cannot
make. The page fetches the engine only once a file arrives.

</content>
</entry>
<entry>
<id>cadf5f4dc07baf465a309509f25dd181cce98118</id>
<published>2026-09-18T20:09:39Z</published>
<updated>2026-09-18T20:09:39Z</updated>
<title type="text">icnsify: write ico files</title>
<link rel="alternate" type="text/html" href="commit/cadf5f4dc07baf465a309509f25dd181cce98118.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit cadf5f4dc07baf465a309509f25dd181cce98118
parent c74311c5ee4dc722cded3cffcb748cd5fe9da86c
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:39 -0400

icnsify: write ico files

A program that needs both icon formats had to reach for the library to get
the Windows one. The output path names the format, --format names it where
a pipe has no path to read, and an iconset directory fills either container.

</content>
</entry>
<entry>
<id>c74311c5ee4dc722cded3cffcb748cd5fe9da86c</id>
<published>2026-09-18T20:09:39Z</published>
<updated>2026-09-18T20:09:39Z</updated>
<title type="text">ico: check the format against Windows itself</title>
<link rel="alternate" type="text/html" href="commit/c74311c5ee4dc722cded3cffcb748cd5fe9da86c.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit c74311c5ee4dc722cded3cffcb748cd5fe9da86c
parent 9eb03ebdb77803f4855049bdd6254036417eb98d
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:39 -0400

ico: check the format against Windows itself

Windows reads a PNG icon only when it carries an alpha channel, which Go&#39;s
encoder drops from an image that is entirely opaque, so a 256 pixel icon was
invisible to every Windows decoder. Nothing short of asking Windows finds
that.

</content>
</entry>
<entry>
<id>9eb03ebdb77803f4855049bdd6254036417eb98d</id>
<published>2026-09-18T20:09:38Z</published>
<updated>2026-09-18T20:09:38Z</updated>
<title type="text">ico: add a sibling package for the Windows icon format</title>
<link rel="alternate" type="text/html" href="commit/9eb03ebdb77803f4855049bdd6254036417eb98d.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 9eb03ebdb77803f4855049bdd6254036417eb98d
parent 8204a2af5ae9eb0d8aabf9640f844d66f133b017
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:38 -0400

ico: add a sibling package for the Windows icon format

A program that ships a macOS icon usually needs a Windows one from the same
artwork, and the shell extension already puts this project on Windows. The
API mirrors the icns one so both formats read the same way, and the two
share resampling.

</content>
</entry>
<entry>
<id>8204a2af5ae9eb0d8aabf9640f844d66f133b017</id>
<published>2026-09-18T20:09:38Z</published>
<updated>2026-09-18T20:09:38Z</updated>
<title type="text">icns: move resampling into an internal package</title>
<link rel="alternate" type="text/html" href="commit/8204a2af5ae9eb0d8aabf9640f844d66f133b017.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 8204a2af5ae9eb0d8aabf9640f844d66f133b017
parent eeb191d483b2832b63f1a1e1da839d09cdf871b6
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:38 -0400

icns: move resampling into an internal package

A second icon format needs the same scaling and the same choice of filter,
and neither belongs to icns in particular. InterpolationFunction is now an
alias, so callers see no change while both formats share one type.

</content>
</entry>
<entry>
<id>eeb191d483b2832b63f1a1e1da839d09cdf871b6</id>
<published>2026-09-18T20:09:38Z</published>
<updated>2026-09-18T20:09:38Z</updated>
<title type="text">icns: let registered decoders read the compressed elements</title>
<link rel="alternate" type="text/html" href="commit/eeb191d483b2832b63f1a1e1da839d09cdf871b6.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit eeb191d483b2832b63f1a1e1da839d09cdf871b6
parent d42b4fcb13f7994a900d73eec35031c423bb9bd7
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:38 -0400

icns: let registered decoders read the compressed elements

Refusing JPEG 2000 outright made a file written between 10.5 and 10.6
unreadable, with no way in short of the raw bytes. Handing those elements to
image.Decode means a program that imports a codec reads them, and one that
does not carries no dependency.

</content>
</entry>
<entry>
<id>d42b4fcb13f7994a900d73eec35031c423bb9bd7</id>
<published>2026-09-18T20:09:37Z</published>
<updated>2026-09-18T20:09:37Z</updated>
<title type="text">icns: pad compressed colour planes with a trailing byte</title>
<link rel="alternate" type="text/html" href="commit/d42b4fcb13f7994a900d73eec35031c423bb9bd7.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit d42b4fcb13f7994a900d73eec35031c423bb9bd7
parent 41fc02c1a113a01d6448ce25f421abf7b5cfdc88
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:37 -0400

icns: pad compressed colour planes with a trailing byte

The oracle found it: Apple&#39;s own reader drops the last value of a run-length
stream on Apple silicon, so the tail of the blue plane came back black in a
16 pixel icon. A byte of padding is what it loses instead.

</content>
</entry>
<entry>
<id>41fc02c1a113a01d6448ce25f421abf7b5cfdc88</id>
<published>2026-09-18T20:09:37Z</published>
<updated>2026-09-18T20:09:37Z</updated>
<title type="text">build: annotate library test failures</title>
<link rel="alternate" type="text/html" href="commit/41fc02c1a113a01d6448ce25f421abf7b5cfdc88.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 41fc02c1a113a01d6448ce25f421abf7b5cfdc88
parent 911701b2910be1e00c90795b113250d1c6bd0a0f
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:37 -0400

build: annotate library test failures

The macOS leg fails where the oracle job passes, so the broader run is
hiding something the annotations will name.

</content>
</entry>
<entry>
<id>911701b2910be1e00c90795b113250d1c6bd0a0f</id>
<published>2026-09-18T20:09:37Z</published>
<updated>2026-09-18T20:09:37Z</updated>
<title type="text">build: vet each module where it can build</title>
<link rel="alternate" type="text/html" href="commit/911701b2910be1e00c90795b113250d1c6bd0a0f.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 911701b2910be1e00c90795b113250d1c6bd0a0f
parent 1ddb83634a37329d3ac7ac51bd73cd546ca5564b
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:37 -0400

build: vet each module where it can build

Vetting every module from the Linux job cannot work: the GUI needs a desktop
toolchain the runner lacks, and the shell extension has no files outside
Windows. The oracle now reports failures as annotations too, which show on
the run without opening the log.

</content>
</entry>
<entry>
<id>1ddb83634a37329d3ac7ac51bd73cd546ca5564b</id>
<published>2026-09-18T20:09:36Z</published>
<updated>2026-09-18T20:09:36Z</updated>
<title type="text">build: hold the package against iconutil on macOS</title>
<link rel="alternate" type="text/html" href="commit/1ddb83634a37329d3ac7ac51bd73cd546ca5564b.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 1ddb83634a37329d3ac7ac51bd73cd546ca5564b
parent 358f79b8c0652ed11aa86f6cdb373dce582aa5f7
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:36 -0400

build: hold the package against iconutil on macOS

Nothing outside this package had ever read what it writes, and its reading of
Apple output was checked by hand once. Apple ships the tool on the macOS
runner, so both directions become tests: it builds a file this package reads,
and it takes apart a file this package built.

</content>
</entry>
<entry>
<id>358f79b8c0652ed11aa86f6cdb373dce582aa5f7</id>
<published>2026-09-18T20:09:36Z</published>
<updated>2026-09-18T20:09:36Z</updated>
<title type="text">docs: say how far back decoding reaches</title>
<link rel="alternate" type="text/html" href="commit/358f79b8c0652ed11aa86f6cdb373dce582aa5f7.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 358f79b8c0652ed11aa86f6cdb373dce582aa5f7
parent ee5210fbe0fcc1637ab5ce9c087daca7ceb1580d
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:36 -0400

docs: say how far back decoding reaches

The readme still described the decoder as understanding four legacy elements,
which undersells it by two whole families and leaves a reader guessing what
happens when a file holds one icon at several depths.

</content>
</entry>
<entry>
<id>ee5210fbe0fcc1637ab5ce9c087daca7ceb1580d</id>
<published>2026-09-18T20:09:36Z</published>
<updated>2026-09-18T20:09:36Z</updated>
<title type="text">icns: decode the indexed colour icon types</title>
<link rel="alternate" type="text/html" href="commit/ee5210fbe0fcc1637ab5ce9c087daca7ceb1580d.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit ee5210fbe0fcc1637ab5ce9c087daca7ceb1580d
parent d56977a3f014f7f4baf59e250f5a7d530ce6eb35
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:36 -0400

icns: decode the indexed colour icon types

Icons from System 7 through Mac OS 8 store an index per pixel against tables
the system fixed, and were skipped entirely. Those files often hold the same
icon at several depths, so the entries are now ordered by how much colour
they carry as well as by size.

</content>
</entry>
<entry>
<id>d56977a3f014f7f4baf59e250f5a7d530ce6eb35</id>
<published>2026-09-18T20:09:35Z</published>
<updated>2026-09-18T20:09:35Z</updated>
<title type="text">icns: decode the ARGB sidebar and toolbar icons</title>
<link rel="alternate" type="text/html" href="commit/d56977a3f014f7f4baf59e250f5a7d530ce6eb35.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit d56977a3f014f7f4baf59e250f5a7d530ce6eb35
parent 1603cb1eb48f3f5767cb91baa28db86586dfe8e2
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:35 -0400

icns: decode the ARGB sidebar and toolbar icons

Sidebar and toolbar icons hold their alpha in a plane of their own behind an
ARGB header, and were skipped, so those sizes went missing from files that
carry them. The types take either ARGB or PNG, so the payload now decides
rather than the type.

</content>
</entry>
<entry>
<id>1603cb1eb48f3f5767cb91baa28db86586dfe8e2</id>
<published>2026-09-18T20:09:35Z</published>
<updated>2026-09-18T20:09:35Z</updated>
<title type="text">cmd/icnsify: report the build with a version flag</title>
<link rel="alternate" type="text/html" href="commit/1603cb1eb48f3f5767cb91baa28db86586dfe8e2.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 1603cb1eb48f3f5767cb91baa28db86586dfe8e2
parent 6e0cc7f2a9e45569c000b36817ddbdebe8f4ef7a
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:35 -0400

cmd/icnsify: report the build with a version flag

A tool shipped through brew, scoop and winget should be able to say what it
is, and the release already stamped a commit, date and builder that nothing
declared, so the linker quietly discarded them.

</content>
</entry>
<entry>
<id>6e0cc7f2a9e45569c000b36817ddbdebe8f4ef7a</id>
<published>2026-09-18T20:09:35Z</published>
<updated>2026-09-18T20:09:35Z</updated>
<title type="text">icns: sort with the slices package</title>
<link rel="alternate" type="text/html" href="commit/6e0cc7f2a9e45569c000b36817ddbdebe8f4ef7a.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 6e0cc7f2a9e45569c000b36817ddbdebe8f4ef7a
parent 2569d0a7551eeb1174be2b00983a50e1bd5caa59
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:35 -0400

icns: sort with the slices package

sort.Slice reaches for reflection and takes indices, so the comparisons read
around the slice rather than over its elements. The typed equivalents say the
same thing about the values themselves.

</content>
</entry>
<entry>
<id>2569d0a7551eeb1174be2b00983a50e1bd5caa59</id>
<published>2026-09-18T20:09:34Z</published>
<updated>2026-09-18T20:09:34Z</updated>
<title type="text">build: drop the shell extension&#39;s out-of-workspace build</title>
<link rel="alternate" type="text/html" href="commit/2569d0a7551eeb1174be2b00983a50e1bd5caa59.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 2569d0a7551eeb1174be2b00983a50e1bd5caa59
parent 09932068646d97867b09df30664c6e5170ca40d4
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:34 -0400

build: drop the shell extension&#39;s out-of-workspace build

The step covered what go install gets, but the module now calls library API
that no published version has, so it cannot pass until a release carries it.
A step that always fails hides the ones that matter.

</content>
</entry>
<entry>
<id>09932068646d97867b09df30664c6e5170ca40d4</id>
<published>2026-09-18T20:09:34Z</published>
<updated>2026-09-18T20:09:34Z</updated>
<title type="text">all: update x/image and x/net</title>
<link rel="alternate" type="text/html" href="commit/09932068646d97867b09df30664c6e5170ca40d4.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 09932068646d97867b09df30664c6e5170ca40d4
parent 70855804b673e4c2715a190755164cbb71fb1fee
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:34 -0400

all: update x/image and x/net

x/image sat below the releases fixing its tiff and webp advisories, which
govulncheck calls unreachable but which surface in every consumer&#39;s scan.
x/net carried one that was reachable from the GUI. All three modules now
report clean.

</content>
</entry>
<entry>
<id>70855804b673e4c2715a190755164cbb71fb1fee</id>
<published>2026-09-18T20:09:34Z</published>
<updated>2026-09-18T20:09:34Z</updated>
<title type="text">all: require Go 1.27</title>
<link rel="alternate" type="text/html" href="commit/70855804b673e4c2715a190755164cbb71fb1fee.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 70855804b673e4c2715a190755164cbb71fb1fee
parent f9884d4e2b3aabf4c749f28f62f4731751e88b69
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:34 -0400

all: require Go 1.27

The modules had drifted to three different floors, and the oldest held the
repo on dependency versions months behind. One floor across the workspace is
also what the command modules need, since neither can declare less than the
library it imports.

</content>
</entry>
<entry>
<id>f9884d4e2b3aabf4c749f28f62f4731751e88b69</id>
<published>2026-09-18T20:09:33Z</published>
<updated>2026-09-18T20:09:33Z</updated>
<title type="text">cmd/preview: move to Gio 0.10</title>
<link rel="alternate" type="text/html" href="commit/f9884d4e2b3aabf4c749f28f62f4731751e88b69.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit f9884d4e2b3aabf4c749f28f62f4731751e88b69
parent 23ec0ba0840b4bef57b45266e6ea7482080dce46
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:33 -0400

cmd/preview: move to Gio 0.10

The pinned 0.3.1 used an event loop and an input API that Gio has since
removed, so the GUI could not follow a fix or a fresh dependency. Thumbnails
carry their own click state now, which is what the new input model wants and
which retires the hand-rolled pointer handling.

</content>
</entry>
<entry>
<id>23ec0ba0840b4bef57b45266e6ea7482080dce46</id>
<published>2026-09-18T20:09:33Z</published>
<updated>2026-09-18T20:09:33Z</updated>
<title type="text">docs: describe per-slot encoding and single icon decoding</title>
<link rel="alternate" type="text/html" href="commit/23ec0ba0840b4bef57b45266e6ea7482080dce46.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 23ec0ba0840b4bef57b45266e6ea7482080dce46
parent 335a96d4f5a847f6dba50f5572b012bc2909d756
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:33 -0400

docs: describe per-slot encoding and single icon decoding

Neither entry point is discoverable from the existing examples, and the slot
rather than pixel size keying needs saying: it is the part a reader would
otherwise get wrong. Payload is also the only route to a JPEG 2000 icon.

</content>
</entry>
<entry>
<id>335a96d4f5a847f6dba50f5572b012bc2909d756</id>
<published>2026-09-18T20:09:33Z</published>
<updated>2026-09-18T20:09:33Z</updated>
<title type="text">cmd/icnsify: convert an iconset directory</title>
<link rel="alternate" type="text/html" href="commit/335a96d4f5a847f6dba50f5572b012bc2909d756.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 335a96d4f5a847f6dba50f5572b012bc2909d756
parent 28e0d609d39c2ef139480defe3df865ca45af813
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:33 -0400

cmd/icnsify: convert an iconset directory

Per-slot artwork was reachable only from Go, and an iconset directory is how
that artwork already arrives from a designer or from iconutil. Names that do
not match a slot are ignored rather than refused, so stray files in the
folder do not stop a conversion.

</content>
</entry>
<entry>
<id>28e0d609d39c2ef139480defe3df865ca45af813</id>
<published>2026-09-18T20:09:32Z</published>
<updated>2026-09-18T20:09:32Z</updated>
<title type="text">icns: encode from artwork supplied per slot</title>
<link rel="alternate" type="text/html" href="commit/28e0d609d39c2ef139480defe3df865ca45af813.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 28e0d609d39c2ef139480defe3df865ca45af813
parent 56bd4e8ba5a555d192d0bad277c3a736c9906991
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:32 -0400

icns: encode from artwork supplied per slot

One image was resized into every size, which is worst at 16 and 32 pixels
where icons are drawn by hand rather than reduced. A slot is a size and a
scale, not a pixel count, because 16x16@2x and 32x32 are both 32 pixels but
fill different elements.

</content>
</entry>
<entry>
<id>56bd4e8ba5a555d192d0bad277c3a736c9906991</id>
<published>2026-09-18T20:09:32Z</published>
<updated>2026-09-18T20:09:32Z</updated>
<title type="text">cmd/shell-extension: decode only the icon it needs</title>
<link rel="alternate" type="text/html" href="commit/56bd4e8ba5a555d192d0bad277c3a736c9906991.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 56bd4e8ba5a555d192d0bad277c3a736c9906991
parent a0554fe76cb70ad063a045dcbe2428a7f0c38dbd
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:32 -0400

cmd/shell-extension: decode only the icon it needs

Explorer asks for one thumbnail at a time, and the provider decoded every
icon in the file to return one of them. Files now carry more elements than
they did, so the waste grew with them.

</content>
</entry>
<entry>
<id>a0554fe76cb70ad063a045dcbe2428a7f0c38dbd</id>
<published>2026-09-18T20:09:32Z</published>
<updated>2026-09-18T20:09:32Z</updated>
<title type="text">icns: decode one icon without decoding the rest</title>
<link rel="alternate" type="text/html" href="commit/a0554fe76cb70ad063a045dcbe2428a7f0c38dbd.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit a0554fe76cb70ad063a045dcbe2428a7f0c38dbd
parent 0cebcdbed776a5835e0115d58e622ec24258f3d2
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:32 -0400

icns: decode one icon without decoding the rest

DecodeAll was the only way in, so a caller after a single size paid to decode
every other. The stored bytes also had nowhere to go for formats this package
cannot read, leaving a JPEG 2000 file a dead end rather than something the
caller could handle itself.

</content>
</entry>
<entry>
<id>0cebcdbed776a5835e0115d58e622ec24258f3d2</id>
<published>2026-09-18T20:09:31Z</published>
<updated>2026-09-18T20:09:31Z</updated>
<title type="text">icns: write a table of contents</title>
<link rel="alternate" type="text/html" href="commit/0cebcdbed776a5835e0115d58e622ec24258f3d2.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 0cebcdbed776a5835e0115d58e622ec24258f3d2
parent bff19a681cc6bf5b6f291663d0ee0805332ad4d7
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:31 -0400

icns: write a table of contents

Apple has written one since 10.7, and a reader after a single size must
otherwise walk every element to find it. It lists the type and total size of
everything that follows, which is the whole file bar the table itself.

</content>
</entry>
<entry>
<id>bff19a681cc6bf5b6f291663d0ee0805332ad4d7</id>
<published>2026-09-18T20:09:31Z</published>
<updated>2026-09-18T20:09:31Z</updated>
<title type="text">icns: write true 16 and 32 pixel icons</title>
<link rel="alternate" type="text/html" href="commit/bff19a681cc6bf5b6f291663d0ee0805332ad4d7.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit bff19a681cc6bf5b6f291663d0ee0805332ad4d7
parent 5dbc5dd2b9cbe3f623c758462978197d3a8235f4
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:31 -0400

icns: write true 16 and 32 pixel icons

Every icon was written for retina, so the smallest was 32 pixels standing in
for 16 at 2x and Finder had to downsample for a 16 pixel slot. Apple still
writes those two sizes as colour and mask, which this now matches.

</content>
</entry>
<entry>
<id>5dbc5dd2b9cbe3f623c758462978197d3a8235f4</id>
<published>2026-09-18T20:09:31Z</published>
<updated>2026-09-18T20:09:31Z</updated>
<title type="text">icns: let one icon occupy more than one element</title>
<link rel="alternate" type="text/html" href="commit/5dbc5dd2b9cbe3f623c758462978197d3a8235f4.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 5dbc5dd2b9cbe3f623c758462978197d3a8235f4
parent 6d8994a7f3fa99bfa83d24d9455802673f00f08a
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:31 -0400

icns: let one icon occupy more than one element

The writer assumed an icon is a single element, which the colour and mask
types break: their alpha lives in an element of its own. Building a list of
elements per icon also retires the cached header each type carried.

</content>
</entry>
<entry>
<id>6d8994a7f3fa99bfa83d24d9455802673f00f08a</id>
<published>2026-09-18T20:09:30Z</published>
<updated>2026-09-18T20:09:30Z</updated>
<title type="text">icns: decode the legacy colour and mask icon types</title>
<link rel="alternate" type="text/html" href="commit/6d8994a7f3fa99bfa83d24d9455802673f00f08a.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 6d8994a7f3fa99bfa83d24d9455802673f00f08a
parent 0438531d4191fa06d4c1174ee2eaa194e7692fdf
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:30 -0400

icns: decode the legacy colour and mask icon types

Icons written before 10.5, and the small sizes Apple still writes today, hold
run-length encoded colour planes with alpha in a separate mask element. The
decoder skipped them, so a 16px icon was invisible and older files looked
empty. Verified against an Apple-produced file.

</content>
</entry>
<entry>
<id>0438531d4191fa06d4c1174ee2eaa194e7692fdf</id>
<published>2026-09-18T20:09:30Z</published>
<updated>2026-09-18T20:09:30Z</updated>
<title type="text">icns: size the icon set from the types it will write</title>
<link rel="alternate" type="text/html" href="commit/0438531d4191fa06d4c1174ee2eaa194e7692fdf.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 0438531d4191fa06d4c1174ee2eaa194e7692fdf
parent 4dbe1cc82123fc38af868c5d65e4fec1b626637c
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:30 -0400

icns: size the icon set from the types it will write

The result slice was sized by the whole type table, so any size the source
could not fill left a nil hole for the writer to skip, and a running index
had to be threaded through the goroutines. Building the list first makes the
slice exact.

</content>
</entry>
<entry>
<id>4dbe1cc82123fc38af868c5d65e4fec1b626637c</id>
<published>2026-09-18T20:09:30Z</published>
<updated>2026-09-18T20:09:30Z</updated>
<title type="text">build: let dependabot watch every module</title>
<link rel="alternate" type="text/html" href="commit/4dbe1cc82123fc38af868c5d65e4fec1b626637c.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 4dbe1cc82123fc38af868c5d65e4fec1b626637c
parent 9870ba9c4ab2b3324227fea545421c1b71351c77
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:30 -0400

build: let dependabot watch every module

Only the root module was configured, so the command modules&#39; dependencies
went unwatched; the x/image advisory in preview sat open because of it.
Grouping the golang.org/x updates keeps them to one pull request instead of
one per module.

</content>
</entry>
<entry>
<id>9870ba9c4ab2b3324227fea545421c1b71351c77</id>
<published>2026-09-18T20:09:29Z</published>
<updated>2026-09-18T20:09:29Z</updated>
<title type="text">build: test, fuzz and scan every module in CI</title>
<link rel="alternate" type="text/html" href="commit/9870ba9c4ab2b3324227fea545421c1b71351c77.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 9870ba9c4ab2b3324227fea545421c1b71351c77
parent c1aa75c9b82939d71eee82fc9ccb83cc20752147
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:29 -0400

build: test, fuzz and scan every module in CI

The only workflow published to winget on release, so nothing verified a
commit. Three modules, two of them platform bound, cannot all be built on one
machine, and the decoder parses untrusted files, which is worth fuzzing on
every change rather than by hand.

</content>
</entry>
<entry>
<id>c1aa75c9b82939d71eee82fc9ccb83cc20752147</id>
<published>2026-09-18T20:09:29Z</published>
<updated>2026-09-18T20:09:29Z</updated>
<title type="text">icns: capture loop variables directly in the encoder</title>
<link rel="alternate" type="text/html" href="commit/c1aa75c9b82939d71eee82fc9ccb83cc20752147.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit c1aa75c9b82939d71eee82fc9ccb83cc20752147
parent cff759cb543a1f59edfad29eba0d57274c35e59b
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:29 -0400

icns: capture loop variables directly in the encoder

The goroutine took copies of its loop variables through parameters, which Go
1.22 made unnecessary when it gave each iteration its own. The inner list also
shadowed the package-level osTypes that sizes the result slice two lines
above it.

</content>
</entry>
<entry>
<id>cff759cb543a1f59edfad29eba0d57274c35e59b</id>
<published>2026-09-18T20:09:29Z</published>
<updated>2026-09-18T20:09:29Z</updated>
<title type="text">icns: build element headers with encoding/binary</title>
<link rel="alternate" type="text/html" href="commit/cff759cb543a1f59edfad29eba0d57274c35e59b.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit cff759cb543a1f59edfad29eba0d57274c35e59b
parent cb4307b7502e9bfa91daae633b6d9212bf1385eb
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:29 -0400

icns: build element headers with encoding/binary

The package carried its own big-endian writer and copied the type field a
byte at a time, which the standard library and copy already do. Sharing
elementHeaderSize with the decoder keeps the encoder&#39;s idea of a header from
drifting from the parser&#39;s.

</content>
</entry>
<entry>
<id>cb4307b7502e9bfa91daae633b6d9212bf1385eb</id>
<published>2026-09-18T20:09:28Z</published>
<updated>2026-09-18T20:09:28Z</updated>
<title type="text">icns: take the interpolation function in resizeSquare</title>
<link rel="alternate" type="text/html" href="commit/cb4307b7502e9bfa91daae633b6d9212bf1385eb.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit cb4307b7502e9bfa91daae633b6d9212bf1385eb
parent 06d845a483030377bf2d2479f88974809f9a87bf
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:28 -0400

icns: take the interpolation function in resizeSquare

Call sites had to reach for the unexported scaler before calling the helper,
spreading the choice of resampler across the encoder for no gain. Selecting
it is a switch over package-level kernels, so doing that per icon rather than
once costs nothing.

</content>
</entry>
<entry>
<id>06d845a483030377bf2d2479f88974809f9a87bf</id>
<published>2026-09-18T20:09:28Z</published>
<updated>2026-09-18T20:09:28Z</updated>
<title type="text">all: keep doc comments to what the code does</title>
<link rel="alternate" type="text/html" href="commit/06d845a483030377bf2d2479f88974809f9a87bf.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 06d845a483030377bf2d2479f88974809f9a87bf
parent 6b7ce7385c6260292c5f241d189b302439b2aff0
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:28 -0400

all: keep doc comments to what the code does

Several comments argued for the code against alternatives it does not use, or
recorded what a change replaced. That rationale belongs in the commit that
made the change, where it stays accurate; in a doc comment it reads as review
notes and goes stale.

</content>
</entry>
<entry>
<id>6b7ce7385c6260292c5f241d189b302439b2aff0</id>
<published>2026-09-18T20:09:28Z</published>
<updated>2026-09-18T20:09:28Z</updated>
<title type="text">cmd/shell-extension: resample with x/image/draw</title>
<link rel="alternate" type="text/html" href="commit/6b7ce7385c6260292c5f241d189b302439b2aff0.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 6b7ce7385c6260292c5f241d189b302439b2aff0
parent d6caefcda1131a84358e50aae17ed893b49fdd9a
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:28 -0400

cmd/shell-extension: resample with x/image/draw

The thumbnail path was the last caller of the archived nfnt/resize, and
matching the library&#39;s resampler keeps one filter behaviour across the repo.
It lingers as an indirect dependency because the published v4.0.0 library
still requires it; the next library tag drops it.

</content>
</entry>
<entry>
<id>d6caefcda1131a84358e50aae17ed893b49fdd9a</id>
<published>2026-09-18T20:09:27Z</published>
<updated>2026-09-18T20:09:27Z</updated>
<title type="text">icns: resample with x/image/draw instead of nfnt/resize</title>
<link rel="alternate" type="text/html" href="commit/d6caefcda1131a84358e50aae17ed893b49fdd9a.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit d6caefcda1131a84358e50aae17ed893b49fdd9a
parent bc979c7cfe88f1a680eaf1ebeca33001ffcfcbaf
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:27 -0400

icns: resample with x/image/draw instead of nfnt/resize

nfnt/resize was archived in 2018 and filters in straight alpha, haloing
downscaled icons by dragging colour out of transparent pixels. x/image/draw
filters premultiplied. InterpolationFunction stops aliasing the old library&#39;s
type, so callers passing its constants must switch to this package&#39;s.

</content>
</entry>
<entry>
<id>bc979c7cfe88f1a680eaf1ebeca33001ffcfcbaf</id>
<published>2026-09-18T20:09:14Z</published>
<updated>2026-09-18T20:09:14Z</updated>
<title type="text">icns: skip resampling when the source is already icon-sized</title>
<link rel="alternate" type="text/html" href="commit/bc979c7cfe88f1a680eaf1ebeca33001ffcfcbaf.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit bc979c7cfe88f1a680eaf1ebeca33001ffcfcbaf
parent b2ca62f253e992b378f1dda924377798ea0428ba
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri, 18 Sep 2026 16:09:14 -0400

icns: skip resampling when the source is already icon-sized

The encoder resampled even when the source matched the icon size exactly,
which is the common case for the largest icon and the most expensive one to
compute. Passing it through keeps that icon identical to the source and drops
the encoder&#39;s slowest operation.

</content>
</entry>
<entry>
<id>b2ca62f253e992b378f1dda924377798ea0428ba</id>
<published>2026-09-17T15:55:52Z</published>
<updated>2026-09-17T15:55:52Z</updated>
<title type="text">cmd: record icns v4.0.0 in the command modules&#39; go.sum</title>
<link rel="alternate" type="text/html" href="commit/b2ca62f253e992b378f1dda924377798ea0428ba.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit b2ca62f253e992b378f1dda924377798ea0428ba
parent 837e875b4288649db869f8a9754d40b494ccccb8
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Thu, 17 Sep 2026 11:55:52 -0400

cmd: record icns v4.0.0 in the command modules&#39; go.sum

Inside the workspace the library is built from source and needs no checksum,
but go install of preview or the shell extension from outside the checkout
verifies the module&#39;s own go.sum, which still listed only v3 entries. Tidying
against the published tag makes those installs work.

</content>
</entry>
<entry>
<id>837e875b4288649db869f8a9754d40b494ccccb8</id>
<published>2026-09-17T15:55:35Z</published>
<updated>2026-09-17T15:55:35Z</updated>
<title type="text">build: drop the go.work replace now that v4.0.0 is published</title>
<link rel="alternate" type="text/html" href="commit/837e875b4288649db869f8a9754d40b494ccccb8.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 837e875b4288649db869f8a9754d40b494ccccb8
parent 8129feb383c4d21a59dd37b2453e43e6d8bd943a
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Thu, 17 Sep 2026 11:55:35 -0400

build: drop the go.work replace now that v4.0.0 is published

The version-specific replace existed only because workspace mode fetches the
go.mod of a required version, which failed while v4.0.0 was untagged. The tag
is on the proxy now, so the workspace resolves it on its own and the extra
indirection would only confuse readers.

</content>
</entry>
<entry>
<id>8129feb383c4d21a59dd37b2453e43e6d8bd943a</id>
<published>2026-09-17T12:14:28Z</published>
<updated>2026-09-17T12:14:28Z</updated>
<title type="text">docs: give the GOWORK override as a PowerShell command</title>
<link rel="alternate" type="text/html" href="commit/8129feb383c4d21a59dd37b2453e43e6d8bd943a.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 8129feb383c4d21a59dd37b2453e43e6d8bd943a
parent df50af1add048523cb133e042942308f0a49c318
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Thu, 17 Sep 2026 08:14:28 -0400

docs: give the GOWORK override as a PowerShell command

The prose said &quot;with GOWORK=off&quot;, which readers on Windows translate to
cmd&#39;s set syntax; that keeps a trailing space in the value and Go rejects
it as an invalid path. Spell out the form that works.

</content>
</entry>
<entry>
<id>df50af1add048523cb133e042942308f0a49c318</id>
<published>2026-09-17T12:14:21Z</published>
<updated>2026-09-17T12:14:21Z</updated>
<title type="text">all: fold the old master line into the history</title>
<link rel="alternate" type="text/html" href="commit/df50af1add048523cb133e042942308f0a49c318.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit df50af1add048523cb133e042942308f0a49c318
parent 2ef5d8986afe812b9ce7bfb02cdf750d969a02a6
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Thu, 17 Sep 2026 08:14:21 -0400

all: fold the old master line into the history

The repository is moving from one branch per major version to a single main
branch with tags. master carried two releases, v2.2.8 and v2.3.0, and
experiments that v4 has since superseded; merging it with the ours strategy
keeps those tags reachable without reviving any of its content.

</content>
</entry>
<entry>
<id>2ef5d8986afe812b9ce7bfb02cdf750d969a02a6</id>
<published>2026-09-17T11:31:54Z</published>
<updated>2026-09-17T11:31:54Z</updated>
<title type="text">docs: name each module when testing the workspace</title>
<link rel="alternate" type="text/html" href="commit/2ef5d8986afe812b9ce7bfb02cdf750d969a02a6.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 2ef5d8986afe812b9ce7bfb02cdf750d969a02a6
parent bde1f4becb27779504bf3a986dbb62254606c0f0
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Thu, 17 Sep 2026 07:31:54 -0400

docs: name each module when testing the workspace

The previous wording claimed ./... spans every module in workspace mode. It
does not: the pattern only matches the module containing the current
directory, so a reader following it would silently skip preview and the
shell extension.

</content>
</entry>
<entry>
<id>bde1f4becb27779504bf3a986dbb62254606c0f0</id>
<published>2026-09-17T11:30:04Z</published>
<updated>2026-09-17T11:30:04Z</updated>
<title type="text">docs: describe the v4 layout, install paths and release steps</title>
<link rel="alternate" type="text/html" href="commit/bde1f4becb27779504bf3a986dbb62254606c0f0.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit bde1f4becb27779504bf3a986dbb62254606c0f0
parent 14a023c8dac08b8b8955b927c68b96047f8c65e0
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Thu, 17 Sep 2026 07:30:04 -0400

docs: describe the v4 layout, install paths and release steps

The module path and the icnsify install path both changed with v4, and the
workspace, the versioned replace and the per-module tidy after tagging are
not discoverable from the code. Readers also had no pointer to the Explorer
thumbnail extension.

</content>
</entry>
<entry>
<id>14a023c8dac08b8b8955b927c68b96047f8c65e0</id>
<published>2026-09-17T11:30:03Z</published>
<updated>2026-09-17T11:30:03Z</updated>
<title type="text">build: ignore compiled binaries</title>
<link rel="alternate" type="text/html" href="commit/14a023c8dac08b8b8955b927c68b96047f8c65e0.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 14a023c8dac08b8b8955b927c68b96047f8c65e0
parent 1059a2eee8cc33bb07c7ad1b0d6e1c0cc941e468
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Thu, 17 Sep 2026 07:30:03 -0400

build: ignore compiled binaries

A stray icnsify.exe from a local build was nearly committed alongside a
module change. Executables, DLLs and test binaries are never source, so
ignore them at the root rather than relying on each directory to remember.

</content>
</entry>
<entry>
<id>1059a2eee8cc33bb07c7ad1b0d6e1c0cc941e468</id>
<published>2026-09-17T01:44:45Z</published>
<updated>2026-09-17T11:29:06Z</updated>
<title type="text">cmd/icnsify: fold into the root module</title>
<link rel="alternate" type="text/html" href="commit/1059a2eee8cc33bb07c7ad1b0d6e1c0cc941e468.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 1059a2eee8cc33bb07c7ad1b0d6e1c0cc941e468
parent dba92d5ad3f0a327a0859aa9761b55ca6c7ec4f2
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:44:45 -0400

cmd/icnsify: fold into the root module

As a separate module the CLI pinned a published library version, so fixes
reached it only after a tag and a manual bump, and every release took two
steps. Sharing the library module versions both with a single tag and lets
go install track it directly.

</content>
</entry>
<entry>
<id>dba92d5ad3f0a327a0859aa9761b55ca6c7ec4f2</id>
<published>2026-09-17T01:44:44Z</published>
<updated>2026-09-17T11:29:05Z</updated>
<title type="text">cmd/icnsify: use the standard flag package</title>
<link rel="alternate" type="text/html" href="commit/dba92d5ad3f0a327a0859aa9761b55ca6c7ec4f2.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit dba92d5ad3f0a327a0859aa9761b55ca6c7ec4f2
parent 3b4821d79893d224c913cde00ad30af47ed11431
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:44:44 -0400

cmd/icnsify: use the standard flag package

pflag is small, but once the CLI shares the library&#39;s module every dependency
appears in library consumers&#39; module graphs. The standard package already
accepts both -input and --input, and registering a short alias per option
preserves the existing -i, -o and -r spellings.

</content>
</entry>
<entry>
<id>3b4821d79893d224c913cde00ad30af47ed11431</id>
<published>2026-09-17T01:44:43Z</published>
<updated>2026-09-17T11:29:05Z</updated>
<title type="text">cmd/icnsify: use the os package instead of afero</title>
<link rel="alternate" type="text/html" href="commit/3b4821d79893d224c913cde00ad30af47ed11431.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 3b4821d79893d224c913cde00ad30af47ed11431
parent 0c0aad7db9158bdb75e4d2f22297746205abda52
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:44:43 -0400

cmd/icnsify: use the os package instead of afero

afero was only ever used with the real filesystem, yet it pulls Google Cloud
Storage, gRPC and protobuf into the module graph. Removing it is a
precondition for folding the CLI into the library module without burdening
every library consumer with those dependencies.

</content>
</entry>
<entry>
<id>0c0aad7db9158bdb75e4d2f22297746205abda52</id>
<published>2026-09-17T11:28:54Z</published>
<updated>2026-09-17T11:28:54Z</updated>
<title type="text">icns: move the module to v4</title>
<link rel="alternate" type="text/html" href="commit/0c0aad7db9158bdb75e4d2f22297746205abda52.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 0c0aad7db9158bdb75e4d2f22297746205abda52
parent f2cd459c1a8ed591c97139361baf64e1e9046fa3
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Thu, 17 Sep 2026 07:28:54 -0400

icns: move the module to v4

Folding the CLI into the library module changes its import path, and the
decoder now returns sentinel errors and a different Decode result for JPEG
2000-only files, both breaking for existing callers. A new major version
leaves v3 users untouched; the in-repo commands follow the working tree
through the workspace.

</content>
</entry>
<entry>
<id>f2cd459c1a8ed591c97139361baf64e1e9046fa3</id>
<published>2026-09-17T01:39:21Z</published>
<updated>2026-09-17T01:39:21Z</updated>
<title type="text">build: add a go.work spanning the modules</title>
<link rel="alternate" type="text/html" href="commit/f2cd459c1a8ed591c97139361baf64e1e9046fa3.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit f2cd459c1a8ed591c97139361baf64e1e9046fa3
parent 715ac90bc6d971cd067eebf509b8f700abae0f7a
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:39:21 -0400

build: add a go.work spanning the modules

The library and its three commands are separate modules, so a library change
was invisible to the commands, and to gopls, until a tag was published and
each pin bumped. A committed workspace lets every build in the checkout use
the working-tree library while consumers, who never see go.work, are
unaffected.

</content>
</entry>
<entry>
<id>715ac90bc6d971cd067eebf509b8f700abae0f7a</id>
<published>2026-09-17T01:30:10Z</published>
<updated>2026-09-17T01:30:10Z</updated>
<title type="text">cmd/icnsify: exit non-zero on failure and detect pipes reliably</title>
<link rel="alternate" type="text/html" href="commit/715ac90bc6d971cd067eebf509b8f700abae0f7a.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 715ac90bc6d971cd067eebf509b8f700abae0f7a
parent 3a017757b6e880fb4b863f992151b745a9d157b0
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:30:10 -0400

cmd/icnsify: exit non-zero on failure and detect pipes reliably

Every error path returned from main with status 0, so scripts could not tell
a failed conversion from a success. Pipe detection keyed on stdin&#39;s current
size, which is zero before the producer writes; checking for a terminal is
stable. An explicit --input now wins over a redirected stdin.

</content>
</entry>
<entry>
<id>3a017757b6e880fb4b863f992151b745a9d157b0</id>
<published>2026-09-17T01:30:08Z</published>
<updated>2026-09-17T01:30:08Z</updated>
<title type="text">cmd/preview: fix save-as extension and icon list reset</title>
<link rel="alternate" type="text/html" href="commit/3a017757b6e880fb4b863f992151b745a9d157b0.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 3a017757b6e880fb4b863f992151b745a9d157b0
parent 53d39543b3cee4c17ba904b72fe1a74b6cbfad5c
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:30:08 -0400

cmd/preview: fix save-as extension and icon list reset

UseExt ignored its argument and always produced .icns, and the icon list was
never cleared between files, so opening a second icns appended its sizes to
the first. Both were latent since the GUI was written.

</content>
</entry>
<entry>
<id>53d39543b3cee4c17ba904b72fe1a74b6cbfad5c</id>
<published>2026-09-17T01:30:06Z</published>
<updated>2026-09-17T01:30:06Z</updated>
<title type="text">shell-extension: recover from panics in COM callbacks</title>
<link rel="alternate" type="text/html" href="commit/53d39543b3cee4c17ba904b72fe1a74b6cbfad5c.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 53d39543b3cee4c17ba904b72fe1a74b6cbfad5c
parent a7df5a07b57d08fb4bf8a2b34a88030bd14382fb
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:30:06 -0400

shell-extension: recover from panics in COM callbacks

A Go panic escaping a syscall.NewCallback trampoline unwinds through C frames
and kills the host, which in per-user mode is explorer.exe. Malformed files or
GDI failures must instead surface to the shell as E_FAIL, so every entry point
and method body now runs under a recovering guard.

</content>
</entry>
<entry>
<id>a7df5a07b57d08fb4bf8a2b34a88030bd14382fb</id>
<published>2026-09-17T01:30:04Z</published>
<updated>2026-09-17T01:30:04Z</updated>
<title type="text">icns: make tests assert what they claim</title>
<link rel="alternate" type="text/html" href="commit/a7df5a07b57d08fb4bf8a2b34a88030bd14382fb.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit a7df5a07b57d08fb4bf8a2b34a88030bd14382fb
parent 816e624c745694df4f3f7aa74b78b7211e394d84
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:30:04 -0400

icns: make tests assert what they claim

TestEncode never checked that an expected error occurred, imageCompare read
one pixel past the edge, and TestDecode compared all-zero images so any blank
output passed. A gradient source and a real encode/decode roundtrip close the
long-open &quot;symmetric test&quot; roadmap item.

</content>
</entry>
<entry>
<id>816e624c745694df4f3f7aa74b78b7211e394d84</id>
<published>2026-09-17T01:30:03Z</published>
<updated>2026-09-17T01:30:03Z</updated>
<title type="text">icns: measure images by their dimensions, not their bounds</title>
<link rel="alternate" type="text/html" href="commit/816e624c745694df4f3f7aa74b78b7211e394d84.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 816e624c745694df4f3f7aa74b78b7211e394d84
parent 38c96fa1f43944821a92515e958111ca72d1df56
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:30:03 -0400

icns: measure images by their dimensions, not their bounds

An image whose bounds do not start at the origin, such as a SubImage,
reported its far corner as its size. That selected too large an icon tier and
upscaled the source, and the too-small error printed the wrong dimensions.

</content>
</entry>
<entry>
<id>38c96fa1f43944821a92515e958111ca72d1df56</id>
<published>2026-09-17T01:30:02Z</published>
<updated>2026-09-17T01:30:02Z</updated>
<title type="text">icns: fall back to a decodable icon in Decode</title>
<link rel="alternate" type="text/html" href="commit/38c96fa1f43944821a92515e958111ca72d1df56.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 38c96fa1f43944821a92515e958111ca72d1df56
parent d35ce8131530787cff96cf044faf4e4deaf6f9b4
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:30:02 -0400

icns: fall back to a decodable icon in Decode

Decode failed outright when the largest icon was JPEG 2000 while DecodeAll
quietly skipped such icons, so the same file decoded through one entry point
and not the other. Returning the largest icon we can actually decode makes
the two agree.

</content>
</entry>
<entry>
<id>d35ce8131530787cff96cf044faf4e4deaf6f9b4</id>
<published>2026-09-17T01:30:01Z</published>
<updated>2026-09-17T01:30:01Z</updated>
<title type="text">icns: reject malformed elements in the decoder</title>
<link rel="alternate" type="text/html" href="commit/d35ce8131530787cff96cf044faf4e4deaf6f9b4.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit d35ce8131530787cff96cf044faf4e4deaf6f9b4
parent 5678c31a0d211d4124dc9b1b3bb73d7aae8c0bbf
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:30:01 -0400

icns: reject malformed elements in the decoder

Element lengths were trusted, so a truncated file panicked with an
out-of-range slice and a zero-length TOC entry underflowed the cursor and
looped forever. Anything decoding untrusted files, the CLI and the Explorer
thumbnail handler included, inherited those crashes. Sentinel errors let
callers tell corruption from unsupported content.

</content>
</entry>
<entry>
<id>5678c31a0d211d4124dc9b1b3bb73d7aae8c0bbf</id>
<published>2026-09-17T01:08:01Z</published>
<updated>2026-09-17T01:08:01Z</updated>
<title type="text">shell-extension: document build, install modes and diagnostics</title>
<link rel="alternate" type="text/html" href="commit/5678c31a0d211d4124dc9b1b3bb73d7aae8c0bbf.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 5678c31a0d211d4124dc9b1b3bb73d7aae8c0bbf
parent 536736c665f3b035a74adb0be439ea6958612180
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:08:01 -0400

shell-extension: document build, install modes and diagnostics

The build needs mingw, and registration behaves differently per-user versus
machine-wide, none of which is discoverable from the code. Build outputs are
ignored so the DLL never lands in a commit.

</content>
</entry>
<entry>
<id>536736c665f3b035a74adb0be439ea6958612180</id>
<published>2026-09-17T01:08:00Z</published>
<updated>2026-09-17T01:08:00Z</updated>
<title type="text">shell-extension: test the DLL through raw COM vtables</title>
<link rel="alternate" type="text/html" href="commit/536736c665f3b035a74adb0be439ea6958612180.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 536736c665f3b035a74adb0be439ea6958612180
parent 4de769625599ccca8463373d2f4e0f9dc79a6b47
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:08:00 -0400

shell-extension: test the DLL through raw COM vtables

The shell reveals a broken handler only as a missing thumbnail, so failures need
reproducing without Explorer. Driving the built DLL through its raw vtables
catches refcount, identity and pixel-format mistakes early; the optional shell
test confirms registration on a real machine.

</content>
</entry>
<entry>
<id>4de769625599ccca8463373d2f4e0f9dc79a6b47</id>
<published>2026-09-17T01:08:00Z</published>
<updated>2026-09-17T01:08:00Z</updated>
<title type="text">shell-extension: export COM entry points and registry setup</title>
<link rel="alternate" type="text/html" href="commit/4de769625599ccca8463373d2f4e0f9dc79a6b47.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 4de769625599ccca8463373d2f4e0f9dc79a6b47
parent 6c97db1dd87b541c807e0ea69b11e37c4bea5fbd
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:08:00 -0400

shell-extension: export COM entry points and registry setup

A COM DLL is useless until COM can find it. These exports are what the shell and
regsvr32 call, plus the registry writes binding .icns to the CLSID. The isolated
thumbnail surrogate ignores per-user CLSIDs, so per-user registration hosts the
provider inside Explorer instead.

</content>
</entry>
<entry>
<id>6c97db1dd87b541c807e0ea69b11e37c4bea5fbd</id>
<published>2026-09-17T01:08:00Z</published>
<updated>2026-09-17T01:08:00Z</updated>
<title type="text">shell-extension: add icns thumbnail provider COM object</title>
<link rel="alternate" type="text/html" href="commit/6c97db1dd87b541c807e0ea69b11e37c4bea5fbd.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 6c97db1dd87b541c807e0ea69b11e37c4bea5fbd
parent 75c992cdb1b087fe9ca0d6aa62ec435fcf05eacc
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:08:00 -0400

shell-extension: add icns thumbnail provider COM object

Explorer only recognises thumbnail handlers exposing IInitializeWithStream and
IThumbnailProvider, and the shell holds the sole pointers to each instance. The
object is laid out so both interface pointers alias one Go struct, stays pinned
while referenced, and returns the premultiplied BGRA bitmap the shell expects.

</content>
</entry>
<entry>
<id>75c992cdb1b087fe9ca0d6aa62ec435fcf05eacc</id>
<published>2026-09-17T01:08:00Z</published>
<updated>2026-09-17T01:08:00Z</updated>
<title type="text">shell-extension: add COM primitives for a Go in-process server</title>
<link rel="alternate" type="text/html" href="commit/75c992cdb1b087fe9ca0d6aa62ec435fcf05eacc.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 75c992cdb1b087fe9ca0d6aa62ec435fcf05eacc
parent 32962dfc3ed6f6df86fe891db422252f2e53ceb6
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Wed, 16 Sep 2026 21:08:00 -0400

shell-extension: add COM primitives for a Go in-process server

Explorer thumbnail handlers are COM objects loaded into a host process, and the
goal is a handler with no C code. Nothing in the standard library describes
vtables, class factories or IStream, so this package defines the minimum an
in-process Go COM server needs.

</content>
</entry>
<entry>
<id>32962dfc3ed6f6df86fe891db422252f2e53ceb6</id>
<published>2024-10-29T04:24:56Z</published>
<updated>2024-10-29T04:24:56Z</updated>
<title type="text">go.*: update icns version</title>
<link rel="alternate" type="text/html" href="commit/32962dfc3ed6f6df86fe891db422252f2e53ceb6.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 32962dfc3ed6f6df86fe891db422252f2e53ceb6
parent 6c3229d7041a49bb68f54c7d151a5fd196844b0e
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Tue, 29 Oct 2024 12:24:56 +0800

go.*: update icns version

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>6c3229d7041a49bb68f54c7d151a5fd196844b0e</id>
<published>2024-10-29T04:12:36Z</published>
<updated>2024-10-29T04:12:36Z</updated>
<title type="text">icns.Decode{All}: explicitly error on unsupported formats</title>
<link rel="alternate" type="text/html" href="commit/6c3229d7041a49bb68f54c7d151a5fd196844b0e.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 6c3229d7041a49bb68f54c7d151a5fd196844b0e
parent 439e61a508660c5e2b595d9458bfd9489faf06fb
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Tue, 29 Oct 2024 12:12:36 +0800

icns.Decode{All}: explicitly error on unsupported formats

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>439e61a508660c5e2b595d9458bfd9489faf06fb</id>
<published>2024-10-29T04:10:22Z</published>
<updated>2024-10-29T04:10:22Z</updated>
<title type="text">cmd/icnsify: probe icns prior to decode</title>
<link rel="alternate" type="text/html" href="commit/439e61a508660c5e2b595d9458bfd9489faf06fb.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 439e61a508660c5e2b595d9458bfd9489faf06fb
parent 5519ecdd0cf713a5d9d8288ea5cea4e6d987a511
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Tue, 29 Oct 2024 12:10:22 +0800

cmd/icnsify: probe icns prior to decode

Output the content of the icns prior to decode. This will help explain
any issues to caller by revealing unsupported file types.

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>5519ecdd0cf713a5d9d8288ea5cea4e6d987a511</id>
<published>2024-10-29T04:09:35Z</published>
<updated>2024-10-29T04:09:35Z</updated>
<title type="text">cmd/icnsify: use slog instead of log</title>
<link rel="alternate" type="text/html" href="commit/5519ecdd0cf713a5d9d8288ea5cea4e6d987a511.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 5519ecdd0cf713a5d9d8288ea5cea4e6d987a511
parent 8b1e856b793f39f70fca4763c08ad568a2641f31
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Tue, 29 Oct 2024 12:09:35 +0800

cmd/icnsify: use slog instead of log

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>8b1e856b793f39f70fca4763c08ad568a2641f31</id>
<published>2024-10-29T04:08:59Z</published>
<updated>2024-10-29T04:08:59Z</updated>
<title type="text">icns.Probe: allow probing for icons</title>
<link rel="alternate" type="text/html" href="commit/8b1e856b793f39f70fca4763c08ad568a2641f31.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 8b1e856b793f39f70fca4763c08ad568a2641f31
parent b2a5cbd896caf2321b9ef1dfe1368876bfaa6e2b
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Tue, 29 Oct 2024 12:08:59 +0800

icns.Probe: allow probing for icons

This allows the caller to list all the icons found, regardless of
support for the icon. This can help diagnose issues and clarify why an
icns file cannot be decoded.

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>b2a5cbd896caf2321b9ef1dfe1368876bfaa6e2b</id>
<published>2024-10-29T04:07:04Z</published>
<updated>2024-10-29T04:07:04Z</updated>
<title type="text">icns.IconDescription: describe each icon (without icon data)</title>
<link rel="alternate" type="text/html" href="commit/b2a5cbd896caf2321b9ef1dfe1368876bfaa6e2b.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit b2a5cbd896caf2321b9ef1dfe1368876bfaa6e2b
parent 0161855a44415f21c7d8969d701c3ebeb6aaabef
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Tue, 29 Oct 2024 12:07:04 +0800

icns.IconDescription: describe each icon (without icon data)

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>0161855a44415f21c7d8969d701c3ebeb6aaabef</id>
<published>2024-10-29T03:22:24Z</published>
<updated>2024-10-29T03:22:30Z</updated>
<title type="text">icns.ImageFormat: enumerate expected image formats</title>
<link rel="alternate" type="text/html" href="commit/0161855a44415f21c7d8969d701c3ebeb6aaabef.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 0161855a44415f21c7d8969d701c3ebeb6aaabef
parent e0231ee9f2a56f813b950ae48d16329135df9e77
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Tue, 29 Oct 2024 11:22:24 +0800

icns.ImageFormat: enumerate expected image formats

We don&#39;t support JPEG 2000, but we want to explicitly handle it for the
purpose of error reporting.

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>e0231ee9f2a56f813b950ae48d16329135df9e77</id>
<published>2024-10-29T02:58:12Z</published>
<updated>2024-10-29T02:58:12Z</updated>
<title type="text">cmd/icnsify: use octal for file permission</title>
<link rel="alternate" type="text/html" href="commit/e0231ee9f2a56f813b950ae48d16329135df9e77.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit e0231ee9f2a56f813b950ae48d16329135df9e77
parent 142a10ad965afea6bb3beaf1e3efc4dd0ab0d610
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Tue, 29 Oct 2024 10:58:12 +0800

cmd/icnsify: use octal for file permission

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>142a10ad965afea6bb3beaf1e3efc4dd0ab0d610</id>
<published>2024-10-29T02:14:25Z</published>
<updated>2024-10-29T02:14:25Z</updated>
<title type="text">icns.sizesFrom: omit second index in slice</title>
<link rel="alternate" type="text/html" href="commit/142a10ad965afea6bb3beaf1e3efc4dd0ab0d610.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 142a10ad965afea6bb3beaf1e3efc4dd0ab0d610
parent 887a11b796668020f14e22191ded6be8767d2639
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Tue, 29 Oct 2024 10:14:25 +0800

icns.sizesFrom: omit second index in slice

Linter recommendation.

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>887a11b796668020f14e22191ded6be8767d2639</id>
<published>2024-10-29T02:13:19Z</published>
<updated>2024-10-29T02:13:56Z</updated>
<title type="text">icns: delete panicf (unused)</title>
<link rel="alternate" type="text/html" href="commit/887a11b796668020f14e22191ded6be8767d2639.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit 887a11b796668020f14e22191ded6be8767d2639
parent ec1a78510e218aec046708effefda4d90b5ecd8c
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Tue, 29 Oct 2024 10:13:19 +0800

icns: delete panicf (unused)

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>ec1a78510e218aec046708effefda4d90b5ecd8c</id>
<published>2024-10-29T02:12:30Z</published>
<updated>2024-10-29T02:13:53Z</updated>
<title type="text">icns: remove use of deprecated ioutil</title>
<link rel="alternate" type="text/html" href="commit/ec1a78510e218aec046708effefda4d90b5ecd8c.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit ec1a78510e218aec046708effefda4d90b5ecd8c
parent fc8699534bd85cf23bbce098bce8d768adca85f6
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Tue, 29 Oct 2024 10:12:30 +0800

icns: remove use of deprecated ioutil

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>fc8699534bd85cf23bbce098bce8d768adca85f6</id>
<published>2023-12-08T03:38:10Z</published>
<updated>2023-12-08T03:38:10Z</updated>
<title type="text">docs: update install commands</title>
<link rel="alternate" type="text/html" href="commit/fc8699534bd85cf23bbce098bce8d768adca85f6.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit fc8699534bd85cf23bbce098bce8d768adca85f6
parent b6b3df994924f27113bbe468ed8de407e961cc97
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri,  8 Dec 2023 11:38:10 +0800

docs: update install commands

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
<entry>
<id>b6b3df994924f27113bbe468ed8de407e961cc97</id>
<published>2023-12-08T02:12:49Z</published>
<updated>2023-12-08T02:24:01Z</updated>
<title type="text">all: restructure into separate modules</title>
<link rel="alternate" type="text/html" href="commit/b6b3df994924f27113bbe468ed8de407e961cc97.html" />
<author>
<name>Jack Mordaunt</name>
<email>jackmordaunt.dev@gmail.com</email>
</author>
<content type="text">commit b6b3df994924f27113bbe468ed8de407e961cc97
parent 8f29e4ad6ef6e7db9b4b834bce158331ea22b33b
Author: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;
Date:   Fri,  8 Dec 2023 10:12:49 +0800

all: restructure into separate modules

This allows each command to be go installed separately.

Signed-off-by: Jack Mordaunt &lt;jackmordaunt.dev@gmail.com&gt;

</content>
</entry>
</feed>
