From 1f1ddb2a47055d9c266902bfcb088fe59bc69615 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Thu, 1 Oct 2026 13:25:17 -0400 Subject: [PATCH] Release pipeline id renames and PhotoCraft branding - Lowercase reverse-DNS id ai.storyteller.photocraft across icons, Linux desktop/metainfo/mime/flatpak, Windows WiX, macOS Info.plist and workflows. - PhotoCraft display name in the title bar, start screen, web loader, Windows exe metadata, README and docs. - .gitignore target/, roadmap refresh. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/packaging-lint.yml | 10 ++-- .github/workflows/release.yml | 11 ++-- .gitignore | 1 + AGENTS.md | 4 +- README.md | 14 ++--- apps/photocraft-web/index.html | 4 +- apps/photocraft-web/src/web.rs | 2 +- apps/photocraft/build.rs | 6 +-- ...raft.png => ai.storyteller.photocraft.png} | Bin ...raft.png => ai.storyteller.photocraft.png} | Bin ...raft.png => ai.storyteller.photocraft.png} | Bin ...raft.png => ai.storyteller.photocraft.png} | Bin ...raft.png => ai.storyteller.photocraft.png} | Bin ...raft.png => ai.storyteller.photocraft.png} | Bin ...raft.png => ai.storyteller.photocraft.png} | Bin ...raft.png => ai.storyteller.photocraft.png} | Bin ...raft.svg => ai.storyteller.photocraft.svg} | 0 crates/ui-egui/src/canvas.rs | 2 +- crates/ui-egui/src/panels.rs | 2 +- docs/release-playbook.md | 48 ++++++++---------- docs/releasing.md | 36 +++++++------ docs/roadmap.md | 26 ++++++---- packaging/icons.sh | 4 +- ...ktop => ai.storyteller.photocraft.desktop} | 4 +- ...ai.storyteller.photocraft.metainfo.xml.in} | 10 ++-- ...xml => ai.storyteller.photocraft.mime.xml} | 4 +- ...raft.yml => ai.storyteller.photocraft.yml} | 14 ++--- packaging/linux/package.sh | 30 +++++------ packaging/macos/Info.plist.in | 22 ++++---- packaging/macos/import-cert.sh | 4 +- packaging/macos/package.sh | 31 ++++++----- packaging/web/README.md | 8 +-- packaging/windows/package.ps1 | 16 +++--- .../{Photocraft.wxs => photocraft.wxs} | 28 +++++----- packaging/windows/sign.ps1 | 2 +- 35 files changed, 177 insertions(+), 166 deletions(-) rename assets/app-icon/hicolor/128x128/apps/{ai.storyteller.Photocraft.png => ai.storyteller.photocraft.png} (100%) rename assets/app-icon/hicolor/16x16/apps/{ai.storyteller.Photocraft.png => ai.storyteller.photocraft.png} (100%) rename assets/app-icon/hicolor/24x24/apps/{ai.storyteller.Photocraft.png => ai.storyteller.photocraft.png} (100%) rename assets/app-icon/hicolor/256x256/apps/{ai.storyteller.Photocraft.png => ai.storyteller.photocraft.png} (100%) rename assets/app-icon/hicolor/32x32/apps/{ai.storyteller.Photocraft.png => ai.storyteller.photocraft.png} (100%) rename assets/app-icon/hicolor/48x48/apps/{ai.storyteller.Photocraft.png => ai.storyteller.photocraft.png} (100%) rename assets/app-icon/hicolor/512x512/apps/{ai.storyteller.Photocraft.png => ai.storyteller.photocraft.png} (100%) rename assets/app-icon/hicolor/64x64/apps/{ai.storyteller.Photocraft.png => ai.storyteller.photocraft.png} (100%) rename assets/app-icon/hicolor/scalable/apps/{ai.storyteller.Photocraft.svg => ai.storyteller.photocraft.svg} (100%) rename packaging/linux/{ai.storyteller.Photocraft.desktop => ai.storyteller.photocraft.desktop} (93%) rename packaging/linux/{ai.storyteller.Photocraft.metainfo.xml.in => ai.storyteller.photocraft.metainfo.xml.in} (91%) rename packaging/linux/{ai.storyteller.Photocraft.mime.xml => ai.storyteller.photocraft.mime.xml} (91%) rename packaging/linux/flatpak/{ai.storyteller.Photocraft.yml => ai.storyteller.photocraft.yml} (76%) rename packaging/windows/{Photocraft.wxs => photocraft.wxs} (91%) diff --git a/.github/workflows/packaging-lint.yml b/.github/workflows/packaging-lint.yml index e527e73f85..05b09c2242 100644 --- a/.github/workflows/packaging-lint.yml +++ b/.github/workflows/packaging-lint.yml @@ -46,8 +46,8 @@ jobs: } - name: XML, desktop entry, AppStream, Flatpak manifest run: | - xmllint --noout packaging/windows/Photocraft.wxs packaging/macos/*.plist* packaging/linux/*.xml* - desktop-file-validate packaging/linux/ai.storyteller.Photocraft.desktop - sed -e 's/@VERSION@/0.0.0/' -e 's/@DATE@/2026-01-01/' packaging/linux/ai.storyteller.Photocraft.metainfo.xml.in >"$RUNNER_TEMP/ai.storyteller.Photocraft.metainfo.xml" - appstreamcli validate --no-net --explain "$RUNNER_TEMP/ai.storyteller.Photocraft.metainfo.xml" - python3 -c "import yaml; m = yaml.safe_load(open('packaging/linux/flatpak/ai.storyteller.Photocraft.yml')); assert m['id'] == 'ai.storyteller.Photocraft' and m['command'] == 'photocraft'" + xmllint --noout packaging/windows/photocraft.wxs packaging/macos/*.plist* packaging/linux/*.xml* + desktop-file-validate packaging/linux/ai.storyteller.photocraft.desktop + sed -e 's/@VERSION@/0.0.0/' -e 's/@DATE@/2026-01-01/' packaging/linux/ai.storyteller.photocraft.metainfo.xml.in >"$RUNNER_TEMP/ai.storyteller.photocraft.metainfo.xml" + appstreamcli validate --no-net --explain "$RUNNER_TEMP/ai.storyteller.photocraft.metainfo.xml" + python3 -c "import yaml; m = yaml.safe_load(open('packaging/linux/flatpak/ai.storyteller.photocraft.yml')); assert m['id'] == 'ai.storyteller.photocraft' and m['command'] == 'photocraft'" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 644b90e90f..065094f381 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,5 +1,5 @@ # Release pipeline: every push to `release` builds signed installers for every platform and -# creates or updates the draft GitHub Release "Photocraft v". See docs/releasing.md. +# creates or updates the draft GitHub Release "PhotoCraft v". See docs/releasing.md. # # All jobs run in the `release` environment (restricted to the `release` branch), which holds # the signing secrets. Every secret is optional: missing ones produce unsigned artifacts and a @@ -21,7 +21,8 @@ permissions: concurrency: group: release-${{ github.ref }} - cancel-in-progress: true + # Never cancel a run mid-notarization or mid-upload; a newer push waits its turn. + cancel-in-progress: false env: CARGO_TERM_COLOR: always @@ -57,7 +58,7 @@ jobs: echo "date=$(date -u +%Y-%m-%d)" echo "prerelease=$pre" } >>"$GITHUB_OUTPUT" - echo "### Photocraft v$v (\`${GITHUB_SHA::9}\`)" >>"$GITHUB_STEP_SUMMARY" + echo "### PhotoCraft v$v (\`${GITHUB_SHA::9}\`)" >>"$GITHUB_STEP_SUMMARY" macos: name: macOS universal @@ -189,7 +190,7 @@ jobs: dpkg-deb --info dist/release/*.deb dpkg-deb --contents dist/release/*.deb | grep -E 'usr/bin/photocraft$|metainfo|applications' ldd target/release/photocraft - python3 -c "import yaml; m = yaml.safe_load(open('packaging/linux/flatpak/ai.storyteller.Photocraft.yml')); assert m['id'] == 'ai.storyteller.Photocraft'" + python3 -c "import yaml; m = yaml.safe_load(open('packaging/linux/flatpak/ai.storyteller.photocraft.yml')); assert m['id'] == 'ai.storyteller.photocraft'" for appimage in dist/release/*.AppImage; do chmod +x "$appimage" APPIMAGE_EXTRACT_AND_RUN=1 "$appimage" --version @@ -259,7 +260,7 @@ jobs: working-directory: artifacts run: | tag="v$VERSION" - title="Photocraft v$VERSION" + title="PhotoCraft v$VERSION" pre=() if [ "$PRERELEASE" = true ]; then pre=(--prerelease); fi if draft="$(gh release view "$tag" --json isDraft --jq .isDraft 2>/dev/null)"; then diff --git a/.gitignore b/.gitignore index 34089cab52..f71f1685e5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *~ plan/ /target +target/ /dist /corpus /log diff --git a/AGENTS.md b/AGENTS.md index cc07eac0ce..f4f5c07cee 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS.md: guide for AI agents and contributors -PhotoCraft is an open-source, native, Photoshop-comparable image editor written in **Rust only** (no JavaScript or TypeScript). The product name is always written **PhotoCraft** (PascalCase, like its siblings DrawCraft, FilmCraft, LightCraft, PrintCraft, DesignCraft, EffectsCraft, ArtCraft) in user-facing text: UI, window titles, About, installers, release names, docs prose. Machine names stay lowercase: crates (`photocraft-*`), binaries, file names, ids (`ai.storyteller.photocraft`). The goal is 1:1 Photoshop parity (same menus, shortcuts, behaviour and file fidelity) with better performance, and every feature drivable by agents. Read this file first, then `docs/`. +PhotoCraft is an open-source, native, Photoshop-comparable image editor written in **Rust only** (no JavaScript or TypeScript). The product name is always written **PhotoCraft** (`{Function}Craft` in PascalCase, like its siblings ArtCraft, ArtCraftX, DesignCraft, DrawCraft, EffectCraft, FilmCraft, LightCraft, PrintCraft) in user-facing text: UI, window titles, About, installers, release names, docs prose. Machine names stay lowercase: crates (`photocraft-*`), binaries, file names, ids (`ai.storyteller.photocraft`). Standards and learnings shared across the crafting apps live in `../craftrules` (read its `README.md`). Contribute reusable learnings there, never code; repos don't share code. The goal is 1:1 Photoshop parity (same menus, shortcuts, behaviour and file fidelity) with better performance, and every feature drivable by agents. Read this file first, then `docs/`. ## 1. Orientation (5 minutes) @@ -83,7 +83,7 @@ Then append a terse entry to `log/devlog.md` (what landed, numbers, what's still - `docs/roadmap.md`: milestones M0–M12, status and the current focus. - `docs/parity.md`: generated Photoshop menu coverage. - `docs/releasing.md`: cutting a release (`cargo xtask version`, the `release` branch), signing secrets, packaging scripts in `packaging/`. -- `docs/release-playbook.md`: how every storytold app builds signed release binaries (shared across photocraft, drawcraft, filmcraft, lightcraft, printcraft, designcraft, effectscraft); `docs/releasing.md` is Photocraft's specifics. +- `docs/release-playbook.md`: how every storytold app builds signed release binaries (the recipe for every crafting app; moving to `craftrules/release/playbook.md`); `docs/releasing.md` is Photocraft's specifics. - `plan/` (local, gitignored): research, parity plan, execution plan, estimates. - `log/` (local, gitignored): the dev log. diff --git a/README.md b/README.md index 077b937e19..5aa501d35e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

📷 Photocraft

+

📷 PhotoCraft

The image editor you already know how to use.
@@ -23,7 +23,7 @@

- Photocraft editing Hokusai's The Great Wave: a caption card with a drop shadow, type layers, Vibrance and Curves adjustment layers, and the Curves editor with its histogram + PhotoCraft editing Hokusai's The Great Wave: a caption card with a drop shadow, type layers, Vibrance and Curves adjustment layers, and the Curves editor with its histogram
The Great Wave off Kanagawa, Katsushika Hokusai, c. 1831

@@ -34,7 +34,7 @@

🎛️ Familiar by design

- The menus, shortcuts, panels and tools are where your hands expect them, from ⌘J to ⇧⌘D. If you know Photoshop, you already know Photocraft. + The menus, shortcuts, panels and tools are where your hands expect them, from ⌘J to ⇧⌘D. If you know Photoshop, you already know PhotoCraft.

⚡ Native and fast

@@ -189,7 +189,7 @@ ## PSD without compromise -Photocraft's PSD support is a standalone crate written from Adobe's public specification and tested against a corpus of real-world files. +PhotoCraft's PSD support is a standalone crate written from Adobe's public specification and tested against a corpus of real-world files. - **Byte-exact round trips:** 134 of 135 corpus files are written back identical, and anything we don't model yet (raw blocks, descriptors, extras) is preserved verbatim instead of being dropped. - **Pixels that match:** a composite oracle compares our render with Photoshop's own merged image, covering gradient interpolation (Classic, Perceptual and Linear), layer effects, shape strokes, clipping and fill opacity. @@ -222,7 +222,7 @@ The desktop app also listens on a local control channel (`photocraft --control`) - **Copy-on-write tiles:** 256² sparse tiles make undo cheap and huge canvases light, and effect maps are cached per layer state. - **Runs in the browser:** the whole engine and UI compile to WebAssembly. - **Clean-room:** implemented from public specs and observed behaviour only. No proprietary code, shaders or assets. -- **Tested:** more than 1,600 tests, including PSD round trips, synthetic generators, compositor oracles and multi-depth checks. +- **Tested:** more than 1,700 tests, including PSD round trips, synthetic generators, compositor oracles and multi-depth checks. ## Get started @@ -237,7 +237,7 @@ New contributors and AI agents: start with [`AGENTS.md`](AGENTS.md), then [`docs Installers for macOS, Windows, Linux and the web are attached to each [GitHub release](https://github.com/storytold/photocraft/releases). Maintainers: [`docs/releasing.md`](docs/releasing.md) explains how releases are built, signed and published. -> **Status:** Photocraft is in early alpha. The core editing workflow is here, and we're working toward full Photoshop parity milestone by milestone (see [`docs/roadmap.md`](docs/roadmap.md)). Progress is measured, not guessed: `cargo xtask parity` checks every item in Photoshop's menu tree against the live command registry and writes [`docs/parity.md`](docs/parity.md). Expect rough edges, and please file issues. +> **Status:** PhotoCraft is in early alpha. The core editing workflow is here, and we're working toward full Photoshop parity milestone by milestone (see [`docs/roadmap.md`](docs/roadmap.md)). Progress is measured, not guessed: `cargo xtask parity` checks every item in Photoshop's menu tree against the live command registry and writes [`docs/parity.md`](docs/parity.md). Expect rough edges, and please file issues. ## Crafting Apps @@ -273,5 +273,5 @@ Open-source, clean-room, pure-Rust creative apps that share the same conventions

Built by the artcraft team. Licensed under MIT or Apache-2.0.
Every artwork shown is in the public domain (Wikimedia Commons, NASA, U.S. National Archives); sources are listed in docs/images/SOURCES.md.
- Photoshop is a trademark of Adobe Inc. Photocraft is an independent project, not affiliated with or endorsed by Adobe. + Photoshop is a trademark of Adobe Inc. PhotoCraft is an independent project, not affiliated with or endorsed by Adobe.

diff --git a/apps/photocraft-web/index.html b/apps/photocraft-web/index.html index f97088ecc8..befbd88034 100644 --- a/apps/photocraft-web/index.html +++ b/apps/photocraft-web/index.html @@ -3,7 +3,7 @@ - Photocraft + PhotoCraft