From ec2d51a17a4cacc6b2907c875879f85ba895eed3 Mon Sep 17 00:00:00 2001
From: "Dylan M. Taylor"
Date: Wed, 21 Oct 2026 13:55:18 -0400
Subject: [PATCH 1/7] ci: add SonarCloud scan workflow and config
---
sonar-project.properties | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 sonar-project.properties
diff --git a/sonar-project.properties b/sonar-project.properties
new file mode 100644
index 000000000..66faf29c3
--- /dev/null
+++ b/sonar-project.properties
@@ -0,0 +1,4 @@
+sonar.projectKey=storytold_craft-launcher
+sonar.organization=storytold
+sonar.sources=.
+sonar.exclusions=**/target/**,**/vendor/**,**/node_modules/**,**/*.min.js,**/dist/**,**/assets/**,**/docs/**
From 26b40199b72121aa7f4e55a63718e1b4dd48a859 Mon Sep 17 00:00:00 2001
From: Brandon Thomas
Date: Wed, 21 Oct 2026 14:04:43 -0400
Subject: [PATCH 2/7] Release 0.14.0
FreeBSD aarch64: build with 16 codegen units and no LTO in the emulated release VM, which ran past
the job's 5-hour limit with the single-unit thin-LTO profile.
Co-Authored-By: Claude Opus 5.5
---
Cargo.lock | 72 ++++++++++++++++++------------------
Cargo.toml | 2 +-
packaging/freebsd/package.sh | 8 ++++
3 files changed, 45 insertions(+), 37 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index ee9c99cf2..2cd7ed3a0 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1163,7 +1163,7 @@ dependencies = [
[[package]]
name = "effectcraft"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"cpal",
"effectcraft-engine",
@@ -1188,7 +1188,7 @@ dependencies = [
[[package]]
name = "effectcraft-automation"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-engine",
"effectcraft-host",
@@ -1200,14 +1200,14 @@ dependencies = [
[[package]]
name = "effectcraft-av1enc"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"filmcraft-av1",
]
[[package]]
name = "effectcraft-cli"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"cpu-time",
"effectcraft-automation",
@@ -1223,7 +1223,7 @@ dependencies = [
[[package]]
name = "effectcraft-color"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"proptest",
"serde",
@@ -1231,7 +1231,7 @@ dependencies = [
[[package]]
name = "effectcraft-effects"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-color",
"effectcraft-geom",
@@ -1248,7 +1248,7 @@ dependencies = [
[[package]]
name = "effectcraft-engine"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"craft-docpath",
"effectcraft-color",
@@ -1282,7 +1282,7 @@ dependencies = [
[[package]]
name = "effectcraft-export"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-av1enc",
"effectcraft-color",
@@ -1312,7 +1312,7 @@ dependencies = [
[[package]]
name = "effectcraft-expr"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"boa_engine",
"effectcraft-color",
@@ -1329,7 +1329,7 @@ dependencies = [
[[package]]
name = "effectcraft-geom"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"proptest",
"serde",
@@ -1337,7 +1337,7 @@ dependencies = [
[[package]]
name = "effectcraft-gpu"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"bytemuck",
"effectcraft-color",
@@ -1359,14 +1359,14 @@ dependencies = [
[[package]]
name = "effectcraft-hevcenc"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"filmcraft-hevc",
]
[[package]]
name = "effectcraft-host"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-engine",
"effectcraft-export",
@@ -1391,7 +1391,7 @@ dependencies = [
[[package]]
name = "effectcraft-interchange"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-color",
"effectcraft-keyframe",
@@ -1410,7 +1410,7 @@ dependencies = [
[[package]]
name = "effectcraft-keyframe"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-color",
"effectcraft-geom",
@@ -1422,7 +1422,7 @@ dependencies = [
[[package]]
name = "effectcraft-lottie"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"craft-docpath",
"effectcraft-color",
@@ -1440,7 +1440,7 @@ dependencies = [
[[package]]
name = "effectcraft-media"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"craft-docpath",
"effectcraft-model",
@@ -1469,7 +1469,7 @@ dependencies = [
[[package]]
name = "effectcraft-model"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-geom",
"image",
@@ -1481,14 +1481,14 @@ dependencies = [
[[package]]
name = "effectcraft-opusenc"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"filmcraft-opus",
]
[[package]]
name = "effectcraft-path"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-geom",
"effectcraft-keyframe",
@@ -1500,7 +1500,7 @@ dependencies = [
[[package]]
name = "effectcraft-pdf"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"craft-pdf",
"effectcraft-raster",
@@ -1516,7 +1516,7 @@ dependencies = [
[[package]]
name = "effectcraft-plugin"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-effects",
"effectcraft-keyframe",
@@ -1528,7 +1528,7 @@ dependencies = [
[[package]]
name = "effectcraft-project"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-color",
"effectcraft-geom",
@@ -1541,14 +1541,14 @@ dependencies = [
[[package]]
name = "effectcraft-psd"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"miniz_oxide 0.8.9",
]
[[package]]
name = "effectcraft-raster"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-color",
"effectcraft-geom",
@@ -1557,7 +1557,7 @@ dependencies = [
[[package]]
name = "effectcraft-render"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-color",
"effectcraft-effects",
@@ -1579,7 +1579,7 @@ dependencies = [
[[package]]
name = "effectcraft-script"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"boa_engine",
"effectcraft-engine",
@@ -1596,7 +1596,7 @@ dependencies = [
[[package]]
name = "effectcraft-segment"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"miniz_oxide 0.8.9",
"ndarray",
@@ -1605,7 +1605,7 @@ dependencies = [
[[package]]
name = "effectcraft-svg"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-geom",
"effectcraft-path",
@@ -1617,7 +1617,7 @@ dependencies = [
[[package]]
name = "effectcraft-text"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-keyframe",
"harfrust",
@@ -1629,7 +1629,7 @@ dependencies = [
[[package]]
name = "effectcraft-time"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"proptest",
"serde",
@@ -1637,7 +1637,7 @@ dependencies = [
[[package]]
name = "effectcraft-track"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-raster",
"effectcraft-segment",
@@ -1649,7 +1649,7 @@ dependencies = [
[[package]]
name = "effectcraft-ui-egui"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"craft-ui",
"effectcraft-color",
@@ -1681,11 +1681,11 @@ dependencies = [
[[package]]
name = "effectcraft-vp9enc"
-version = "0.13.0"
+version = "0.14.0"
[[package]]
name = "effectcraft-web"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-engine",
"effectcraft-export",
@@ -6625,7 +6625,7 @@ checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7"
[[package]]
name = "xtask"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"serde_json",
]
diff --git a/Cargo.toml b/Cargo.toml
index 8c6f978ef..eecbbc7e3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,7 +4,7 @@ members = ["crates/*", "apps/*", "xtask"]
default-members = ["crates/*", "apps/*"]
[workspace.package]
-version = "0.13.0"
+version = "0.14.0"
edition = "2024"
license = "MIT OR Apache-2.0"
rust-version = "1.95"
diff --git a/packaging/freebsd/package.sh b/packaging/freebsd/package.sh
index 236c464a6..7418dd85a 100755
--- a/packaging/freebsd/package.sh
+++ b/packaging/freebsd/package.sh
@@ -46,6 +46,14 @@ echo "==> EffectCraft $VERSION for FreeBSD $ARCH"
# The release VM has 12 GB; full parallelism on the biggest crates runs it out of memory.
export CARGO_BUILD_JOBS="${CARGO_BUILD_JOBS:-4}"
+# The aarch64 release VM is emulated (no rustup toolchain for this tier-3 target, so it builds
+# natively under QEMU). With one codegen unit and thin LTO the largest crates each optimize on a
+# single emulated core and the job runs past its 5-hour limit, so trade a little runtime speed for
+# parallel codegen there. x86_64 keeps the workspace's release profile.
+if [ "$ARCH" = aarch64 ]; then
+ export CARGO_PROFILE_RELEASE_CODEGEN_UNITS="${CARGO_PROFILE_RELEASE_CODEGEN_UNITS:-16}"
+ export CARGO_PROFILE_RELEASE_LTO="${CARGO_PROFILE_RELEASE_LTO:-off}"
+fi
if [ "$SKIP_BUILD" = 0 ]; then
(cd "$ROOT" && cargo build --release --locked -p effectcraft -p effectcraft-cli)
fi
From 714b6c29b02716dbd64ff02bd132998fa9e2600f Mon Sep 17 00:00:00 2001
From: "Dylan M. Taylor"
Date: Wed, 21 Oct 2026 15:46:55 -0400
Subject: [PATCH 3/7] ci: add SonarCloud scan via shared reusable workflow
Calls storytold/craft-common-actions/.github/workflows/sonarcloud.yml@main
with secrets: inherit. Adds SonarCloud badge to README where missing and
removes the redundant sonar-project.properties (config now passed by the
reusable workflow).
---
.github/workflows/sonarcloud.yml | 20 ++++++++++++++++++++
sonar-project.properties | 4 ----
2 files changed, 20 insertions(+), 4 deletions(-)
create mode 100644 .github/workflows/sonarcloud.yml
delete mode 100644 sonar-project.properties
diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml
new file mode 100644
index 000000000..ecee45a6d
--- /dev/null
+++ b/.github/workflows/sonarcloud.yml
@@ -0,0 +1,20 @@
+name: SonarCloud
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+ types: [opened, synchronize, reopened]
+
+permissions:
+ contents: read
+
+concurrency:
+ group: sonarcloud-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ sonarcloud:
+ # Tracked at @main so org-wide CI improvements propagate without PR churn.
+ uses: storytold/craft-common-actions/.github/workflows/sonarcloud.yml@main
+ secrets: inherit
diff --git a/sonar-project.properties b/sonar-project.properties
deleted file mode 100644
index 66faf29c3..000000000
--- a/sonar-project.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-sonar.projectKey=storytold_craft-launcher
-sonar.organization=storytold
-sonar.sources=.
-sonar.exclusions=**/target/**,**/vendor/**,**/node_modules/**,**/*.min.js,**/dist/**,**/assets/**,**/docs/**
From cee4c16c8ad53621aaf25c037564e77a2dd37090 Mon Sep 17 00:00:00 2001
From: "Dylan M. Taylor"
Date: Wed, 21 Oct 2026 16:00:34 -0400
Subject: [PATCH 4/7] ci: add sonar-project.properties for CI-based analysis
Marks the project ineligible for SonarCloud Automatic Analysis, resolving the
CI-vs-automatic-analysis conflict so the SonarCloud workflow succeeds.
---
sonar-project.properties | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 sonar-project.properties
diff --git a/sonar-project.properties b/sonar-project.properties
new file mode 100644
index 000000000..23a37f67e
--- /dev/null
+++ b/sonar-project.properties
@@ -0,0 +1,2 @@
+sonar.projectKey=storytold_effectcraft
+sonar.organization=storytold
From 50033511862bf679ecff36e03512bb8209130b81 Mon Sep 17 00:00:00 2001
From: "Dylan M. Taylor"
Date: Wed, 21 Oct 2026 17:06:49 -0400
Subject: [PATCH 5/7] security: enforce HTTPS on curl downloads (SonarCloud
S6506)
Add --proto '=https' to curl invocations so redirects cannot downgrade to
plaintext HTTP. Resolves SonarCloud S6506 (shell/docker/githubactions).
---
packaging/linux/package.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packaging/linux/package.sh b/packaging/linux/package.sh
index f149e663d..e32d66aca 100755
--- a/packaging/linux/package.sh
+++ b/packaging/linux/package.sh
@@ -115,7 +115,7 @@ if has appimage; then
if [ -z "$TOOL" ]; then
TOOL="$CARGO_TARGET_DIR/appimagetool-$ARCH.AppImage"
if [ ! -x "$TOOL" ]; then
- curl -fsSL -o "$TOOL" "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-$ARCH.AppImage"
+ curl --proto '=https' -fsSL -o "$TOOL" "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-$ARCH.AppImage"
chmod +x "$TOOL"
fi
fi
From 7d68a74ffc1bcdff943936bcb9b36047f28b48eb Mon Sep 17 00:00:00 2001
From: bflatastic
Date: Thu, 22 Oct 2026 17:57:40 +0700
Subject: [PATCH 6/7] README: the app icon above the title
---
README.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/README.md b/README.md
index 9dc985ee1..5fa28f0bb 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,10 @@
+
+
+
+
EffectCraft
From 9c4246d0db7ab837e059a89cba9a629be0f92f69 Mon Sep 17 00:00:00 2001
From: iannitram <4624371+iannitram@users.noreply.github.com>
Date: Thu, 22 Oct 2026 07:20:12 -0600
Subject: [PATCH 7/7] Cargo.lock: our two crates follow upstream's 0.14.0
workspace version (sync 2026-10-22)
Co-Authored-By: Claude Opus 5.5
---
Cargo.lock | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index fb3c99b6f..81c268b6c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1203,7 +1203,7 @@ dependencies = [
[[package]]
name = "effectcraft-aep-native"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"effectcraft-color",
"effectcraft-effects",
@@ -1649,7 +1649,7 @@ dependencies = [
[[package]]
name = "effectcraft-sysmem"
-version = "0.13.0"
+version = "0.14.0"
dependencies = [
"libc",
"windows-sys 0.61.2",