IzPack-based installer JAR that installs the same Turboism agent and first-party plugin payload on Windows, macOS, and Linux. The NSIS EXE and Lite/Full ZIP artifacts remain the Windows-native delivery; this JAR is the cross-platform option and requires a Java 17+ runtime.
A release build retains (all under build/windows-installer/dist/):
turboism-<version>-lite.zip,turboism-<version>-full.zip(+.sha256);TurboismInstaller-<version>.exe(+.sha256) — NSIS, preferred on Windows;TurboismInstaller-<version>.jar(+.sha256) — this installer.
./gradlew izPackCreateInstaller \
-PinstallerVersion=<version> \
-PturboismRelease=trueThe installer.xml is generated at build time from each plugin JAR's
META-INF/turboism/plugin.json (missing, malformed, duplicate, or
runtime-owned turboism.core metadata fails the build; order is stable by
plugin id). stageInstallerPayload assembles the shared Windows
source at build/windows-installer/staging for the NSIS installer and ZIPs.
stageJavaInstallerPayload copies that source to
build/java-installer/staging for the Java installer payload.
Pinned toolchain (no dynamic versions): Gradle plugin org.izpack.gradle
3.2.3 and org.codehaus.izpack:izpack-ant 5.2.6. Their SHA-256 entries live
in gradle/verification-metadata.xml.
java -jar TurboismInstaller-<version>.jarFlow: Welcome -> MIT License -> four required Turboism runtime-declaration acknowledgements -> full localized runtime declaration -> Full/Thin/Lite -> optional plugins (Full and Thin) -> target directory -> summary -> install -> finish. Full defaults
every first-party plugin to selected. Thin installs the complete plugin roster
without an additional native runtime payload; it also accepts an explicit
custom executable path. The first-party loopback MCP server is available on
supported Windows hosts with bearer authentication and per-user,
owner/file-type, reparse-point, secure-temporary-file, and post-move
publication checks. Lite installs the agent and common files with
no plugin JAR. Default home: %LOCALAPPDATA%\Turboism (Windows),
~/Library/Application Support/Turboism (macOS),
${XDG_DATA_HOME:-~/.local/share}/Turboism (Linux); another directory may
be chosen.
The declaration gate is the same contract in GUI, console, and automated modes: all four acknowledgements must be explicit before the full localized declaration is accepted. The acknowledgements cover Turboism's independent third-party identity, lawful Cubism authorization, independent backups before authorized content-changing automation, and open-source as-is operation without compatibility or recovery guarantees.
config.json has explicit update ownership. A fresh installation creates the
current schema from the bundled template and initial plugin selection. On an
existing valid v1 document, the installer changes only disabledPlugins; all
other user settings remain intact, and a selection that is already current
leaves the original bytes untouched. A recognized legacy v0 document is
migrated to v1, validated against the complete runtime schema, and then receives
the selected plugin state in the same atomic publication. Malformed, unknown,
future-schema, or runtime-invalid documents fail closed before payload mutation
without modifying the original. Retired JAR cleanup remains identity-verified
and independent of config migration; any leftover retired JAR is denied by the
runtime PluginJarContract boundary because the installer deletes only
identity-proven retired JARs and never deletes unverifiable entries. Invalid,
oversized (> 64 KiB), symlinked, escaping, or non-regular config targets fail
closed without truncating the original; reads are bounded and never follow
symlinks, and writes use atomic replacement only. Unknown or third-party plugin
files are never deleted.
Rerun the installer to apply a different plugin selection.
On Windows, the staged payload also includes configure_turboism.ps1 and cubism-launch-common.ps1. After installation the configurator opens automatically, lists only exact supported Cubism Editor 5.2.03, 5.3.02, and 5.3.03 installations, and presents independent controls for Turboism-owned shortcuts and official Cubism BAT integration. BAT integration runs only for exact installations selected by the user, records a hash-guarded backup, and cleanup restores only hash-matching managed files; user edits or malformed state are conflicts and preserve state/backups for retry. The configurator writes actionable diagnostics under logs/installer/.
The installer generates Uninstaller/uninstaller.jar under the home
directory. The uninstaller removes the installed agent, installer-owned
plugin JARs, installer-owned launch/configuration files, the generated
uninstaller, and the runtime logs, state and cache directories.
config.json is removed only when selected (en/zh/ja/ko confirmation,
default keep; closing the dialog without choosing also preserves it). Windows
takeover records are restored from exact backups before those records or
the home can be removed. A user-edited shortcut, invalid state, or failed
atomic restoration preserves the shortcut, state, backups, and home for a
later retry. Unknown files and third-party plugin JARs are preserved; the
home directory is removed only when empty. Custom cleanup runs only when the
uninstaller path proves the exact <home>/Uninstaller/uninstaller.jar
layout; a missing or malformed identity performs no custom deletion and
never falls back to the working directory.
- Windows:
java -jar <home>\Uninstaller\uninstaller.jar - macOS: double-click
uninstall.commandin the home directory (launches the interactive uninstaller) - Linux:
java -jar <home>/Uninstaller/uninstaller.jar
Non-interactive (console) runs pass the property and -console explicitly,
e.g. java -Dturboism.uninstall.deleteConfig=false -jar <home>/Uninstaller/ uninstaller.jar -console.
./gradlew checkJavaInstaller \
-PinstallerVersion=<version> \
-PturboismRelease=trueDeterministic, non-GUI (console mode), runnable on Linux/macOS/Windows with
Java 17. It builds the installer and verifies: JAR layout (en/zh/ja/ko
langpacks, uninstaller, one required common pack, one optional pack per
non-core plugin), Lite and Thin installs, Full install with deselects on a
reviewed platform, compiled listener policy behavior for Full installs on
Windows and for Thin/Lite admission, config selection/migration and
fail-closed cases (strict numbers, ASCII-only Unicode escapes, canonical v1
identity, invalid v1 values, malformed UTF-8, size boundary), and both uninstall branches
with a synthetic
third-party plugin file preserved. Every captured
JVM runs with a task-owned java.io.tmpdir and -Dfile.encoding=UTF-8;
all subprocess text is decoded with explicit UTF-8, so the live en/zh/ja/ko
locale probes are byte-deterministic on any host. The global IzPack lock
path (<tmp>/iz-Turboism.tmp) is never created, written or deleted by the
verifier — a read-only snapshot asserts it is untouched (absent stays
absent; a pre-existing file/symlink/special path stays byte/target/mode-
identical).
The installer UI ships in English, Simplified Chinese, Japanese and Korean
(eng, chn, jpn and kor langpacks in installer.xml). With more than one
langpack present and no -language argument, IzPack opens its modal
language-selection dialog before the first panel; passing
-language eng|chn|jpn|kor preselects a language and skips that dialog. No
Korean EULA translation exists, so LicencePanel.eula_kor resolves to
EULA.en.txt while the rest of the Korean UI stays translated.
macOS CI: the manual workflow
.github/workflows/macos-packaging-verification.yml (Apple Silicon and
Intel, Java 17, pinned Actions) runs only checkJavaInstaller.
- macOS packaging: Preview
- macOS Cubism host: not verified
- Linux Cubism host: not supported; Linux covers installer/payload semantics only
No macOS Cubism launch command is installed, and no host-readiness claim is made for macOS or Linux.