Current distribution: 0.6.0-alpha.2 (9 November 2026)
The current upload is modern Paper only. Install ForgeGuard-0.6.0-alpha.2-obfuscated.jar with the separate official PacketEvents 2.14.0 dependency. No 0.6 universal/legacy JAR is included.
- Primary gameplay fixture: Paper 1.21.11 build 132, Java 25 and generated native Java 1.21.11 clients. The server's minimum is Java 21. Read the current VALIDATION.md section for the final artifact results.
- Paper 26.3: Java 25 is required by Paper. A separate boot/console check is recorded in VALIDATION.md; it does not qualify native 26.3 gameplay or detection. The experimental packet movement model stays unavailable outside native 1.21.11.
- Not qualified by this release: legacy Bukkit/Spigot, native 1.7/1.8, intervening versions, ViaVersion combinations, Folia, Bedrock, production player load or broad false-positive rates. Forge/Fabric/NeoForge mod hosts cannot load this Paper plugin.
PacketEvents 2.14.0 adds 26.3 protocol support. Paper's requirements specify Java 25 for 26.1+. Dependency protocol support and a successful plugin boot do not establish gameplay qualification.
Historical universal distribution (0.4 and earlier)
Everything below records earlier named artifacts and dates. It is not the 0.6.0-alpha.2 installation guide or support claim.
Updated 24 September 2026 (Australia/Sydney). One distribution JAR now contains a Java 8 bootstrap, a portable Bukkit staff adapter, and the protected modern ForgeGuard core. This makes one installation artifact possible without pretending every runtime can execute the same APIs or detection models.
Native 1.7-through-current anti-cheat coverage is not complete. The earliest native gameplay test is Spigot 1.8.8. Native 1.7, the intervening server releases, and every translated client/server combination are not qualified. The portable adapter provides moderation; it has no anti-cheat detection engine. /fg capabilities states the selected mode.
The new visual gameplay recorder is restricted to the updated standalone modern core on native Paper 1.21.11. The portable adapter, other native versions and Folia do not expose it. Earlier universal release archives below have not acquired this feature merely because the website was updated. See Gameplay recordings for the actual scene and capture limits.
What the single JAR does
Install the packaged ForgeGuard-0.4.0-alpha.1-universal.jar as the only ForgeGuard JAR in the server's plugins directory. The developer output compatibility/universal/dist/ForgeGuard-0.4.0-alpha.1-universal-obfuscated.jar is the same protected universal artifact before release packaging. Do not install the standalone core beside it.
| Native server/runtime | Selected capability | Qualification |
|---|---|---|
| Spigot 1.8.8, Java 8 | Portable staff GUI, player/inventory/ender snapshots, teleport, timed freeze, reviewed kick/temporary ban/permanent ban/unban, UUID ban enforcement and audit | Native generated-client regression; exact server JAR recorded in evidence |
| Bukkit/Spigot/Paper 1.7.10–1.21.10 with Java 8+ and a JVM suitable for that server | Portable staff adapter candidate | Other exact releases are unqualified; no detection engine |
| Paper 1.21.11, Java 21+, PacketEvents 2.13.0 | Embedded modern staff/protection runtime; limited native 1.21.11 movement observation | Protected universal native generated-client smoke: staff GUI, moderation, bridge/configuration and limited movement case/replay checks; broader detection qualification remains incomplete |
| Paper 26.1.x/26.2, Java 25+, PacketEvents 2.13.0 | Embedded modern runtime; movement observation unavailable on these native server models | Paper 26.2 build 128 boot and console checks; native 26.x player gameplay remains unqualified |
| A Bukkit-compatible server without the modern runtime prerequisites | Portable staff adapter | Missing modern prerequisites do not silently enable detections |
| Paper 26.3 and future releases | Portable staff candidate, with unavailable detections | Experimental/unqualified; PacketEvents 2.13.0 release notes establish 26.2, not 26.3 |
| Folia | Refuses to enable | Region-safe moderation and inventory workflows are not qualified |
| Forge/Fabric mod servers, Vanilla servers and proxy hosts | Cannot load this Bukkit plugin artifact | Separate host integrations are required |
The bootstrap itself uses Java 8 bytecode. The server still requires its own appropriate JVM. Current Paper 26.1+ requires Java 25. See Paper's Java requirements. A plugin's bytecode floor does not lower the server's Java requirement.
PacketEvents is an external server dependency for the modern runtime. The universal JAR contains both ForgeGuard implementations; it does not bundle an extra copy of PacketEvents. Its enabled version must be the pinned 2.13.0 before the modern core is selected. Missing/unqualified dependency versions select clearly labelled portable staff tools.
Data and upgrades
The bootstrap appears as ForgeGuardLoader; the embedded modern plugin appears as ForgeGuard when active. The loader extracts its protected core below its own data directory so the server does not discover a second top-level plugin JAR on the next restart.
- Portable staff configuration:
plugins/ForgeGuardLoader/config.yml. - Portable staff audit:
plugins/ForgeGuardLoader/staff-audit.tsv. - Embedded modern configuration/evidence:
plugins/ForgeGuard/. - Shared UUID bans for both adapters:
plugins/ForgeGuard/moderation/bans.json.
Both adapters use the same version-1 ban document, UUID identities and expiry timestamps. A version/dependency change that selects a different adapter does not discard stored bans. Writes are flushed and atomically replaced before the new login snapshot is published; failed writes leave the prior snapshot intact. The portable database is bounded to 10,000 active bans and a 16 MiB input file. Freeze state retains its original deadline across a disconnect/reconnect, but is intentionally released when the plugin/server stops.
Paper assigns the embedded core its normal plugins/ForgeGuard data folder even though its JAR is nested. Existing standalone ForgeGuard configuration and bans therefore remain in place. The loader verifies that the actual core data folder matches this path before enabling it; it refuses an unexpected folder rather than splitting ban enforcement. The core's existing SentinelForge migration still applies to the sibling plugins/SentinelForge directory. Extraction does not copy or overwrite an existing configuration directory.
Portable permissions use the same forgeguard.staff, forgeguard.inventory, forgeguard.freeze, forgeguard.kick, forgeguard.ban, forgeguard.unban, forgeguard.teleport, forgeguard.admin, forgeguard.protected and forgeguard.override names. Protected/override permissions default false. The bootstrap and embedded core declare identical permission defaults and wildcard children, including explicit false defaults for detection bypass. The build rejects descriptor drift. Runtime initialization rejects conflicting registrations and installs missing declarations; on old Bukkit, portable initialization waits for the first server tick so normal descriptor registration finishes first. Initialization failures explicitly disable the loader. Inventory displays contain cloned items and reject click/drag extraction. Destructive actions require an expiring, actor-bound confirmation and recheck permissions and the target connection before execution. Portable command syntax is listed by /fg help; the modern runtime has its broader /fg staff ... commands.
Connectivity is a separate question
ViaVersion translates newer clients to older server protocols; ViaBackwards supports older clients on newer servers; ViaRewind adds 1.7/1.8 client connectivity. None makes a modern Paper plugin run on a native 1.7 server. Likewise, accepting a 1.7 client on Paper 1.21.11 does not create a 1.7 movement/collision model. Client translation needs its own gameplay and false-positive tests.
As researched on 23 September, the official Paper downloads list 26.2 build 128 as stable and 26.3 as experimental. PacketEvents 2.13.0 documents 26.2 support. ViaVersion 5.12.0 adds 26.3 client translation. These are independent release and qualification boundaries.
Reproducing qualification
Run from the SentinelForge project directory with Python 3.10+ and the appropriate Java installations. The tools do not edit an existing server, change the real project POM, deploy anything, or fetch arbitrary server distributions.
python -m unittest discover -s compatibility -p 'test_*.py' -v
python compatibility/universal/check_permissions.py --label unique-permission-label
python compatibility/preflight.py --plugin <ForgeGuard-JAR> --server-version 1.8.8 --server-flavor spigot --java-major 8
python compatibility/preflight.py --plugin <ForgeGuard-JAR> --server-version 26.2 --java <Java25-executable> --dependency <PacketEvents-2.13.0-JAR> --output compatibility/results/preflight.json
python compatibility/compile_probe.py --paper-api 26.2.build.124-stable --java-home <Java25-directory> --label unique-compile-label
python compatibility/boot_probe.py --source-server <cached-server-fixture> --plugin <ForgeGuard-JAR> --dependency <PacketEvents-JAR> --java <Java-executable> --server-version 26.2 --label unique-boot-label --port 26094
preflight.py reads plugin manifests, class-file versions, required dependencies and target inputs. Its successful result is no known static blocker, never “fully supported.” It does not prove every runtime method link or gameplay behavior.
compile_probe.py snapshots current sources, changes only the isolated POM's API version and repository identity, then compiles offline. It records source hashes and compiler output. Successful compilation does not imply correct behavior on that API.
boot_probe.py requires a source fixture with an already accepted Minecraft EULA. It creates a fresh, loopback-only server, hardlinks immutable cached runtime JARs where supported, starts the selected artifact, runs health/help commands and shuts down. Mutable worlds and configuration are never shared. It refuses existing fixture labels and occupied ports. Results include plugin, dependency and server hashes. Server boot/console checks do not qualify player GUIs or detection.
compatibility/universal/live_legacy.cjs uses the project's existing Mineflayer fixture dependency to test a native 1.8.8 client against a new Spigot 1.8.8 fixture. Set FORGEGUARD_UNIVERSAL_JAR, FORGEGUARD_COMPAT_LABEL and optionally FORGEGUARD_COMPAT_PORT; then run node compatibility/universal/live_legacy.cjs. It covers permission denial, inventory extraction cancellation, ender contents, timed freeze and reconnect, stale/expired confirmation rejection, UUID ban persistence across a full restart, unban and audit records.
Evidence lives in compatibility/results/; runtime copies are excluded under compatibility/.lab/. Earlier failed experiments remain diagnostic evidence, not passing qualification. Final results must match the distributed artifact hash.
The historical 0.3.0-alpha.1 qualification is preserved in compatibility/qualification-0.3.0-alpha.1.json, SHA-256 7cf09d2455581f78c71671a2653f01acdf83f4ab3dd67e74640778e39d8fc357. Its embedded protected core is 4622e2a81c7396ee197df6c8377ea35907e38633ed7f90365476749ead14fc36. That exact universal JAR passed all 11 native Spigot 1.8.8 staff scenarios, Paper 1.21.11/26.2 boot/health/shutdown checks, and recognition of an actual portable UUID ban by the modern runtime. Its source snapshot compiled against cached Paper API 26.2 build 124, and its independent preflight suite passed 12 tests. These historical results do not qualify a different artifact, native 1.7 or complete anti-cheat coverage.
record_qualification.py rejects failed reports, mismatched artifact hashes, changed source snapshots, missing cross-adapter ban recognition and an embedded checksum mismatch before writing the qualification manifest.
0.4.0-alpha.1 qualification
The protected universal 0.4.0-alpha.1 artifact is recorded in compatibility/qualification.json, SHA-256 40896e39b5e7d339d822185672437ed2e2bc421f22d8edaec9e331a8dd93c63f. Its byte-identical embedded protected core has SHA-256 394de5b5176a30f01bfeaa9912c8931815ece581e5e6555e840a8bd4f16f1d7e.
On 24 September 2026, that exact JAR passed:
- Spigot 1.8.8 / Java 8: startup, portable adapter selection, console health/help and clean shutdown. Boot evidence.
- Native generated 1.8.8 client / Spigot 1.8.8: all 11 existing staff regressions, including inventory extraction prevention, ender snapshots, freeze/reconnect, confirmation rejection, UUID ban enforcement across a full restart, unban and audit. Gameplay evidence.
- Paper 1.21.11 build 132 / native generated client / PacketEvents 2.13.0: all 10 protected-universal smoke checks, including operator movement observation, a reproduced 120-frame case, read-only inventory, freeze/unfreeze, ban/unban and live gateway/configuration checks. Modern smoke evidence.
- Paper 26.2 build 128 / Java 25 / PacketEvents 2.13.0: startup, embedded modern adapter selection, console health/help and clean shutdown. Boot evidence.
The protected outer and embedded manifests match all 20 permission declarations. The Python preflight/manifest suite passed 18 tests, and the actual Bukkit permission-manager harness passed 12 Java 8 checks covering OP defaults, wildcard children, idempotence and conflict rejection. Manifest evidence, runtime evidence. The earlier 0.4 wrapper qualification is retained as superseded evidence; its missing permission defaults do not qualify the final build.
The new fixtures used cached server JARs and hardlinks to immutable runtime libraries, with separate generated worlds and configuration. Their server and plugin hashes are retained in the reports. All fixture processes stopped cleanly. The 26.2 run contains no native client gameplay, GUI or detection qualification. Portable 1.8.8 remains staff-only; native 1.7 and every-version anti-cheat coverage remain unqualified. Historical 0.3.0 checks have not been relabelled as 0.4.0 evidence.
Remaining adapter work
The current bootstrap solves distribution and basic staff portability. Reliable universal detection still requires explicit per-version adapters:
- 1.7–1.12: Java 8 domain types, legacy packet acknowledgements, numeric material/block states, inventory transaction semantics, native collision/movement models and combat timing.
- 1.13–1.16: flattened block states, fluid/swim behavior, versioned collision shapes and material conversions.
- 1.17–1.21: Java/API transitions, world-height changes, scheduler differences, item components and versioned movement/combat rules.
- 26.x: Java 25 server/API qualification, protocol/registry changes and native client fixtures.
Keep player identity, confirmed staff intent, UUID ban schema and audit records independent of these adapters. Every detection model needs legitimate gameplay, latency/loss/reordering, load and controlled exploit regressions on the exact native server/client pair before it can justify enforcement. Neither “one JAR” nor an edited api-version replaces that work.