Repository navigation
9.0.0-alpha.6
Pre-release
Pre-release
⚠ BREAKING CHANGES
- modscanning: remove the deprecated JsonBasedScanner
✂️ Refactor
- adopt the Kotlin idioms Qodana flagged (d37fc61)
- collapse the redundant conditionals Qodana flagged (4e16694)
- use multi-dollar string literals for dollar-heavy patterns (98942b1), closes #106
- api: compile the Forge annotation-scanner's regexes once (10a5811)
- api: extract how a timeout is applied into URL.timedConnection (555e9c7)
- api: extract manifest refreshing into ManifestUpdater (832bf43)
- api: hoist the per-file path resolution out of the gatherer's walk (0e97be4)
- api: index the Quilt scan by jar instead of searching it per entry (fca71d3)
- api: inject PathsConfig's working directory (3c068ce)
- api: make ModpackZipInspector's archive-opening injectable (8e0c840)
- api: make the launcher-manifest candidates askable (765e1d5)
- api: narrow ManifestUpdater to internal, and correct the timeout landmine (342e630)
- app: extract the upload duplicate-check from saveUploadedFile (aa763be)
- app: move the check-timer's server probe and pack-name read behind the view model (d6be4b5)
- app: put the migration's database access behind MigrationStore (5afd12c)
- app: split the suggestion parse out of allSuggestions (dd4c217)
- grinder: drop the bind guards' !! and over-tight exception type (ad7aff5)
- grinder: extract the Preferences-node claim from main() (7cd43b5)
- grinder: extract the report URL from main() (e04c02e)
- modscanning: extract the scanner contract and share the dispatch (d04a62a)
- modscanning: remove the deprecated JsonBasedScanner (d132522)
- web: extract the config-location composition from start() (18f25c6)
📔 Docs
- add a CI secrets reference for the Forgejo workflows (5eeb4a7)
- add BUILD.md, a contributor-facing map of the build (fd8d674)
- add Kent Beck's ordering mantra to the conventions (52a192c)
- answer the Docker/Mongo investigation's open question (21bab7f)
- audit iteration 12 — the systemd home-resolution branch, and its resolutions (3e873af)
- audit iteration 13 — the report bind-address branch, and its resolutions (1db4b60)
- audit iteration 15 — third pass, auditing the first two passes' fixes (8ffc8bf)
- audit iteration 16 — the deployment script and unit (03524c2)
- audit the build-docs branch (fa3cdd1)
- audit the context/documentation commits (iteration 10) (08728c2)
- audit the coroutines/catalog branch, fourth pass (9560ec0)
- audit the parallelMap/coroutines branch, post-remediation pass (b33da60)
- audit the post-migration commits (iteration 8) (3db2fcc)
- audit the readme-refresh and jpa-relics branches (c97ac45)
- audit the remediation (iteration 9) (47bfaf0)
- audit the security-manager branch, second pass (141dc20)
- backlog the CLAUDE.md trim, deferred behind the open merges (3256fef)
- bring root CLAUDE.md back under the large-memory floor (5f7298b), closes #1 #2
- carry iteration 4's guards into the refactor-state table (35bcbdb)
- carry iteration 6's guards into the refactor-state table (34331ad)
- cite commit subjects in the audit report too, and record iteration 4 (f971438)
- cite commit subjects instead of hashes, and correct the stale timeout landmine (2052180)
- clear B30/B31/B32 from the backlog and record them (d37be2d)
- close L3 in the audit after fixing it (8f3a51f)
- close out audit findings H-1 and M-3 (1f7aef2)
- close out the audit findings (96b802a)
- Consolidate the two audit files into claude-docs/REFACTOR-AUDIT.md (eda82e2)
- correct the id types in the published API spec (8796eaa)
- correct the last copy of the clientside-workflow miscount (f9c9d88)
- correct the marker rule — B35 was tried and does not work (0138f87)
- correct the published run-configuration API shape (f391518)
- correct two CLAUDE.md claims that outlived the backlog items behind them (6f7e95c)
- load the build and CI landmines only when they apply (8dd6af0)
- mark the lazy-loading saving as unverified, because it is (6c94565), closes claude-code#16299 #16299 #22170 #16299
- point BUILD.md at where CI lives and what it needs (882f967)
- record iteration 16's resolutions, and the JVM trap in the README (845fb63)
- record M-2 as fixed and repair a stray edit in the audit (d56bb4e)
- record that URI query parameters reach the driver again (a7cf04a)
- record the build layout after the simplification (24e00c5)
- record the catalog, [plugins] and Kotlin-unification work (57ba3f2)
- record the equivalence audit, its method, and the two findings it surfaced (3e70bb4)
- record the generation-throughput work, including the corrected estimates (53f3e12)
- record the grinder's report bind address in the status table (7033c23)
- record the GUI typing-path work (613b9ec)
- record the index-creation landmine and iteration 5 (2955212)
- record the network/startup work and backlog its follow-ups (aea1ea5)
- record the parallelMap fix, the coroutines floor and the BOM landmine (1cc6c4b)
- record the Qodana moderate cleanup and the two new pins (d280474)
- record the render-vs-prop test rule, and why the tooltips stay untested (b0ee703)
- record the systemd home-resolution trap and the ordering it depends on (bb6545b)
- record the two API-shape changes the generation branch left unrecorded (17a621e)
- record the web query-shape and DBRef-flattening work (e484a28)
- record what actually blocks the configuration cache (5fc3ca3)
- regenerate the API spec for the merged entities, and correct the suite counts (f158362)
- regenerate the OpenAPI spec from the controllers (ef13d48)
- stop CI-SECRETS.md pinning an install4j version it does not own (9832ace)
- the paths: scoping works — verified, and the earlier test was the wrong one (fb96ea3), closes #16299 #22170
- api: make the SKIP_JAVA_CHECK read intentional and guarded (c0b1457)
- app: re-verify the Mongo URI landmine at the versions now resolved (e3289e3)
- ci: record the release pipeline's two silent killers and the alpha-tag repair (7780da5)
- deprecation: suppress the intentional 6.0.0 deprecation warnings (9f92e8a)
- modscanning: record the scan-log-level rules (4f67393)
- modscanning: record the shared dispatch and correct the versioning-scheme survey (d76e2ed)
- readme: refresh stale content (d1ece9b)
- updater: record the pre-release ordering fix (486976e)
📦 Other
- Change logging to suggest report to author and include exception in log (6026f36)
- ignore Claude Code's per-developer files (f32c820)
- Please Please Please test your server packs before you release them (d858b8f)
- Refactor audit thanks to Claude (bd62619)
- Regenerate the license agreement for install4j-runtime 13.1 (1c90465)
- Update-To-Date license agreement (2611aed)
- web: drop the JPA/H2/JDBC relics from the Spring properties (24390e3)
🦊 CI/CD
- add a [plugins] catalog section and alias it from the build scripts (a8f1588)
- align springGradle with springBoot at 4.1.0 (f4dec99)
- Bump install4j to 13 (2c8de2c)
- bump Kover to 0.9.9 (96cb684)
- bump the Kotlin compiler to 2.4.10 (f0bf003)
- bump third-party library versions in the catalog (e55ddfe)
- collapse the four Kotlin entries onto one version ref (2be03f8)
- consume plugin markers in buildSrc instead of implementation artifacts (6325735)
- declare repositories once, in settings.gradle.kts (260f6f0)
- drop the orphaned io.spring.dependency-management plugin (66c77c0)
- let Gradle provision the JDK for the modules, not just for buildSrc (efcfbc8)
- move library versions into the version catalog (010e2f3)
- move the version catalog to gradle/libs.versions.toml (3e4afb9)
- remove cross-project configuration from the root build (689e4dc)
- remove duplicated and dead build logic (7511673)
- remove script-object captures from task actions (0c3da90)
- replace plugin-example's configuration-time copies with a Copy task (2c48f22)
- replace the configuration-time copies with real Copy tasks (2eccd20)
- route nekodetector and the Boot BOM through the catalog (b4e6fe9)
- scope publishing and signing to the api module (5992f57)
- upgrade Gradle to 9.7.1 (2f6894a)
- use lazy task references everywhere (45bce07)
- fix the credentials and references the migration got wrong (d894362)
- fix the ordering and re-run defects the first release would have hit (dfd4352)
- make the Docker diagnostic name its runner, and record what B26-B29 still need (e295ee0)
- move CI/CD to Forgejo, and retire GitLab CI (832eb46), closes forgejo#9203
- stop a release publishing its prereleases' changelogs, and fail loudly on upload errors (d00d094)
🧪 Tests
- make three guards that passed for the wrong reason actually bite (d3b20a0)
- api: pin hasteBinPreChecks before it stops reading whole files (522ab1e)
- api: pin home resolution against an unwritable working directory (ada7476)
- api: pin how often a modpack archive's central directory is read (e79f0ee)
- api: pin that a fresh install's fallback database-URI is usable (594cf5a)
- api: pin that an unknown Java version drops the security-manager flag (0ff2784)
- api: pin that an unreachable host leaves the present manifest intact (a189022)
- api: pin that HTTP calls give up instead of hanging forever (13a4b97)
- api: pin that parallelMap neither leaks a thread nor serialises (e55ba89)
- api: pin that the fallback-list refresh gives up instead of hanging (8ba6484)
- api: pin that the regex mod-lists are not shared between reads (40b0934)
- api: pin that the writability probe cannot be defeated by a name collision (af939d0)
- api: pin the cost of the clientside-exclusion loop (ac50171)
- api: pin the Java-resolve and fail-safe guard in all three templates (63a0860)
- api: pin what a manifest check costs (7dedca7)
- app: assert the components that only work if Spring created them (a9ddf98)
- app: characterize the EventService and RunConfigurationService store loops (d603378)
- app: characterize VersionChecker's pre-release comparison (ec79084)
- app: cover the migration runner's safety decisions (f021610)
- app: pin how often the check-timer consults the network and the disk (6537259)
- app: pin that a duplicate hash cannot break the upload check (7965520)
- app: pin that an upload's duplicate-check does not scan the collection (57090e1)
- app: pin that index creation is never a condition of starting up (ff83e6d)
- app: pin that the autocomplete list is parsed once, not per keystroke (1e9c748)
- app: pin that the database-URI key is one Spring Boot still reads (a2cdb9e)
- app: pin that the declared upload-hash index is actually created (3a7efd6)
- app: pin that the stats endpoint counts instead of scanning (0e0fc76)
- app: pin that the update check gives up instead of hanging (b58f866)
- app: pin the 9.0.0 migration for the renamed database property (4a84834)
- app: pin the migrated collection's name against the mapping it mirrors (c7e9a40)
- app: pin the two VersionChecker pre-release comparison defects (866c139)
- app: read the shipped application.properties, not the test copy that shadows it (8ad9f2f)
- frontend: assert the rendered mod-lists, not the props they came from (15b7754)
- grinder: bound the ordering guard to main's own body (b4f5c4e)
- grinder: pin that an already-bracketed IPv6 bind is not bracketed twice (badcc93)
- grinder: pin that the SPC environment is claimed before the first log statement (4624a57)
- grinder: pin that the unit tells the operator how to provide Java (68046d4)
- grinder: pin the logged report URL for wildcard and IPv6 binds (041d3f9)
- grinder: pin the report's bind address and its wiring (7b8e762)
- grinder: pin the systemd unit against the variables the service reads (c618340)
- modscanning: pin Forge scanner selection across both Minecraft schemes (f8cb89b)
- modscanning: pin that a Forge mod without dependencies keeps its id (b0e52a3)
- modscanning: pin the shared scanner dispatch directly (9a37368)
- web: pin the eight-location Spring config chain (d321722)
- web: replace WebServiceTest with a real application-context test (c8b5512)
🚀 Features
- api: add configurable network timeouts (8af3540)
- api: offer an ETag so the Forge manifest can answer 304 too (71c83c1)
- app: add an indexed findBySha256 to the modpack repository (26f342e)
- app: report the renamed database property when upgrading to 9.0.0 (2f91f5f)
- build: cross-package the aarch64 AppImage, so it needs no arm runner (ee766bb)
- ci: expire test.yml's artifacts instead of keeping them for 90 days (5b32620)
- ci: link the Qodana report artifact from Discord, not the run page (1cd2ac2)
- ci: put the report's expiry in the Discord message as a Discord timestamp (420a46b)
- grinder: make the report's bind address configurable (f91cedf)
- grinder: ship an example systemd unit and an installer (f9a0494)
🛠 Fixes
- If no (Neo)Forge or Minecraft dependency is declared, assume sideness server (7abd7c8)
- api: bound the fallback-list refresh (733db7c)
- api: halve startup requests and skip unchanged manifests (5f92b63)
- api: hand out a fresh regex mod-list per read (9b00946)
- api: make the fallback database-URI a URI the driver accepts (add8982)
- api: measure a HasteBin candidate without materialising it (b5add6c)
- api: never resolve the home directory to a place SPC cannot write (b470496)
- api: probe writability with a name nothing else can hold (79c34df)
- api: read a modpack archive once per inspection (cd75f24)
- api: refresh the version manifests in the background, not during construction (211dc83)
- api: resolve Java after installing it, and fail safe when it is unknown (5f4bce2)
- api: route every outbound call through one timed opener (5625223)
- api: route the HasteBin POST through the shared opener too (e1a593e)
- api: sanitise a network timeout once per assignment (9ef4191)
- api: stop a bad regex aborting the mod-list, and hoist the loop invariants (f77a5c6)
- api: stop parallelMap leaking a thread per call, and make it parallel (ae18f56)
- api: write the database-URI under the key Spring Boot 4 actually reads (f509eed)
- app: bound the update check's requests (27f544b)
- app: cache the autocomplete parse, and stop reinstalling the LAF per keystroke (a7b3ff9)
- app: count the stats totals instead of scanning three collections (13467fc)
- app: create the declared indexes after startup, not during it (93cee51)
- app: create the indexes the web module declares (327e458)
- app: embed the run-configuration mod lists, and migrate what is stored (918ca03)
- app: key the installer-probe memo on a Triple instead of NUL-delimited text (bc6c78c)
- app: look an upload's hash up by index instead of scanning every modpack (4f82e4b)
- app: stop the check-timer re-probing the network and re-parsing the manifest (e4ec252)
- app: tolerate duplicate hashes in the upload duplicate-check (1b287ab)
- build: declare mockk explicitly in -app so it matches -api (e732079)
- build: declare the Java compilations on dokka's HTML publication too (dbcb80c)
- build: import Boot's BOM as a platform so the catalog wins (3ab1abe)
- build: keep the install4j plugin off buildSrc's compile classpath (6969313)
- build: replace the Gradle APIs 9.7 deprecates and 10 removes (8a795b4)
- ci: drop the Qodana Cloud token the project cannot have (d4af07b)
- ci: keep the Forgejo token out of release-generate's remote URL (20cd6ed)
- ci: make the sibling-container steps work under docker-in-docker (d21caeb)
- ci: pin semantic-release's plugin majors so a preset bump can't break the release (97f487e)
- ci: rename the Forgejo credentials off the reserved FORGEJO_ prefix (710e8ea)
- ci: scope the Forgejo credential to the checkout, not the runner (5039fd7)
- ci: stop running jobs inside tool containers, and drop the inert permissions (5bc0434)
- ci: use Forgejo's patched artifact actions, which do not refuse a non-GitHub host (8830248)
- docs: repair the broken KDoc links and drop a redundant inner modifier (b5dec4d)
- grinder: close every finding from audit iteration 16 (70a10fd)
- grinder: don't bracket an already-bracketed IPv6 bind, and stop --help truncating (6d4a86c)
- grinder: harden the installer, and record audit iteration 14 (f158699)
- grinder: make the logged report URL openable for wildcard and IPv6 binds (43249a6)
- grinder: pin SPC's home to the daemon's base before anything logs (d4eec4b)
- modscanning: log a jar with no descriptor at debug, keep real failures loud (30bcdc6)
- modscanning: select the Forge scanner from the whole Minecraft version (4dbf653)
- modscanning: treat an absent dependencies block as no dependencies (46a8a7b)
- updater: order pre-releases by channel, and pick the latest by version (f6df209)
VirusTotal
ServerPackCreator-9.0.0-alpha.6.jar- https://www.virustotal.com/gui/file-analysis/NmI1ZDczZWM4MjAyNTliZTZmODJiMTk5Mzc1YTcyN2Q6MTc4NzQ3OTAxMg==serverpackcreator-api-9.0.0-alpha.6-javadoc.jar- https://www.virustotal.com/gui/file-analysis/ZjQzNDM2ZDZiZWMzMjEyOTBmNmFmMjI4YWQ2MDI2MDQ6MTc4NzQ3OTAxMg==serverpackcreator-api-9.0.0-alpha.6-sources.jar- https://www.virustotal.com/gui/file-analysis/ZTNmYTZiZTVkZDRjZmZlYWYxNTg3OWE0YzU5NTQ3OWU6MTc4NzQ3OTAxNA==serverpackcreator-api-9.0.0-alpha.6.jar- https://www.virustotal.com/gui/file-analysis/NTY5NjliNGY2OGE5NmEzNTM4MWNjNWYyMGE4ZmQxN2Y6MTc4NzQ3OTAxOA==serverpackcreator-app-9.0.0-alpha.6-javadoc.jar- https://www.virustotal.com/gui/file-analysis/YjgyYjc3MTMyMzJmNzBkYTI1MzllZjZhMzgxODMyMTg6MTc4NzQ3OTAyMA==serverpackcreator-plugin-example-9.0.0-alpha.6.jar- https://www.virustotal.com/gui/file-analysis/NzJhOTE3OTBlNGMwN2Y3YzQ2ZGVlYzE2MGI1NTEwYmM6MTc4NzQ3OTAyMQ==