From c9e6f90a0d9531dd8b114d3f240444c7aa383271 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 22 Jan 2026 12:16:30 +0000
Subject: [PATCH 1/6] Initial plan
From 77f75f0eccb53fe53b9402d99f6667edc6361008 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 22 Jan 2026 12:20:08 +0000
Subject: [PATCH 2/6] Add GraalVM native-image configuration and update
workflows for binary builds
Co-authored-by: lmangani <1423657+lmangani@users.noreply.github.com>
---
.github/workflows/ci-build.yml | 40 +++++++++++++++----
.github/workflows/release-builds.yml | 36 ++++++++++++-----
pom.xml | 37 +++++++++++++++++
.../SpriteLab/native-image.properties | 5 +++
.../SpriteLab/reflect-config.json | 39 ++++++++++++++++++
.../SpriteLab/resource-config.json | 16 ++++++++
6 files changed, 156 insertions(+), 17 deletions(-)
create mode 100644 src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/native-image.properties
create mode 100644 src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/reflect-config.json
create mode 100644 src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/resource-config.json
diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml
index 9bfb7cf..d23c284 100644
--- a/.github/workflows/ci-build.yml
+++ b/.github/workflows/ci-build.yml
@@ -30,7 +30,7 @@ jobs:
github-token: ${{ secrets.GITHUB_TOKEN }}
cache: 'maven'
- - name: Build with Maven
+ - name: Build JAR with Maven
run: mvn -B clean package --file pom.xml
- name: Verify JAR was created
@@ -39,8 +39,21 @@ jobs:
echo "Error: SpriteLab.jar was not created"
exit 1
fi
- echo "Build successful: SpriteLab.jar created"
+ echo "JAR build successful: SpriteLab.jar created"
ls -lh target/SpriteLab.jar
+
+ - name: Build Native Binary with Maven
+ run: mvn -B -Pnative package --file pom.xml
+
+ - name: Verify native binary was created
+ run: |
+ if [ ! -f target/SpriteLab ]; then
+ echo "Error: Native binary SpriteLab was not created"
+ exit 1
+ fi
+ echo "Native binary created successfully"
+ ls -lh target/SpriteLab
+ file target/SpriteLab
- name: Download FFmpeg for Linux
run: |
@@ -61,8 +74,7 @@ jobs:
- name: Copy artifacts
run: |
- cp target/SpriteLab.jar staging/SpriteLab-linux-amd64.jar
- cp run.sh staging/ || true
+ cp target/SpriteLab staging/SpriteLab
cp README.md staging/ || cp Readme.md staging/ || true
cp LICENSE staging/ || true
@@ -100,7 +112,7 @@ jobs:
github-token: ${{ secrets.GITHUB_TOKEN }}
cache: 'maven'
- - name: Build with Maven
+ - name: Build JAR with Maven
run: mvn -B clean package --file pom.xml
- name: Verify JAR was created
@@ -109,8 +121,21 @@ jobs:
echo "Error: SpriteLab.jar was not created"
exit 1
fi
- echo "Build successful: SpriteLab.jar created"
+ echo "JAR build successful: SpriteLab.jar created"
ls -lh target/SpriteLab.jar
+
+ - name: Build Native Binary with Maven
+ run: mvn -B -Pnative package --file pom.xml
+
+ - name: Verify native binary was created
+ run: |
+ if [ ! -f target/SpriteLab ]; then
+ echo "Error: Native binary SpriteLab was not created"
+ exit 1
+ fi
+ echo "Native binary created successfully"
+ ls -lh target/SpriteLab
+ file target/SpriteLab
- name: Download FFmpeg for macOS ARM64
run: |
@@ -131,8 +156,7 @@ jobs:
- name: Copy artifacts
run: |
- cp target/SpriteLab.jar staging/SpriteLab-macos-arm64.jar
- cp run.sh staging/ || true
+ cp target/SpriteLab staging/SpriteLab
cp README.md staging/ || cp Readme.md staging/ || true
cp LICENSE staging/ || true
diff --git a/.github/workflows/release-builds.yml b/.github/workflows/release-builds.yml
index 35860f1..b43c4e7 100644
--- a/.github/workflows/release-builds.yml
+++ b/.github/workflows/release-builds.yml
@@ -24,9 +24,19 @@ jobs:
native-image-job-reports: 'true'
cache: 'maven'
- - name: Build with Maven
- run: mvn -B clean package --file pom.xml
+ - name: Build Native Binary with Maven
+ run: mvn -B -Pnative clean package --file pom.xml
+ - name: Verify native binary was created
+ run: |
+ if [ ! -f target/SpriteLab ]; then
+ echo "Error: Native binary SpriteLab was not created"
+ exit 1
+ fi
+ echo "Native binary created successfully"
+ ls -lh target/SpriteLab
+ file target/SpriteLab
+
- name: Download FFmpeg for Linux
run: |
mkdir -p staging/bin
@@ -38,8 +48,7 @@ jobs:
- name: Copy artifacts
run: |
- cp target/SpriteLab.jar staging/SpriteLab-linux-amd64.jar
- cp run.sh staging/ || true
+ cp target/SpriteLab staging/SpriteLab
cp README.md staging/ || cp Readme.md staging/ || true
cp LICENSE staging/ || true
@@ -76,22 +85,31 @@ jobs:
native-image-job-reports: 'true'
cache: 'maven'
- - name: Build with Maven
- run: mvn -B clean package --file pom.xml
+ - name: Build Native Binary with Maven
+ run: mvn -B -Pnative clean package --file pom.xml
+ - name: Verify native binary was created
+ run: |
+ if [ ! -f target/SpriteLab ]; then
+ echo "Error: Native binary SpriteLab was not created"
+ exit 1
+ fi
+ echo "Native binary created successfully"
+ ls -lh target/SpriteLab
+ file target/SpriteLab
+
- name: Download FFmpeg for macOS ARM64
run: |
mkdir -p staging/bin
# Download FFmpeg static build for macOS ARM64
- wget -O ffmpeg.zip https://evermeet.cx/ffmpeg/getrelease/ffmpeg/zip
+ curl -L -o ffmpeg.zip https://evermeet.cx/ffmpeg/getrelease/ffmpeg/zip
unzip -j ffmpeg.zip -d staging/bin/
chmod +x staging/bin/ffmpeg
rm ffmpeg.zip
- name: Copy artifacts
run: |
- cp target/SpriteLab.jar staging/SpriteLab-macos-arm64.jar
- cp run.sh staging/ || true
+ cp target/SpriteLab staging/SpriteLab
cp README.md staging/ || cp Readme.md staging/ || true
cp LICENSE staging/ || true
diff --git a/pom.xml b/pom.xml
index c00bd59..94125e3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,6 +15,7 @@
21.0.1
11.2.1
com.fedeiatech.spritelab.Launcher
+ 0.10.3
@@ -81,4 +82,40 @@
+
+
+
+ native
+
+
+
+ org.graalvm.buildtools
+ native-maven-plugin
+ ${native.maven.plugin.version}
+ true
+
+
+ build-native
+
+ compile-no-fork
+
+ package
+
+
+
+ SpriteLab
+ ${exec.mainClass}
+
+ --no-fallback
+ --report-unsupported-elements-at-runtime
+ -H:+ReportExceptionStackTraces
+ --initialize-at-build-time=org.controlsfx
+ --initialize-at-run-time=com.sun.javafx.application.PlatformImpl
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/native-image.properties b/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/native-image.properties
new file mode 100644
index 0000000..4cec14c
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/native-image.properties
@@ -0,0 +1,5 @@
+Args = --no-fallback \
+ --report-unsupported-elements-at-runtime \
+ -H:+ReportExceptionStackTraces \
+ --initialize-at-build-time=org.controlsfx \
+ --initialize-at-run-time=com.sun.javafx.application.PlatformImpl
diff --git a/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/reflect-config.json b/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/reflect-config.json
new file mode 100644
index 0000000..00e758c
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/reflect-config.json
@@ -0,0 +1,39 @@
+[
+ {
+ "name": "com.fedeiatech.spritelab.App",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true
+ },
+ {
+ "name": "com.fedeiatech.spritelab.Launcher",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true
+ },
+ {
+ "name": "com.fedeiatech.spritelab.PrimaryController",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "name": "com.fedeiatech.spritelab.FFmpegService",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true
+ },
+ {
+ "name": "javafx.fxml.FXMLLoader",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true
+ }
+]
diff --git a/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/resource-config.json b/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/resource-config.json
new file mode 100644
index 0000000..5dec1e9
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/resource-config.json
@@ -0,0 +1,16 @@
+{
+ "resources": {
+ "includes": [
+ {
+ "pattern": "\\Qcom/fedeiatech/spritelab/primary.fxml\\E"
+ },
+ {
+ "pattern": "\\Qcom/fedeiatech/spritelab/styles.css\\E"
+ },
+ {
+ "pattern": "\\Qcom/fedeiatech/spritelab/img/link.png\\E"
+ }
+ ]
+ },
+ "bundles": []
+}
From 952ca4fedf38601341f9e2e9a21b665ee8710255 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 22 Jan 2026 12:22:02 +0000
Subject: [PATCH 3/6] Add native binary launcher script and update workflows
Co-authored-by: lmangani <1423657+lmangani@users.noreply.github.com>
---
.github/workflows/ci-build.yml | 4 ++++
.github/workflows/release-builds.yml | 4 ++++
run-native.sh | 23 +++++++++++++++++++++++
3 files changed, 31 insertions(+)
create mode 100755 run-native.sh
diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml
index d23c284..834c630 100644
--- a/.github/workflows/ci-build.yml
+++ b/.github/workflows/ci-build.yml
@@ -75,8 +75,10 @@ jobs:
- name: Copy artifacts
run: |
cp target/SpriteLab staging/SpriteLab
+ cp run-native.sh staging/ || true
cp README.md staging/ || cp Readme.md staging/ || true
cp LICENSE staging/ || true
+ chmod +x staging/SpriteLab staging/run-native.sh || true
- name: Create test package
run: |
@@ -157,8 +159,10 @@ jobs:
- name: Copy artifacts
run: |
cp target/SpriteLab staging/SpriteLab
+ cp run-native.sh staging/ || true
cp README.md staging/ || cp Readme.md staging/ || true
cp LICENSE staging/ || true
+ chmod +x staging/SpriteLab staging/run-native.sh || true
- name: Create test package
run: |
diff --git a/.github/workflows/release-builds.yml b/.github/workflows/release-builds.yml
index b43c4e7..872f2ae 100644
--- a/.github/workflows/release-builds.yml
+++ b/.github/workflows/release-builds.yml
@@ -49,8 +49,10 @@ jobs:
- name: Copy artifacts
run: |
cp target/SpriteLab staging/SpriteLab
+ cp run-native.sh staging/ || true
cp README.md staging/ || cp Readme.md staging/ || true
cp LICENSE staging/ || true
+ chmod +x staging/SpriteLab staging/run-native.sh || true
- name: Create release package
run: |
@@ -110,8 +112,10 @@ jobs:
- name: Copy artifacts
run: |
cp target/SpriteLab staging/SpriteLab
+ cp run-native.sh staging/ || true
cp README.md staging/ || cp Readme.md staging/ || true
cp LICENSE staging/ || true
+ chmod +x staging/SpriteLab staging/run-native.sh || true
- name: Create release package
run: |
diff --git a/run-native.sh b/run-native.sh
new file mode 100755
index 0000000..19ca82b
--- /dev/null
+++ b/run-native.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+# Launch script for SpriteLab native binary on Linux/macOS
+
+# Get the directory where this script is located
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+
+# Check if the native binary exists
+if [ ! -f "$SCRIPT_DIR/SpriteLab" ]; then
+ echo "Error: SpriteLab binary not found in $SCRIPT_DIR"
+ exit 1
+fi
+
+# Check if FFmpeg binary exists
+if [ ! -f "$SCRIPT_DIR/bin/ffmpeg" ]; then
+ echo "Warning: FFmpeg binary not found in $SCRIPT_DIR/bin/"
+ echo "SpriteLab requires FFmpeg to function properly."
+fi
+
+# Make sure the binary is executable
+chmod +x "$SCRIPT_DIR/SpriteLab"
+
+# Run SpriteLab native binary
+"$SCRIPT_DIR/SpriteLab" "$@"
From 610a1fdf94ef5f3ea54412ae2620f032eb3c237d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 22 Jan 2026 12:22:26 +0000
Subject: [PATCH 4/6] Update README with native binary installation
instructions
Co-authored-by: lmangani <1423657+lmangani@users.noreply.github.com>
---
Readme.md | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/Readme.md b/Readme.md
index 5030234..6db8990 100644
--- a/Readme.md
+++ b/Readme.md
@@ -59,7 +59,25 @@ This tool is built for **creators**. It serves as the ideal bridge for:
---
-## Installation (RAR Release)
+## Installation
+
+### Binary Releases (Recommended - No Java Required)
+
+Native binary releases are available for Linux and macOS from the [GitHub Releases](https://github.com/katamini/SpriteLab/releases) page. These are standalone executables that **do not require Java** to be installed.
+
+**Linux (amd64):**
+1. Download `SpriteLab-Linux-amd64.tar.gz` from the latest release
+2. Extract: `tar -xzf SpriteLab-Linux-amd64.tar.gz`
+3. Run: `./run-native.sh` or `./SpriteLab`
+
+**macOS (arm64/Apple Silicon):**
+1. Download `SpriteLab-macOS-arm64.tar.gz` from the latest release
+2. Extract: `tar -xzf SpriteLab-macOS-arm64.tar.gz`
+3. Run: `./run-native.sh` or `./SpriteLab`
+
+Both packages include FFmpeg binaries in the `bin` folder.
+
+### Alternative Installation (RAR Release - Windows)
1. Download the `.rar` file from [Itch.io](https://fedeiatech.itch.io/spritelab).
2. Extract the contents (Ensure the `bin` folder containing `ffmpeg.exe` is in the same directory).
@@ -73,4 +91,14 @@ This tool is built for **creators**. It serves as the ideal bridge for:
* **Dependencies:** FFmpeg (Local binaries required in `/bin`).
* **License:** MIT.
+**Building from source:**
+
+```bash
+# Build JAR (requires Java 21)
+mvn clean package
+
+# Build native binary (requires GraalVM 21 with native-image)
+mvn -Pnative clean package
+```
+
Developed by **FedeiaTech**.
\ No newline at end of file
From 7ff07e6c0d693eb0eb5388bced622320fb6d8e62 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 22 Jan 2026 12:24:38 +0000
Subject: [PATCH 5/6] Address code review feedback: remove duplicate build args
and add clean target
Co-authored-by: lmangani <1423657+lmangani@users.noreply.github.com>
---
.github/workflows/ci-build.yml | 6 ++++--
.github/workflows/release-builds.yml | 2 ++
pom.xml | 7 -------
3 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml
index 834c630..c45c66c 100644
--- a/.github/workflows/ci-build.yml
+++ b/.github/workflows/ci-build.yml
@@ -43,7 +43,7 @@ jobs:
ls -lh target/SpriteLab.jar
- name: Build Native Binary with Maven
- run: mvn -B -Pnative package --file pom.xml
+ run: mvn -B -Pnative clean package --file pom.xml
- name: Verify native binary was created
run: |
@@ -127,7 +127,7 @@ jobs:
ls -lh target/SpriteLab.jar
- name: Build Native Binary with Maven
- run: mvn -B -Pnative package --file pom.xml
+ run: mvn -B -Pnative clean package --file pom.xml
- name: Verify native binary was created
run: |
@@ -143,6 +143,8 @@ jobs:
run: |
mkdir -p staging/bin
# Download FFmpeg static build for macOS ARM64
+ # Note: This URL redirects to the latest version. For production use,
+ # consider pinning to a specific version URL with checksum verification.
curl -L -o ffmpeg.zip https://evermeet.cx/ffmpeg/getrelease/ffmpeg/zip
unzip -j ffmpeg.zip -d staging/bin/
chmod +x staging/bin/ffmpeg
diff --git a/.github/workflows/release-builds.yml b/.github/workflows/release-builds.yml
index 872f2ae..5c07598 100644
--- a/.github/workflows/release-builds.yml
+++ b/.github/workflows/release-builds.yml
@@ -104,6 +104,8 @@ jobs:
run: |
mkdir -p staging/bin
# Download FFmpeg static build for macOS ARM64
+ # Note: This URL redirects to the latest version. For production use,
+ # consider pinning to a specific version URL with checksum verification.
curl -L -o ffmpeg.zip https://evermeet.cx/ffmpeg/getrelease/ffmpeg/zip
unzip -j ffmpeg.zip -d staging/bin/
chmod +x staging/bin/ffmpeg
diff --git a/pom.xml b/pom.xml
index 94125e3..1942d4f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -105,13 +105,6 @@
SpriteLab
${exec.mainClass}
-
- --no-fallback
- --report-unsupported-elements-at-runtime
- -H:+ReportExceptionStackTraces
- --initialize-at-build-time=org.controlsfx
- --initialize-at-run-time=com.sun.javafx.application.PlatformImpl
-
From 9eef1ea8593d721a90229dfdfb3e35e81822735a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 22 Jan 2026 12:32:54 +0000
Subject: [PATCH 6/6] Fix native-image build: initialize ControlsFX at runtime
Co-authored-by: lmangani <1423657+lmangani@users.noreply.github.com>
---
.../com.fedeiatech.spritelab/SpriteLab/native-image.properties | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/native-image.properties b/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/native-image.properties
index 4cec14c..a20862a 100644
--- a/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/native-image.properties
+++ b/src/main/resources/META-INF/native-image/com.fedeiatech.spritelab/SpriteLab/native-image.properties
@@ -1,5 +1,4 @@
Args = --no-fallback \
--report-unsupported-elements-at-runtime \
-H:+ReportExceptionStackTraces \
- --initialize-at-build-time=org.controlsfx \
- --initialize-at-run-time=com.sun.javafx.application.PlatformImpl
+ --initialize-at-run-time=com.sun.javafx.application.PlatformImpl,org.controlsfx