From bfc59c784f767a0d04d0ae132b0734d4b028eb52 Mon Sep 17 00:00:00 2001 From: Xus Badia Date: Fri, 9 Oct 2026 05:11:00 +0200 Subject: [PATCH] macOS DMG: branded window background and icon layout (#1201) The DMG opens on a 660x400 Finder window with the PhotoCraft artwork, 128 pt icons and the Applications link beside the app. packaging/macos/dmg/ holds the SVG source, a reproducible generator, an 87 KB HiDPI palette TIFF (was 1.0 MB) and the .DS_Store layout. The volume is named "PhotoCraft" (the background alias resolves by volume name); the DMG file name keeps the version. Co-Authored-By: Claude Opus 5.5 --- .gitignore | 1 + ATTRIBUTION.md | 1 + docs/releasing.md | 3 + packaging/macos/dmg/README.md | 44 +++++++ packaging/macos/dmg/background.svg | 28 +++++ packaging/macos/dmg/background.tiff | Bin 0 -> 87456 bytes packaging/macos/dmg/dmg-layout.DS_Store | Bin 0 -> 16388 bytes packaging/macos/dmg/generate.py | 158 ++++++++++++++++++++++++ packaging/macos/package.sh | 7 +- 9 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 packaging/macos/dmg/README.md create mode 100644 packaging/macos/dmg/background.svg create mode 100644 packaging/macos/dmg/background.tiff create mode 100644 packaging/macos/dmg/dmg-layout.DS_Store create mode 100644 packaging/macos/dmg/generate.py diff --git a/.gitignore b/.gitignore index 99cf666151..f310f32921 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ target/ /book/output /craft-fonts *.log +__pycache__/ diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index 9cdf9aa6e0..22a4c60916 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -26,6 +26,7 @@ next to them. | `assets/dict/en_US-scowl-50.txt.gz` | English word list for Check Spelling (SCOWL 2020.12.07, size 50, en_US; 72,403 words) | Kevin Atkinson and the SCOWL contributors | | SCOWL license (permissive, keep the notice), [`assets/dict/LICENSE-SCOWL.txt`](assets/dict/LICENSE-SCOWL.txt), which also has the build recipe | | `crates/cms/profiles/photocraft-coated-cmyk.icc` | PhotoCraft Coated CMYK (synthetic) ICC profile | PhotoCraft contributors (generated by `photocraft-cms`, `src/synth.rs`) | Original work, see [`crates/cms/README.md`](crates/cms/README.md) | CC0-1.0 | | `assets/app-icon/` (all files) | PhotoCraft app icon (nine-tailed kitsune) | The project owner (drawn in ArtCraft, vectorised) | Original work, see [`assets/app-icon/README.md`](assets/app-icon/README.md) | MIT OR Apache-2.0, [`assets/app-icon/LICENSE.txt`](assets/app-icon/LICENSE.txt) | +| `packaging/macos/dmg/` (all files) | PhotoCraft DMG window background and layout | @XusBadia, from the PhotoCraft app icon | Original work, see [`packaging/macos/dmg/README.md`](packaging/macos/dmg/README.md) | MIT OR Apache-2.0, like the code | ### Optional build input: craft-fonts (not files in this repo) diff --git a/docs/releasing.md b/docs/releasing.md index 1122b5251c..3e67c7b549 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -85,6 +85,9 @@ in `ci.yml`. Rules: `../craftrules/standards/fonts.md`; build option: `docs/deve ticket is stapled to the app. The app goes on a DMG (`hdiutil`, with an `Applications` link to drag onto). The DMG is signed, notarized and stapled too. The script checks the results with `codesign --verify --strict`, `stapler validate` and `spctl -a -vvv`. + Its Finder window (background, icon size and positions) comes from + [`packaging/macos/dmg/`](../packaging/macos/dmg/README.md), and its volume is named `PhotoCraft` + without the version, which the window's background needs; the DMG file name keeps the version. - **CLI:** the universal `photocraft-cli` is signed with the same Developer ID, the hardened runtime and a secure timestamp (identifier `ai.storyteller.photocraft-cli`), zipped, and the zip is sent to `notarytool`. Only `.app`, `.dmg` and `.pkg` can hold a stapled ticket, not a bare diff --git a/packaging/macos/dmg/README.md b/packaging/macos/dmg/README.md new file mode 100644 index 0000000000..0cdb20a915 --- /dev/null +++ b/packaging/macos/dmg/README.md @@ -0,0 +1,44 @@ +# macOS DMG window + +What Finder shows when the DMG opens: a 660 × 400 pt background with the app icon and the +`Applications` link side by side. `package.sh` copies these files into the image; nothing here is +generated at build time, so the DMG still builds with `hdiutil makehybrid` (no mounted device, no +Finder scripting on CI, nothing extra installed in the signing job). + +| File | What | +|---|---| +| `background.svg` | Source of the background: the app icon (`assets/app-icon/photocraft-small.svg`, linked, not copied) cropped as a cover on the PhotoCraft colour field (`#2f7bf5`), Ink and Paper. Its text (Inter, JetBrains Mono) is outlined, so rendering it needs no fonts. | +| `background.tiff` | The background at 1x (660 × 400 px, 72 dpi) and 2x (1320 × 800 px, 144 dpi) in one HiDPI TIFF (16-colour palette, Deflate, sRGB; about 90 KB). Goes to `.background/background.tiff`. | +| `dmg-layout.DS_Store` | Finder's view settings for the volume: window size, icon size 128, PhotoCraft.app at (326, 205), `Applications` at (574, 205), and the background. Goes to `.DS_Store` in the image; named so it isn't mistaken for (or ignored like) a Finder-generated `.DS_Store`. | +| `generate.py` | Writes `background.tiff` and `dmg-layout.DS_Store` from the SVG and the layout above. | + +## The volume name has no version + +The mounted volume is called `PhotoCraft`, not `PhotoCraft `. The layout points at the background +through an alias that includes the volume name, and Finder resolves it by that name: with a +versioned name the window keeps its size and icon positions but shows no background (tested). +The DMG file name (`photocraft--macos-.dmg`) still carries the version. + +## Rules + +- **Finder draws the icon labels in black in light and dark mode** when a window has a background, + so the area under both icons stays light (Paper). +- **Nothing goes inside the icon boxes:** artwork keeps 10 pt clear of each 128 pt icon box and of + the label strip under it. + +## Regenerate + +Edit `background.svg` (or the layout constants in `generate.py`), then run, on any OS: + +```sh +pip install 'pillow>=12' ds_store==1.3.3 mac_alias==2.2.3 +python3 packaging/macos/dmg/generate.py # needs resvg on PATH +``` + +Both outputs are byte-for-byte reproducible and carry nothing from the machine that ran it: the +SVG renders without any fonts, and `dmg-layout.DS_Store` is written from scratch, its background +alias holding only the volume name and `/.background/background.tiff`. If you add text to the SVG, +outline it (`usvg` from resvg converts text to paths). The window is 660 × 432 with Finder's 32 pt +title bar; the content area is 660 × 400. + +This follows VectorCraft's `packaging/macos/dmg/` (storytold/vectorcraft#493). diff --git a/packaging/macos/dmg/background.svg b/packaging/macos/dmg/background.svg new file mode 100644 index 0000000000..d93ae37c5e --- /dev/null +++ b/packaging/macos/dmg/background.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packaging/macos/dmg/background.tiff b/packaging/macos/dmg/background.tiff new file mode 100644 index 0000000000000000000000000000000000000000..d9d675c6b2b802f800645dad02a8e50cf4d51972 GIT binary patch literal 87456 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
S7ULEXJq@yW!p2rclX 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

W_I8REP8b(xqagD7kZ{<4OQyC1R`;d1Yc&Xr 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 literal 0 HcmV?d00001 diff --git a/packaging/macos/dmg/generate.py b/packaging/macos/dmg/generate.py new file mode 100644 index 0000000000..be6c7ed59c --- /dev/null +++ b/packaging/macos/dmg/generate.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 +"""Regenerate background.tiff and dmg-layout.DS_Store for the macOS DMG window (see README.md here). + +Needs resvg on PATH and: + pip install 'pillow>=12' ds_store==1.3.3 mac_alias==2.2.3 + +Runs on any OS, no Mac needed. Both outputs come from this script alone, so they carry nothing +from the machine that made them: no local paths, user or disk names, dates or volume UUIDs. + + python3 packaging/macos/dmg/generate.py +""" + +import datetime +import os +import shutil +import subprocess +import sys +import tempfile + +from ds_store import DSStore +from mac_alias import Alias, TargetInfo, VolumeInfo +from PIL import Image, ImageCms + +HERE = os.path.dirname(os.path.abspath(__file__)) + +# Keep in sync with package.sh (volume name) and README.md (layout). +VOLUME = "PhotoCraft" +WIDTH, HEIGHT = 660, 400 # window content, pt; the background's 1x size +TITLE_BAR = 32 +ICON_SIZE = 128 +PALETTE = 16 # colours in background.tiff +ICONS = {"PhotoCraft.app": (326, 205), "Applications": (574, 205)} +# A fixed date for the alias and the colour profile. Finder never matches it against the image +# (each build is a new volume): it finds the background by volume name and path. +FIXED_DATE = datetime.datetime(2026, 10, 8, tzinfo=datetime.timezone.utc) + + +def render(svg, width, out): + # The SVG's text is already outlined and no fonts are loaded, so every machine draws the + # same pixels. + subprocess.run( + ["resvg", "--skip-system-fonts", "-w", str(width), svg, out], + check=True, + ) + with Image.open(out) as im: + return im.convert("RGB") + + +def quantize(im): + # No dithering: dither noise compresses badly and the artwork has flat fills. + return im.quantize(PALETTE, method=Image.Quantize.FASTOCTREE, dither=Image.Dither.NONE) + + +def srgb_profile(): + # LittleCMS's built-in sRGB ("No copyright, use freely"), with its creation date fixed. + icc = bytearray(ImageCms.ImageCmsProfile(ImageCms.createProfile("sRGB")).tobytes()) + d = FIXED_DATE + icc[24:36] = b"".join(v.to_bytes(2, "big") for v in (d.year, d.month, d.day, 0, 0, 0)) + if icc[84:100] != bytes(16): + sys.exit("error: the sRGB profile has an ID; recompute it after fixing the date") + return bytes(icc) + + +def write_tiff(svg, out): + """1x (72 dpi) and 2x (144 dpi) in one TIFF, as `tiffutil -cathidpicheck` writes them.""" + with tempfile.TemporaryDirectory() as tmp: + one, two = ( + quantize(render(svg, WIDTH * s, os.path.join(tmp, f"{s}x.png"))) for s in (1, 2) + ) + two.encoderinfo = {"dpi": (144, 144)} # the rest as the first page + # Opaque 16-colour palette, Deflate: the artwork is three inks plus antialiasing, and a palette + # keeps the file under ~90 KB (RGB was ~200 KB; repository assets must stay small). + one.save( + out, + "TIFF", + save_all=True, + append_images=[two], + compression="tiff_adobe_deflate", # brand-ok: Pillow's name for TIFF compression 8 (Deflate) + dpi=(72, 72), + icc_profile=srgb_profile(), + ) + with Image.open(out) as im: + im.seek(1) + if im.info.get("dpi") != (144, 144): + sys.exit("error: the 2x page isn't 144 dpi (needs Pillow 12 or later)") + strips = [] + for page in (0, 1): + im.seek(page) + strips += zip(im.tag_v2[273], im.tag_v2[279]) # StripOffsets, StripByteCounts + # TIFF keeps directories and tag data on even offsets. When a strip ends on an odd one, libtiff + # leaves the padding byte after it uninitialised, so the file changed from run to run with + # identical pixels. Zero it: nothing refers to that byte. + starts = {o for o, _ in strips} + with open(out, "r+b") as f: + for o, n in strips: + if (o + n) % 2 and o + n not in starts: + f.seek(o + n) + f.write(bytes(1)) + + +def background_alias(): + # What Finder stores for /.background/background.tiff on the volume, minus anything about the + # machine (dmgbuild writes the same kind of alias from a mounted image). Disk type 5 (ejectable), + # the volume flags and the folder/file ids (25, 26) are what Finder wrote on a test image; the ids + # are only hints, as the volume's creation date. + volume = VolumeInfo(VOLUME, FIXED_DATE, b"H+", 5, 0x0D02, b"\0\0") + volume.posix_path = f"/Volumes/{VOLUME}" + target = TargetInfo(0, "background.tiff", 25, 26, FIXED_DATE, b"\0\0\0\0", b"\0\0\0\0") + target.folder_name = ".background" + target.cnid_path = [25] + target.carbon_path = f"{VOLUME}:.background:\0background.tiff" + target.posix_path = "/.background/background.tiff" + return Alias(volume=volume, target=target).to_bytes() + + +def write_ds_store(out): + if os.path.exists(out): + os.remove(out) + with DSStore.open(out, "w+") as d: + d["."]["bwsp"] = { + "ShowStatusBar": False, + "ShowToolbar": False, + "ShowTabView": False, + "ContainerShowSidebar": False, + "ShowSidebar": False, + "WindowBounds": f"{{{{200, 528}}, {{{WIDTH}, {HEIGHT + TITLE_BAR}}}}}", + } + d["."]["icvp"] = { + "viewOptionsVersion": 1, + "backgroundType": 2, + "backgroundImageAlias": background_alias(), + "backgroundColorRed": 1.0, + "backgroundColorGreen": 1.0, + "backgroundColorBlue": 1.0, + "gridOffsetX": 0.0, + "gridOffsetY": 0.0, + "gridSpacing": 100.0, + "arrangeBy": "none", + "showIconPreview": True, + "showItemInfo": False, + "labelOnBottom": True, + "textSize": 16.0, + "iconSize": float(ICON_SIZE), + } + d["."]["vSrn"] = ("long", 1) + for name, pos in ICONS.items(): + d[name]["Iloc"] = pos + + +def main(): + if not shutil.which("resvg"): + sys.exit("error: resvg not found (brew install resvg / cargo install resvg --locked)") + write_tiff(os.path.join(HERE, "background.svg"), os.path.join(HERE, "background.tiff")) + write_ds_store(os.path.join(HERE, "dmg-layout.DS_Store")) + + +if __name__ == "__main__": + main() diff --git a/packaging/macos/package.sh b/packaging/macos/package.sh index b94ca50687..194b379293 100755 --- a/packaging/macos/package.sh +++ b/packaging/macos/package.sh @@ -134,10 +134,15 @@ STAGE="$WORK/dmg" mkdir -p "$STAGE" ditto "$APP" "$STAGE/PhotoCraft.app" ln -s /Applications "$STAGE/Applications" +# Finder window layout: background, icon size and positions (packaging/macos/dmg/README.md). +mkdir -p "$STAGE/.background" +cp "$HERE/dmg/background.tiff" "$STAGE/.background/background.tiff" +cp "$HERE/dmg/dmg-layout.DS_Store" "$STAGE/.DS_Store" rm -f "$DMG" "$WORK/raw.dmg" # makehybrid + convert builds the image without attaching a device, unlike `create -srcfolder`, # which is flaky on CI runners ("Resource busy") and hangs in sandboxed sessions. -hdiutil makehybrid -hfs -hfs-volume-name "PhotoCraft $VERSION" -hfs-openfolder "$STAGE" -o "$WORK/raw.dmg" "$STAGE" +# The volume name has no version: .DS_Store finds the background through an alias that includes it. +hdiutil makehybrid -hfs -hfs-volume-name "PhotoCraft" -hfs-openfolder "$STAGE" -o "$WORK/raw.dmg" "$STAGE" hdiutil convert "$WORK/raw.dmg" -format UDZO -imagekey zlib-level=9 -o "$DMG" rm -f "$WORK/raw.dmg" sign "$DMG"