Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package artcraft-launcher for
openSUSE:Factory checked in at 2026-11-01 22:24:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/artcraft-launcher (Old)
and /work/SRC/openSUSE:Factory/.artcraft-launcher.new.1255 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "artcraft-launcher"
Sun Nov 1 22:24:36 2026 rev:4 rq:1394249 version:0.12.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/artcraft-launcher/artcraft-launcher.changes
2026-10-31 23:14:01.652031593 +0100
+++
/work/SRC/openSUSE:Factory/.artcraft-launcher.new.1255/artcraft-launcher.changes
2026-11-01 22:25:59.235396128 +0100
@@ -1,0 +2,19 @@
+Sun Nov 1 10:00:39 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 0.12.0 (upstream tag v0.12.0):
+ * New community app Craft Anything in the catalog, with its
+ app icon, details page and translations; Flatpak OCI image
+ build helper and a Windows antivirus incident note.
+ * Re-vendor (update=false, filter=true): dependency set
+ unchanged (workspace version stamps only); Windows-only
+ crate files filtered out; licence set and Legal-Review-Notice
+ unchanged; cargo_audit reports no advisories.
+ * All three patches apply unchanged (no upstream changes in
+ the patched files); the rpm-managed copy still only
+ announces a newer launcher, it never installs upstream
+ builds over distro files.
+ * Strip ring's Windows-only pregenerated objects from the
+ vendor with checksum repair (Linux builds them from sources).
+- Set the fixed metainfo release date to 2026-11-01 (v0.12.0).
+
+-------------------------------------------------------------------
Old:
----
artcraft-launcher-0.11.1.tar.zst
New:
----
artcraft-launcher-0.12.0.tar.zst
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ artcraft-launcher.spec ++++++
--- /var/tmp/diff_new_pack.jGwUEj/_old 2026-11-01 22:26:00.698456777 +0100
+++ /var/tmp/diff_new_pack.jGwUEj/_new 2026-11-01 22:26:00.699456819 +0100
@@ -17,7 +17,7 @@
Name: artcraft-launcher
-Version: 0.11.1
+Version: 0.12.0
Release: 0
Summary: Install, update and launch the Craft App Suite
# Legal-Review-Notice: scope is the one shipped target (artcraft-launcher,
@@ -59,6 +59,8 @@
URL: https://github.com/storytold/craft-launcher
Source0: %{name}-%{version}.tar.zst
Source1: vendor.tar.zst
+# Stripped from this tarball (checksum entries dropped): ring's Windows-only
+# pregenerated/*-nasm.o/*-win32n.o (build.rs maps them to Windows targets
only).
# Of the vendor tree's prebuilt files only libloading's Windows-only test
# fixtures remain; checksums forbid stripping them, so each is named below.
# Source-Binary-Exception: vendor.tar.zst:vendor/libloading-*/tests/*.dll --
test-data: fixtures loaded only by libloading's #![cfg(windows)] tests, never
on Linux
@@ -123,10 +125,10 @@
install -Dm0755 target/release/artcraft-launcher
%{buildroot}%{_bindir}/artcraft-launcher
install -Dm0644 packaging/linux/ai.storyteller.artcraft-launcher.desktop
%{buildroot}%{_datadir}/applications/ai.storyteller.artcraft-launcher.desktop
install -d -m 0755 %{buildroot}%{_datadir}/metainfo
-# Fixed upstream release date (v0.11.1, 2026-10-31): a build-time date would
+# Fixed upstream release date (v0.12.0, 2026-11-01): a build-time date would
# make the metainfo differ on every rebuild, and spec-cleaner macro-expands
# the percent-sequences of any date format string, so keep this a plain string.
-sed -e "s/@VERSION@/%{version}/g" -e "s/@DATE@/2026-10-31/g"
packaging/linux/ai.storyteller.artcraft-launcher.metainfo.xml.in >
%{buildroot}%{_datadir}/metainfo/ai.storyteller.artcraft-launcher.metainfo.xml
+sed -e "s/@VERSION@/%{version}/g" -e "s/@DATE@/2026-11-01/g"
packaging/linux/ai.storyteller.artcraft-launcher.metainfo.xml.in >
%{buildroot}%{_datadir}/metainfo/ai.storyteller.artcraft-launcher.metainfo.xml
# Upstream declares the app icon as type="stock" but it is a custom hicolor
# icon, so declare it as cached for appstream validation.
sed -i 's|<icon type="stock">ai.storyteller.artcraft-launcher</icon>|<icon
type="cached" width="64"
height="64">ai.storyteller.artcraft-launcher.png</icon>|'
%{buildroot}%{_datadir}/metainfo/ai.storyteller.artcraft-launcher.metainfo.xml
++++++ _service ++++++
--- /var/tmp/diff_new_pack.jGwUEj/_old 2026-11-01 22:26:00.737458394 +0100
+++ /var/tmp/diff_new_pack.jGwUEj/_new 2026-11-01 22:26:00.740458518 +0100
@@ -2,7 +2,7 @@
<service mode="manual" name="tar_scm">
<param name="url">https://github.com/storytold/craft-launcher.git</param>
<param name="scm">git</param>
- <param name="revision">v0.11.1</param>
+ <param name="revision">v0.12.0</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="versionrewrite-pattern">v(.*)</param>
<param name="versionrewrite-replacement">\1</param>
++++++ artcraft-launcher-0.11.1.tar.zst -> artcraft-launcher-0.12.0.tar.zst
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/.github/workflows/release.yml
new/artcraft-launcher-0.12.0/.github/workflows/release.yml
--- old/artcraft-launcher-0.11.1/.github/workflows/release.yml 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/.github/workflows/release.yml 2026-11-01
04:39:30.000000000 +0100
@@ -12,6 +12,7 @@
permissions:
contents: write
+ packages: write
concurrency:
group: release-${{ github.ref }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/artcraft-launcher-0.11.1/AGENTS.md
new/artcraft-launcher-0.12.0/AGENTS.md
--- old/artcraft-launcher-0.11.1/AGENTS.md 2026-10-31 06:53:58.000000000
+0100
+++ new/artcraft-launcher-0.12.0/AGENTS.md 2026-11-01 04:39:30.000000000
+0100
@@ -2,7 +2,7 @@
ArtCraft Launcher installs, updates and launches the **Craft App Suite**
(PhotoCraft, LightCraft,
FilmCraft, DesignCraft, VectorCraft, PdfCraft, EffectCraft, WordCraft,
DeckCraft, GridCraft,
-CADCraft, SoundCraft, FigCraft), plus approved **community apps** made outside
ArtCraft and labelled
+CADCraft, SoundCraft, FigCraft, Craft Anything), plus approved **community
apps** made outside ArtCraft and labelled
as such (today SolidCraft, by Tangency Labs). It is written in **Rust only**
(no JavaScript or TypeScript): the desktop
app is native egui/eframe, and the web build is the same Rust compiled to
WebAssembly (trunk +
wasm-bindgen). **No Tauri, Electron or webview shells**, ever.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/artcraft-launcher-0.11.1/ATTRIBUTION.md
new/artcraft-launcher-0.12.0/ATTRIBUTION.md
--- old/artcraft-launcher-0.11.1/ATTRIBUTION.md 2026-10-31 06:53:58.000000000
+0100
+++ new/artcraft-launcher-0.12.0/ATTRIBUTION.md 2026-11-01 04:39:30.000000000
+0100
@@ -50,6 +50,7 @@
| `assets/app-icons/solidcraft.png` | SolidCraft app icon (app icon), 128 px |
Tangency Labs and the SolidCraft contributors |
[`tangency-labs/solidcraft`](https://github.com/tangency-labs/solidcraft)
`assets/icons/app/linux/exports/hicolor/128x128/apps/io.tangencylabs.solidcraft.png`,
copied unmodified | MIT OR Apache-2.0,
[`assets/app-icons/LICENSE-MIT-SolidCraft.txt`](assets/app-icons/LICENSE-MIT-SolidCraft.txt),
[`assets/app-icons/LICENSE-APACHE-SolidCraft.txt`](assets/app-icons/LICENSE-APACHE-SolidCraft.txt)
|
| `assets/app-icons/soundcraft.png` | SoundCraft app icon (nightingale
(placeholder)), 128 px | ArtCraft Team and the SoundCraft contributors |
[`storytold/soundcraft`](https://github.com/storytold/soundcraft)
`assets/app-icon/hicolor/128x128/apps/ai.storyteller.soundcraft.png`, copied
unmodified | MIT OR Apache-2.0 (SoundCraft's
[`LICENSE-MIT`](https://github.com/storytold/soundcraft/blob/main/LICENSE-MIT),
[`LICENSE-APACHE`](https://github.com/storytold/soundcraft/blob/main/LICENSE-APACHE))
|
| `assets/app-icons/figcraft.png` | FigCraft app icon (chameleon), 128 px |
ArtCraft Team and the FigCraft contributors |
[`storytold/figcraft`](https://github.com/storytold/figcraft)
`assets/app-icon/hicolor/128x128/apps/ai.storyteller.figcraft.png`, copied
unmodified | MIT OR Apache-2.0 (FigCraft's
[`LICENSE-MIT`](https://github.com/storytold/figcraft/blob/main/LICENSE-MIT),
[`LICENSE-APACHE`](https://github.com/storytold/figcraft/blob/main/LICENSE-APACHE))
|
+| `assets/app-icons/craft-anything.png` | Craft Anything app icon (engraved
raven), 128 px | ArtCraft Team |
[`storytold/craft-anything`](https://github.com/storytold/craft-anything)
`assets/app-icon/hicolor/128x128/apps/ai.storyteller.craft-anything.png`,
copied unmodified | **Not open source; not MIT or Apache-2.0.** Used on the
terms of the ArtCraft brand assets (Craft Anything's
[`assets/app-icon/LICENSE.txt`](https://github.com/storytold/craft-anything/blob/main/assets/app-icon/LICENSE.txt),
[`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt)) |
## Documentation and README
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/artcraft-launcher-0.11.1/Cargo.lock
new/artcraft-launcher-0.12.0/Cargo.lock
--- old/artcraft-launcher-0.11.1/Cargo.lock 2026-10-31 06:53:58.000000000
+0100
+++ new/artcraft-launcher-0.12.0/Cargo.lock 2026-11-01 04:39:30.000000000
+0100
@@ -272,7 +272,7 @@
[[package]]
name = "artcraft-launcher"
-version = "0.11.1"
+version = "0.12.0"
dependencies = [
"artcraft-launcher-core",
"artcraft-launcher-native",
@@ -298,7 +298,7 @@
[[package]]
name = "artcraft-launcher-core"
-version = "0.11.1"
+version = "0.12.0"
dependencies = [
"jiff",
"semver",
@@ -308,7 +308,7 @@
[[package]]
name = "artcraft-launcher-native"
-version = "0.11.1"
+version = "0.12.0"
dependencies = [
"artcraft-launcher-core",
"craft-update",
@@ -332,7 +332,7 @@
[[package]]
name = "artcraft-launcher-ui-egui"
-version = "0.11.1"
+version = "0.12.0"
dependencies = [
"artcraft-launcher-core",
"craft-ui",
@@ -352,7 +352,7 @@
[[package]]
name = "artcraft-launcher-web"
-version = "0.11.1"
+version = "0.12.0"
dependencies = [
"artcraft-launcher-core",
"artcraft-launcher-ui-egui",
@@ -6222,7 +6222,7 @@
[[package]]
name = "xtask"
-version = "0.11.1"
+version = "0.12.0"
dependencies = [
"jiff",
"semver",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/artcraft-launcher-0.11.1/Cargo.toml
new/artcraft-launcher-0.12.0/Cargo.toml
--- old/artcraft-launcher-0.11.1/Cargo.toml 2026-10-31 06:53:58.000000000
+0100
+++ new/artcraft-launcher-0.12.0/Cargo.toml 2026-11-01 04:39:30.000000000
+0100
@@ -3,7 +3,7 @@
members = ["crates/*", "apps/*", "xtask"]
[workspace.package]
-version = "0.11.1"
+version = "0.12.0"
edition = "2024"
license = "MIT OR Apache-2.0"
rust-version = "1.95"
@@ -38,9 +38,14 @@
[profile.dev.package."*"]
opt-level = 2
+debug = false
+# Line tables keep file:line in panic backtraces but drop variable info, as in
the other craft
+# apps: full debug info made Windows test links slow and the CI cache large.
To inspect locals in
+# a debugger, build with CARGO_PROFILE_DEV_DEBUG=true.
[profile.dev]
opt-level = 1
+debug = "line-tables-only"
[profile.release]
lto = "thin"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/artcraft-launcher-0.11.1/README.md
new/artcraft-launcher-0.12.0/README.md
--- old/artcraft-launcher-0.11.1/README.md 2026-10-31 06:53:58.000000000
+0100
+++ new/artcraft-launcher-0.12.0/README.md 2026-11-01 04:39:30.000000000
+0100
@@ -16,7 +16,7 @@
<p align="center">
<b>One place to install, update and open every app in the Craft App Suite,
rebuilt in pure Rust.</b><br>
PhotoCraft, LightCraft, FilmCraft, DesignCraft, VectorCraft, PdfCraft,
EffectCraft, WordCraft,<br>
- DeckCraft, GridCraft, CADCraft, SoundCraft, FigCraft and the community app
SolidCraft: the right build for your computer, kept up to date.
+ DeckCraft, GridCraft, CADCraft, SoundCraft, FigCraft, Craft Anything and the
community app SolidCraft: the right build for your computer, kept up to date.
</p>
<p align="center">
@@ -272,6 +272,7 @@
| <img
src="https://raw.githubusercontent.com/storytold/deckcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.deckcraft.png"
alt="" width="32" height="32"> | **DeckCraft** | Presentations and slide decks
| [GitHub](https://github.com/storytold/deckcraft) |
[Website](https://getartcraft.com/apps/deckcraft) |
| <img
src="https://raw.githubusercontent.com/storytold/cadcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.cadcraft.png"
alt="" width="32" height="32"> | **CADCraft** | Computer-aided design |
[GitHub](https://github.com/storytold/cadcraft) |
[Website](https://getartcraft.com/apps/cadcraft) |
| <img
src="https://raw.githubusercontent.com/storytold/gridcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.gridcraft.png"
alt="" width="32" height="32"> | **GridCraft** | Spreadsheets and data |
[GitHub](https://github.com/storytold/gridcraft) |
[Website](https://getartcraft.com/apps/gridcraft) |
+| <img
src="https://raw.githubusercontent.com/storytold/craft-anything/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.craft-anything.png"
alt="" width="32" height="32"> | **Craft Anything** | See how any software
works, then build your own |
[GitHub](https://github.com/storytold/craft-anything) |
[Website](https://getartcraft.com/apps/craft-anything) |
| <img
src="https://raw.githubusercontent.com/tangency-labs/solidcraft/main/assets/icons/app/linux/exports/hicolor/64x64/apps/io.tangencylabs.solidcraft.png"
alt="" width="32" height="32"> | **SolidCraft** | Parametric 3D CAD by
Tangency Labs (community app) |
[GitHub](https://github.com/tangency-labs/solidcraft) | |
And [**ArtCraft**](https://getartcraft.com/) itself, our AI image and video
studio for artists who want real control.
Binary files old/artcraft-launcher-0.11.1/assets/app-icons/craft-anything.png
and new/artcraft-launcher-0.12.0/assets/app-icons/craft-anything.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/artcraft-launcher-0.11.1/crates/core/src/catalog.rs
new/artcraft-launcher-0.12.0/crates/core/src/catalog.rs
--- old/artcraft-launcher-0.11.1/crates/core/src/catalog.rs 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/core/src/catalog.rs 2026-11-01
04:39:30.000000000 +0100
@@ -1,4 +1,4 @@
-//! The Craft App Suite: the fourteen apps the launcher knows about.
+//! The Craft App Suite: the fifteen apps the launcher knows about.
//!
//! The list is data so a later version can fetch it from an API; [`SUITE`] is
the built-in copy.
//!
@@ -123,7 +123,7 @@
}
/// The Craft App Suite, in display order matching getartcraft.com, then the
community apps:
-pub const SUITE: [CraftApp; 14] = [
+pub const SUITE: [CraftApp; 15] = [
app("photocraft", "PhotoCraft", "Image editing", [[0x2f, 0x7b, 0xf5],
[0x1a, 0x5b, 0xc4], [0x7f, 0xb0, 0xff]], "storytold/photocraft"),
app("vectorcraft", "VectorCraft", "Vector illustration", [[0xe8, 0x57,
0x3f], [0xb8, 0x3a, 0x24], [0xff, 0x8a, 0x70]], "storytold/vectorcraft"),
app(
@@ -195,6 +195,14 @@
"storytold/cadcraft",
),
app("gridcraft", "GridCraft", "Spreadsheets and data", [[0x1f, 0x9d,
0x55], [0x12, 0x70, 0x3a], [0x4f, 0xd6, 0x8a]], "storytold/gridcraft"),
+ // The raven's tile blue, with its README's deep (#1659c4) and light
(#74aaff) accents for text.
+ app(
+ "craft-anything",
+ "Craft Anything",
+ "Find out how any software works, then craft your own",
+ [[0x4e, 0x7b, 0xfb], [0x16, 0x59, 0xc4], [0x74, 0xaa, 0xff]],
+ "storytold/craft-anything",
+ ),
CraftApp {
kind: AppKind::Community,
publisher: "Tangency Labs",
@@ -269,6 +277,7 @@
"wordcraft" =>
include_bytes!("../../../assets/app-icons/wordcraft.png"),
"deckcraft" =>
include_bytes!("../../../assets/app-icons/deckcraft.png"),
"gridcraft" =>
include_bytes!("../../../assets/app-icons/gridcraft.png"),
+ "craft-anything" =>
include_bytes!("../../../assets/app-icons/craft-anything.png"),
"solidcraft" =>
include_bytes!("../../../assets/app-icons/solidcraft.png"),
"cadcraft" => include_bytes!("../../../assets/app-icons/cadcraft.png"),
"soundcraft" =>
include_bytes!("../../../assets/app-icons/soundcraft.png"),
@@ -291,14 +300,15 @@
}
#[test]
- fn suite_has_fourteen_apps_with_unique_ids() {
- assert_eq!(SUITE.len(), 14);
+ fn suite_has_fifteen_apps_with_unique_ids() {
+ assert_eq!(SUITE.len(), 15);
let mut ids: Vec<_> = SUITE.iter().map(|a| a.id).collect();
ids.sort_unstable();
ids.dedup();
assert_eq!(ids.len(), SUITE.len());
for a in &SUITE {
- assert_eq!(a.name.to_lowercase(), a.id);
+ // `Craft Anything` is `craft-anything`.
+ assert_eq!(a.name.to_lowercase().replace(' ', "-"), a.id);
match a.kind {
AppKind::Official => assert_eq!(a.repo,
format!("storytold/{}", a.id)),
AppKind::Community =>
assert!(!a.repo.starts_with("storytold/"), "{} is community", a.id),
@@ -322,6 +332,16 @@
}
#[test]
+ fn craft_anything_is_an_official_app() {
+ let ca = CraftApp::by_id("craft-anything").unwrap();
+ assert_eq!(ca.kind, AppKind::Official);
+ assert_eq!(ca.repo, "storytold/craft-anything");
+ assert_eq!(ca.bundle_id(), "ai.storyteller.craft-anything");
+ assert_eq!(ca.website(),
"https://getartcraft.com/apps/craft-anything");
+ assert_eq!(ca.mac_team, Some(ARTCRAFT_TEAM_ID));
+ }
+
+ #[test]
fn pdfcraft_also_answers_to_printcraft() {
let pdf = CraftApp::by_id("pdfcraft").unwrap();
assert_eq!(pdf.stems().collect::<Vec<_>>(), ["pdfcraft",
"printcraft"]);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/artcraft-launcher-0.11.1/crates/core/src/details.rs
new/artcraft-launcher-0.12.0/crates/core/src/details.rs
--- old/artcraft-launcher-0.11.1/crates/core/src/details.rs 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/core/src/details.rs 2026-11-01
04:39:30.000000000 +0100
@@ -139,7 +139,7 @@
/// Where every Craft App runs (getartcraft.com lists the same for each of
them).
const PLATFORMS: &str = "macOS, Windows, Linux, FreeBSD, web";
-pub const DETAILS: [AppDetails; 14] = [
+pub const DETAILS: [AppDetails; 15] = [
AppDetails {
id: "photocraft",
headline: "The image editor you already know how to use.",
@@ -470,6 +470,27 @@
],
shots: &[],
platforms: PLATFORMS,
+ },
+ AppDetails {
+ id: "craft-anything",
+ headline: "See how any website, app or game works, then build your
own.",
+ about: "Point it at a target and say what you want. It studies the
original with real inspection tools, has a \
+ coding agent build a new project in the stack you ask for,
checks the result against the original and \
+ refines it. Open source and clean-room.",
+ features: &[
+ feature(
+ "Study anything",
+ "Websites, desktop apps, phone apps, games and files: find out
how they're built, with the evidence behind every answer.",
+ ),
+ feature("Build your own", "Say what you want and a coding agent
builds a new project in the language or engine you name."),
+ feature(
+ "Checked, not guessed",
+ "Every build is compared with the original, at three screen
widths for a page, and refined until it's close.",
+ ),
+ feature("Agent-ready", "Every tool is a CLI command and an MCP
tool, and no AI is needed just to inspect."),
+ ],
+ shots: &[],
+ platforms: PLATFORMS,
},
AppDetails {
id: "solidcraft",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/crates/native/src/desktop_entry.rs
new/artcraft-launcher-0.12.0/crates/native/src/desktop_entry.rs
--- old/artcraft-launcher-0.11.1/crates/native/src/desktop_entry.rs
2026-10-31 06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/native/src/desktop_entry.rs
2026-11-01 04:39:30.000000000 +0100
@@ -32,6 +32,7 @@
"cadcraft" => ("Graphics;Engineering;VectorGraphics;", None),
"soundcraft" => ("AudioVideo;Audio;Midi;Mixer;Sequencer;Recorder;",
None),
"figcraft" => ("Graphics;2DGraphics;VectorGraphics;X-Design;",
Some("figcraft")),
+ "craft-anything" => ("Development;Debugger;", None),
_ => ("Graphics;", None),
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/cs.tsv
new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/cs.tsv
--- old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/cs.tsv 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/cs.tsv 2026-11-01
04:39:30.000000000 +0100
@@ -156,6 +156,7 @@
wordcraft Writing and document design Psaní a návrh dokumentů
deckcraft Presentations and slide shows Prezentace a promítání snímků
gridcraft Spreadsheets and data Tabulky a data
+craft-anything Find out how any software works, then craft your own
Zjistěte, jak funguje jakýkoli software, a vytvořte si vlastní
solidcraft Parametric 3D CAD Parametrické 3D CAD
cadcraft Computer-aided design and drafting Počítačem podporované
navrhování a kreslení
soundcraft Recording, editing and mixing audio Nahrávání, úpravy a
mixování zvuku
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/de.tsv
new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/de.tsv
--- old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/de.tsv 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/de.tsv 2026-11-01
04:39:30.000000000 +0100
@@ -174,6 +174,7 @@
wordcraft Writing and document design Schreiben und Dokumentgestaltung
deckcraft Presentations and slide shows Präsentationen und Diashows
gridcraft Spreadsheets and data Tabellenkalkulation und Daten
+craft-anything Find out how any software works, then craft your own
Verstehen, wie jede Software funktioniert, und die eigene bauen
solidcraft Parametric 3D CAD Parametrisches 3D-CAD
cadcraft Computer-aided design and drafting Computergestütztes
Konstruieren und Zeichnen
soundcraft Recording, editing and mixing audio Audio aufnehmen,
bearbeiten und mischen
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/es.tsv
new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/es.tsv
--- old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/es.tsv 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/es.tsv 2026-11-01
04:39:30.000000000 +0100
@@ -169,6 +169,7 @@
wordcraft Writing and document design Escritura y diseño de documentos
deckcraft Presentations and slide shows Presentaciones y diapositivas
gridcraft Spreadsheets and data Hojas de cálculo y datos
+craft-anything Find out how any software works, then craft your own
Descubre cómo funciona cualquier software y crea el tuyo
solidcraft Parametric 3D CAD CAD 3D paramétrico
cadcraft Computer-aided design and drafting CAD: diseño y dibujo
técnico
soundcraft Recording, editing and mixing audio Grabación, edición y
mezcla de audio
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/fr.tsv
new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/fr.tsv
--- old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/fr.tsv 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/fr.tsv 2026-11-01
04:39:30.000000000 +0100
@@ -172,6 +172,7 @@
wordcraft Writing and document design Rédaction et mise en forme de
documents
deckcraft Presentations and slide shows Présentations et diaporamas
gridcraft Spreadsheets and data Tableurs et données
+craft-anything Find out how any software works, then craft your own
Découvrez comment fonctionne n'importe quel logiciel, puis créez le vôtre
solidcraft Parametric 3D CAD CAO paramétrique 3D
cadcraft Computer-aided design and drafting Conception et dessin
assistés par ordinateur
soundcraft Recording, editing and mixing audio Enregistrement, édition
et mixage audio
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/hu.tsv
new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/hu.tsv
--- old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/hu.tsv 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/hu.tsv 2026-11-01
04:39:30.000000000 +0100
@@ -174,6 +174,7 @@
wordcraft Writing and document design Írás és dokumentumtervezés
deckcraft Presentations and slide shows Prezentációk és diavetítések
gridcraft Spreadsheets and data Táblázatok és adatok
+craft-anything Find out how any software works, then craft your own Ismerd
meg, hogyan működik bármely szoftver, majd készítsd el a sajátodat
solidcraft Parametric 3D CAD Paraméteres 3D CAD
cadcraft Computer-aided design and drafting Számítógépes tervezés
és műszaki rajz
soundcraft Recording, editing and mixing audio Hangrögzítés,
hangszerkesztés és keverés
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/ja.tsv
new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/ja.tsv
--- old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/ja.tsv 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/ja.tsv 2026-11-01
04:39:30.000000000 +0100
@@ -176,6 +176,7 @@
wordcraft Writing and document design 文書作成とデザイン
deckcraft Presentations and slide shows プレゼンテーションとスライドショー
gridcraft Spreadsheets and data 表計算とデータ
+craft-anything Find out how any software works, then craft your own
あらゆるソフトウェアの仕組みを知り、自分だけのものを作る
solidcraft Parametric 3D CAD パラメトリック3D CAD
cadcraft Computer-aided design and drafting コンピューター支援設計と製図
soundcraft Recording, editing and mixing audio オーディオの録音、編集、ミックス
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/pl.tsv
new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/pl.tsv
--- old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/pl.tsv 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/pl.tsv 2026-11-01
04:39:30.000000000 +0100
@@ -175,6 +175,7 @@
wordcraft Writing and document design Pisanie i projektowanie
dokumentów
deckcraft Presentations and slide shows Prezentacje i pokazy slajdów
gridcraft Spreadsheets and data Arkusze kalkulacyjne i dane
+craft-anything Find out how any software works, then craft your own Dowiedz
się, jak działa dowolne oprogramowanie, i stwórz własne
solidcraft Parametric 3D CAD Parametryczny CAD 3D
cadcraft Computer-aided design and drafting Projektowanie i
kreślenie wspomagane komputerowo
soundcraft Recording, editing and mixing audio Nagrywanie, edycja i
miksowanie dźwięku
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/pt-BR.tsv
new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/pt-BR.tsv
--- old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/pt-BR.tsv
2026-10-31 06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/pt-BR.tsv
2026-11-01 04:39:30.000000000 +0100
@@ -162,6 +162,7 @@
wordcraft Writing and document design Escrita e design de documentos
deckcraft Presentations and slide shows Apresentações e slides
gridcraft Spreadsheets and data Planilhas e dados
+craft-anything Find out how any software works, then craft your own
Descubra como qualquer software funciona e crie o seu
solidcraft Parametric 3D CAD CAD 3D paramétrico
cadcraft Computer-aided design and drafting Desenho técnico e
projeto assistido por computador (CAD)
soundcraft Recording, editing and mixing audio Gravação, edição e
mixagem de áudio
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/ru.tsv
new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/ru.tsv
--- old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/ru.tsv 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/ru.tsv 2026-11-01
04:39:30.000000000 +0100
@@ -172,6 +172,7 @@
wordcraft Writing and document design Тексты и оформление документов
deckcraft Presentations and slide shows Презентации и слайд-шоу
gridcraft Spreadsheets and data Электронные таблицы и данные
+craft-anything Find out how any software works, then craft your own
Узнайте, как устроена любая программа, и создайте свою
solidcraft Parametric 3D CAD Параметрический 3D CAD
cadcraft Computer-aided design and drafting Автоматизированное
проектирование и черчение
soundcraft Recording, editing and mixing audio Запись, редактирование
и сведение звука
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/zh-CN.tsv
new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/zh-CN.tsv
--- old/artcraft-launcher-0.11.1/crates/ui-egui/src/i18n/zh-CN.tsv
2026-10-31 06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/crates/ui-egui/src/i18n/zh-CN.tsv
2026-11-01 04:39:30.000000000 +0100
@@ -250,6 +250,7 @@
wordcraft Writing and document design 写作与文档设计
deckcraft Presentations and slide shows 演示文稿与幻灯片
gridcraft Spreadsheets and data 电子表格与数据处理
+craft-anything Find out how any software works, then craft your own
了解任何软件的工作原理,然后打造你自己的版本
solidcraft Parametric 3D CAD 参数化三维 CAD
cadcraft Computer-aided design and drafting 计算机辅助设计与制图
soundcraft Recording, editing and mixing audio 音频录制、编辑与混音
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/docs/incident-2026-10-windows-antivirus.md
new/artcraft-launcher-0.12.0/docs/incident-2026-10-windows-antivirus.md
--- old/artcraft-launcher-0.11.1/docs/incident-2026-10-windows-antivirus.md
1970-01-01 01:00:00.000000000 +0100
+++ new/artcraft-launcher-0.12.0/docs/incident-2026-10-windows-antivirus.md
2026-11-01 04:39:30.000000000 +0100
@@ -0,0 +1,108 @@
+# Incident: antivirus flagged ArtCraft Launcher during Update all on Windows
+
+Status (2026-10-31): the Update all route is reverted on `main` (#1077) but
not yet released. The
+same elevated PowerShell route is still used by all-users downgrades, and no
test has confirmed
+that the revert stops the detection. See [Still open](#still-open).
+
+## Summary
+
+Since v0.10.0, updating two or more all-users apps together normally ran
installers through a hidden,
+elevated PowerShell with a Base64 script. Users soon reported antivirus flags
during Update all.
+Kaspersky's report in #1045 shows a behavioural `PDM:Trojan.Win32.Generic`
detection. It killed
+and deleted `artcraft-launcher.exe` and removed its shortcut and registry
entry, and the reporter
+had to reinstall ArtCraft Launcher and every app.
+
+Nothing found so far suggests malicious intent: this code only ran `msiexec`
on packages checked
+against their release checksums, and Windows still showed a permission prompt.
The route is treated
+as the cause because the evidence below points to it, not because the
detection has been reproduced.
+
+## What triggered it
+
+#974 added one permission prompt for an Update all of all-users apps. For two
or more apps, unless
+the batch was too long or PowerShell could not start (each app then got its
own `msiexec` prompt),
+ArtCraft Launcher:
+
+1. started a hidden `powershell.exe`;
+2. asked for elevation with `Start-Process -Verb RunAs -WindowStyle Hidden`;
+3. ran a script passed as `-EncodedCommand`;
+4. ran `msiexec` from that script on packages in a user-writable folder.
+
+Each step had a reason, but together they match a common malware pattern. A
single app kept going
+straight to `msiexec`, without PowerShell. All-users downgrades (`46cffe6`, in
#1007) reuse the
+same elevated script code.
+
+## Timeline (UTC)
+
+| When | What |
+|---|---|
+| Oct 29 04:05 | #974 merged |
+| Oct 29 19:47 | v0.10.0 released, the first release with this route |
+| Oct 29 22:41 | #1027: antivirus flags Update all, but updating one at a time
is fine |
+| Oct 30 06:54 | #1042: antivirus removes files during Update all |
+| Oct 30 09:27 | #1045: Kaspersky reports a Trojan during Update all |
+| Oct 31 03:48 | v0.11.0 published, still with this route; later revoked |
+| Oct 31 05:31 | #1077 merged, reverting #974 |
+
+## Evidence
+
+Pointing to this route:
+
+- The Update all reports began about three hours after v0.10.0 was released.
+- #1027 separates the two routes: one at a time works, and Update all gets
flagged.
+- The #1045 detection is behavioural, so it depends on what ArtCraft Launcher
does when it runs.
+
+Not established:
+
+- The detection has not been reproduced on a machine under our control, before
or after the revert.
+- The reports in #1027 and #1042 do not name a detection, so they may not
share the #1045 cause.
+
+The Avast `FileRepMalware` flag in #251 predates this route and is a separate
reputation flag.
+
+## File scans didn't detect this
+
+On 2026-10-31, no VirusTotal engine flagged these builds, and Kaspersky's
engine showed
+`undetected` on all of them:
+
+| Build | Has the route | Malicious / suspicious | Source |
+|---|---|---|---|
+| v0.9.0 MSI | No | 0 / 0 | Existing report |
+| v0.9.0 zip | No | 0 / 0 | Existing report |
+| v0.10.0 MSI | Yes | 0 / 0 | Existing report |
+| v0.11.0 MSI | Yes | 0 / 0 | Existing report |
+| v0.11.0 zip | Yes | 0 / 0 | New scan |
+
+VirusTotal's sandbox run of the v0.11.0 MSI shows no PowerShell, because the
route needs two or
+more outdated all-users apps and someone to accept the prompt. These clean
scans therefore say
+little about this kind of detection, and neither our Windows CI nor these
VirusTotal results flagged
+the route.
+
+## What changed
+
+- #1077 reverts #974, so each all-users update runs `msiexec` directly again.
This brings back one
+ permission prompt per app.
+- v0.11.0 was revoked, and its release page points users to v0.10.0. v0.10.0
also contains this
+ route, so its users stay exposed until a release with #1077 ships.
+- #1076, an alternative that also removed the downgrade route, was closed in
favour of #1077.
+
+## Still open
+
+- **All-users downgrades:** `downgrade_elevated` still uses the same elevated
PowerShell script,
+ and the command strings are still in the binary. Anyone downgrading an
all-users app could trigger
+ the same detection.
+- **Release:** no release includes #1077 yet.
+- **Confirmation:** test on a Windows VM with Kaspersky and behaviour
detection on. Run Update all
+ with two or more outdated all-users apps on an affected build, then on a
build with #1077. The
+ test only counts if the affected build reproduces the flag.
+- **Remaining lookup:** `msi_context.rs` runs a hidden, non-elevated
PowerShell lookup on MSI
+ updates. It runs for single-app updates too, which #1027 says are fine, so
it was left in place.
+ If flags continue, look there next.
+- **Affected users:** the revert does not repair installs the antivirus has
already damaged. The
+ "isn't where it was installed" errors are tracked in #993.
+
+## For next time
+
+- Don't start hidden, elevated or encoded PowerShell from ArtCraft Launcher.
Prefer one prompt per app
+ to a script that behaves like malware. Bringing back a single prompt needs a
different design,
+ such as a signed helper.
+- Before releasing a change to how Windows installs run, try it on a machine
with behavioural
+ antivirus on. File scans and CI didn't show this problem.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/packaging/linux/flatpak-bundle.sh
new/artcraft-launcher-0.12.0/packaging/linux/flatpak-bundle.sh
--- old/artcraft-launcher-0.11.1/packaging/linux/flatpak-bundle.sh
2026-10-31 06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/packaging/linux/flatpak-bundle.sh
2026-11-01 04:39:30.000000000 +0100
@@ -21,10 +21,12 @@
FLATHUB=https://dl.flathub.org/repo/flathub.flatpakrepo
TEST=1
+OCI=0
TARBALL=""
while [[ $# -gt 0 ]]; do
case "$1" in
--no-test) TEST=0; shift ;;
+ --oci) OCI=1; shift ;;
-h | --help) sed -n '2,14p' "$0"; exit 0 ;;
-*) echo "unknown argument: $1" >&2; exit 2 ;;
*) TARBALL="$1"; shift ;;
@@ -63,6 +65,13 @@
flatpak build-bundle --runtime-repo="$FLATHUB" "$WORK/repo" "$OUT" "$APP_ID"
stable
echo "wrote $OUT"
+if [[ "$OCI" = 1 ]]; then
+ OUT_OCI="$DIST/$BASENAME-oci"
+ rm -rf "$OUT_OCI"
+ flatpak build-bundle --oci "$WORK/repo" "$OUT_OCI" "$APP_ID" stable
+ echo "wrote OCI layout to $OUT_OCI"
+fi
+
if [[ "$TEST" = 1 ]]; then
flatpak install --user -y --noninteractive --reinstall "$OUT"
flatpak info --user "$APP_ID"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/packaging/linux/flatpak-oci.sh
new/artcraft-launcher-0.12.0/packaging/linux/flatpak-oci.sh
--- old/artcraft-launcher-0.11.1/packaging/linux/flatpak-oci.sh 1970-01-01
01:00:00.000000000 +0100
+++ new/artcraft-launcher-0.12.0/packaging/linux/flatpak-oci.sh 2026-11-01
04:39:30.000000000 +0100
@@ -0,0 +1,64 @@
+#!/usr/bin/env bash
+# Build ArtCraft Launcher as an OCI container layout and push it to GitHub
Container Registry (GHCR)
+# for consumption by Flatpak OCI clients (flatpak-oci-specs).
+#
+# Usage:
+# packaging/linux/flatpak-oci.sh [--push] [TARBALL]
+#
+# Environment variables:
+# REGISTRY Target registry image (default:
ghcr.io/storytold/artcraft-launcher)
+# TAG Target image tag (default: $VERSION-$ARCH, also tags
stable-$ARCH)
+# GITHUB_TOKEN Token for GHCR authentication when --push is used
+set -euo pipefail
+# shellcheck source=../env.sh
+. "$(dirname "${BASH_SOURCE[0]}")/../env.sh"
+HERE="$ROOT/packaging/linux"
+
+PUSH=0
+TARBALL=""
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --push) PUSH=1; shift ;;
+ -h | --help) sed -n '2,12p' "$0"; exit 0 ;;
+ -*) echo "unknown argument: $1" >&2; exit 2 ;;
+ *) TARBALL="$1"; shift ;;
+ esac
+done
+
+ARCH="$(uname -m)"
+case "$ARCH" in
+ x86_64) ;;
+ aarch64 | arm64) ARCH=aarch64 ;;
+ *) echo "unsupported architecture $ARCH" >&2; exit 2 ;;
+esac
+
+BASENAME="artcraft-launcher-$VERSION-linux-$ARCH"
+OUT_OCI="$DIST/$BASENAME-oci"
+
+echo "==> Building Flatpak OCI layout for $BASENAME"
+"$HERE/flatpak-bundle.sh" --oci --no-test "${TARBALL:-}"
+
+[[ -d "$OUT_OCI" ]] || { echo "error: $OUT_OCI layout not generated" >&2; exit
1; }
+
+REGISTRY="${REGISTRY:-ghcr.io/storytold/artcraft-launcher}"
+TAG="${TAG:-$VERSION-$ARCH}"
+
+echo "==> OCI layout ready at $OUT_OCI (Target: $REGISTRY:$TAG)"
+
+if [[ "$PUSH" = 1 ]]; then
+ command -v skopeo >/dev/null || { echo "error: skopeo is required to push
OCI images (apt install skopeo)" >&2; exit 1; }
+
+ AUTH_ARGS=()
+ if [[ -n "${GITHUB_TOKEN:-}" ]]; then
+ AUTH_ARGS=(--dest-creds "${GITHUB_ACTOR:-storytold}:$GITHUB_TOKEN")
+ fi
+
+ echo "==> Pushing to $REGISTRY:$TAG"
+ skopeo copy --format oci "${AUTH_ARGS[@]}" "oci:$OUT_OCI"
"docker://$REGISTRY:$TAG"
+
+ # Also update architecture-specific stable tag
+ echo "==> Pushing to $REGISTRY:stable-$ARCH"
+ skopeo copy --format oci "${AUTH_ARGS[@]}" "oci:$OUT_OCI"
"docker://$REGISTRY:stable-$ARCH"
+
+ echo "==> Push complete"
+fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/artcraft-launcher-0.11.1/packaging/windows/package.ps1
new/artcraft-launcher-0.12.0/packaging/windows/package.ps1
--- old/artcraft-launcher-0.11.1/packaging/windows/package.ps1 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/packaging/windows/package.ps1 2026-11-01
04:39:30.000000000 +0100
@@ -113,7 +113,7 @@
$line = [System.Drawing.Color]::FromArgb(38, 242, 241, 238)
# The Craft App Suite, in the launcher's order (crates/core/src/catalog.rs).
$apps = 'photocraft', 'vectorcraft', 'filmcraft', 'lightcraft', 'pdfcraft',
'effectcraft',
- 'designcraft', 'figcraft', 'wordcraft', 'soundcraft', 'deckcraft',
'cadcraft', 'gridcraft'
+ 'designcraft', 'figcraft', 'wordcraft', 'soundcraft', 'deckcraft',
'cadcraft', 'gridcraft', 'craft-anything'
$mark = [System.Drawing.Image]::FromFile((Join-Path $Root
'assets\app-icon\hicolor\256x256\apps\ai.storyteller.artcraft-launcher.png'))
$wordmark = [System.Drawing.Image]::FromFile((Join-Path $Root
'docs\brand\artcraft-logo-white.png'))
$icons = $apps | ForEach-Object {
[System.Drawing.Image]::FromFile((Join-Path $Root "assets\app-icons\$_.png")) }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/artcraft-launcher-0.11.1/xtask/src/local.rs
new/artcraft-launcher-0.12.0/xtask/src/local.rs
--- old/artcraft-launcher-0.11.1/xtask/src/local.rs 2026-10-31
06:53:58.000000000 +0100
+++ new/artcraft-launcher-0.12.0/xtask/src/local.rs 2026-11-01
04:39:30.000000000 +0100
@@ -32,6 +32,7 @@
("deckcraft", "DeckCraft"),
("cadcraft", "CADCraft"),
("gridcraft", "GridCraft"),
+ ("craft-anything", "Craft Anything"),
];
const DEFAULT_PORT: u16 = 8787;
++++++ vendor.tar.zst ++++++
/work/SRC/openSUSE:Factory/artcraft-launcher/vendor.tar.zst
/work/SRC/openSUSE:Factory/.artcraft-launcher.new.1255/vendor.tar.zst differ:
char 5, line 1