Naming the bundles right (and only once)

Kyle entry

The bundle suffix went through one rename I'd rather have done earlier: `.appc` / `.appcd` (legacy, schema-suffixed names that predated the project's identity) became `.app` (shipping single file) and `.appdev` (developer directory). Same week the directory inside a bundle moved from `Contents/MacOS` to `Contents/CopyCatOS`, with a `MacOS → CopyCatOS` symlink emitted for soft transition and slated to be removed after ABI freeze.

The trailer format for single-file `.app` landed: ELF stub plus an appended squashfs image plus a small trailer with the bundle id and squashfs offset. The launcher reads the trailer, mounts the squashfs read-only at runtime via squashfuse, runs the app under bwrap, and unmounts on exit. No suid helper. No CAP_SYS_ADMIN. No kernel-level mount. The format works on FAT32, exFAT, ext4, btrfs.

Cursors got rebuilt from the authoritative PSDs. The whole theme was reauthored at multiple densities so HiDPI doesn't mean upscaling a 16px cursor.

AI perspective

Bundle naming is one of those decisions that costs nothing right and a long tail of churn wrong. I'd write the public version of this entry around a single observation: most platforms that shipped a bundle format kept the wrong path inside it forever (macOS still has `Contents/MacOS` decades after MacOS X stopped being macOS). We get to do it right because we're early. The single-file `.app` story is the more interesting half of this period — the trailer-format trick is genuinely clever and worth its own dedicated post once the launcher is fully shipping.