Repository navigation
Releases
v2.3.2
VonixGuardian v2.3.2
Server-side block, inventory, and entity auditing with rollback tools for modded Minecraft.
Highlights
Taken from CHANGELOG.md section [2.3.2]. Schema version is 9.
Rollback of a used container no longer fails. A live server logged 257 failed rows in a
single batch — every CONTAINER_WITHDRAW and CONTAINER_DEPOSIT — and left the batch open
with REPAIR_REQUIRED.
Fixed
- A container rollback insisted on the exact slot it recorded. Returning items to a chest
is not the same as returning them to one coordinate: by the time an operator runs the
rollback the chest has been used again, so that slot holds something else, or holds the same
item but is full. The mutator refused in both cases, which is why one batch failed hundreds
of rows at once. It now places the stack wherever it fits — topping up matching partial
stacks first, then any empty slot — and fails only when the container is genuinely full.
Applied to all thirteen loader cells; the container code is duplicated per cell, and the
first pass fixed only 1.18.2 Forge. - The failure line now names the row's data. The old message was
mutation unsuccessful for action id=14356372 type=CONTAINER_WITHDRAW, repeated 257 times.
It could not distinguish a missing container from a full one from one holding different
items — three different problems with three different fixes. It now reports world,
position, target item, amount and slot.
Added
- A boundary guard fails the build if any loader cell loses the anywhere-fallback, which is
what caught that the first pass had fixed only one of thirteen.
Verification
- 1,531 tests, 0 failures on the core module.
- All thirteen cells rebuilt and packaged: 1.18.2 through 26.3 on Fabric, Forge and NeoForge.
- Not verified on a live server. The 257-failure batch has not been re-run against the
world that produced it, so this fix is proven by compilation and unit coverage, not by
observing the batch complete. - The underlying type-only item matching in
tryRemoveFromContainer(it matches on item id,
not NBT) is unchanged and still a known limitation against modded items with identical ids
and different payloads.
Thirteen primary jars share version 2.3.2. The NeoForge 26.3 cell is built against the NeoForge loader pin 26.3.0.6-beta. The jar name is vonixguardian-neoforge-26.3-2.3.2.jar.
This release covers the thirteen Fabric, Forge, and NeoForge cells below.
Public wiki: https://modwiki.vonix.network/mods/vonixguardian/
Drop-in jars
| MC version | Fabric | Forge / NeoForge |
|---|---|---|
| 26.3 | vonixguardian-fabric-26.3-2.3.2.jar |
vonixguardian-neoforge-26.3-2.3.2.jar |
| 26.2 | vonixguardian-fabric-26.2-2.3.2.jar |
vonixguardian-neoforge-26.2-2.3.2.jar |
| 26.1.2 | — | vonixguardian-neoforge-26.1.2-2.3.2.jar |
| 1.21.1 | vonixguardian-fabric-1.21.1-2.3.2.jar |
vonixguardian-neoforge-1.21.1-2.3.2.jar |
| 1.20.1 | vonixguardian-fabric-1.20.1-2.3.2.jar |
vonixguardian-forge-1.20.1-2.3.2.jar |
| 1.19.2 | vonixguardian-fabric-1.19.2-2.3.2.jar |
vonixguardian-forge-1.19.2-2.3.2.jar |
| 1.18.2 | vonixguardian-fabric-1.18.2-2.3.2.jar |
vonixguardian-forge-1.18.2-2.3.2.jar |
Pick the matching jar for your server, drop into mods/, restart.
Verifying
SHA-256 checksums are in SHA256SUMS. Run:
sha256sum -c SHA256SUMS
Configuration
On first boot, the mod writes config/vonixguardian/config.json. See README for the full schema.
Commands
/vg inspect, /vg lookup, /vg rollback, /vg restore, /vg purge, /vg near, /vg undo, /vg status, /vg reload, /vg help. Alias: /guardian.
See CHANGELOG.md for the full feature surface.
v2.3.1hf
VonixGuardian v2.3.1hf
Server-side block, inventory, and entity auditing with rollback tools for modded Minecraft.
Highlights
Taken from CHANGELOG.md section [2.3.1]. Schema version is 9.
Rollback of a used container no longer fails. A live server logged 257 failed rows in a
single batch — every CONTAINER_WITHDRAW and CONTAINER_DEPOSIT — and left the batch open
with REPAIR_REQUIRED.
Fixed
- A container rollback insisted on the exact slot it recorded. Returning items to a chest
is not the same as returning them to one coordinate: by the time an operator runs the
rollback the chest has been used again, so that slot holds something else, or holds the same
item but is full. The mutator refused in both cases, which is why one batch failed hundreds
of rows at once. It now places the stack wherever it fits — topping up matching partial
stacks first, then any empty slot — and fails only when the container is genuinely full.
Applied to all thirteen loader cells; the container code is duplicated per cell, and the
first pass fixed only 1.18.2 Forge. - The failure line now names the row's data. The old message was
mutation unsuccessful for action id=14356372 type=CONTAINER_WITHDRAW, repeated 257 times.
It could not distinguish a missing container from a full one from one holding different
items — three different problems with three different fixes. It now reports world,
position, target item, amount and slot.
Added
- A boundary guard fails the build if any loader cell loses the anywhere-fallback, which is
what caught that the first pass had fixed only one of thirteen.
Verification
- 1,531 tests, 0 failures on the core module.
- All thirteen cells rebuilt and packaged: 1.18.2 through 26.3 on Fabric, Forge and NeoForge.
- Not verified on a live server. The 257-failure batch has not been re-run against the
world that produced it, so this fix is proven by compilation and unit coverage, not by
observing the batch complete. - The underlying type-only item matching in
tryRemoveFromContainer(it matches on item id,
not NBT) is unchanged and still a known limitation against modded items with identical ids
and different payloads.
Thirteen primary jars share version 2.3.1hf. The NeoForge 26.3 cell is built against the NeoForge loader pin 26.3.0.6-beta. The jar name is vonixguardian-neoforge-26.3-2.3.1hf.jar.
This release covers the thirteen Fabric, Forge, and NeoForge cells below.
Public wiki: https://modwiki.vonix.network/mods/vonixguardian/
Drop-in jars
| MC version | Fabric | Forge / NeoForge |
|---|---|---|
| 26.3 | vonixguardian-fabric-26.3-2.3.1hf.jar |
vonixguardian-neoforge-26.3-2.3.1hf.jar |
| 26.2 | vonixguardian-fabric-26.2-2.3.1hf.jar |
vonixguardian-neoforge-26.2-2.3.1hf.jar |
| 26.1.2 | — | vonixguardian-neoforge-26.1.2-2.3.1hf.jar |
| 1.21.1 | vonixguardian-fabric-1.21.1-2.3.1hf.jar |
vonixguardian-neoforge-1.21.1-2.3.1hf.jar |
| 1.20.1 | vonixguardian-fabric-1.20.1-2.3.1hf.jar |
vonixguardian-forge-1.20.1-2.3.1hf.jar |
| 1.19.2 | vonixguardian-fabric-1.19.2-2.3.1hf.jar |
vonixguardian-forge-1.19.2-2.3.1hf.jar |
| 1.18.2 | vonixguardian-fabric-1.18.2-2.3.1hf.jar |
vonixguardian-forge-1.18.2-2.3.1hf.jar |
Pick the matching jar for your server, drop into mods/, restart.
Verifying
SHA-256 checksums are in SHA256SUMS. Run:
sha256sum -c SHA256SUMS
Configuration
On first boot, the mod writes config/vonixguardian/config.json. See README for the full schema.
Commands
/vg inspect, /vg lookup, /vg rollback, /vg restore, /vg purge, /vg near, /vg undo, /vg status, /vg reload, /vg help. Alias: /guardian.
See CHANGELOG.md for the full feature surface.
v2.3.1
VonixGuardian v2.3.1
Server-side block, inventory, and entity auditing with rollback tools for modded Minecraft.
Highlights
Taken from CHANGELOG.md section [2.3.1]. Schema version is 9.
Rollback of a used container no longer fails. A live server logged 257 failed rows in a
single batch — every CONTAINER_WITHDRAW and CONTAINER_DEPOSIT — and left the batch open
with REPAIR_REQUIRED.
Fixed
- A container rollback insisted on the exact slot it recorded. Returning items to a chest
is not the same as returning them to one coordinate: by the time an operator runs the
rollback the chest has been used again, so that slot holds something else, or holds the same
item but is full. The mutator refused in both cases, which is why one batch failed hundreds
of rows at once. It now places the stack wherever it fits — topping up matching partial
stacks first, then any empty slot — and fails only when the container is genuinely full.
Applied to all thirteen loader cells; the container code is duplicated per cell, and the
first pass fixed only 1.18.2 Forge. - The failure line now names the row's data. The old message was
mutation unsuccessful for action id=14356372 type=CONTAINER_WITHDRAW, repeated 257 times.
It could not distinguish a missing container from a full one from one holding different
items — three different problems with three different fixes. It now reports world,
position, target item, amount and slot.
Added
- A boundary guard fails the build if any loader cell loses the anywhere-fallback, which is
what caught that the first pass had fixed only one of thirteen.
Verification
- 1,531 tests, 0 failures on the core module.
- All thirteen cells rebuilt and packaged: 1.18.2 through 26.3 on Fabric, Forge and NeoForge.
- Not verified on a live server. The 257-failure batch has not been re-run against the
world that produced it, so this fix is proven by compilation and unit coverage, not by
observing the batch complete. - The underlying type-only item matching in
tryRemoveFromContainer(it matches on item id,
not NBT) is unchanged and still a known limitation against modded items with identical ids
and different payloads.
Thirteen primary jars share version 2.3.1. The NeoForge 26.3 cell is built against the NeoForge loader pin 26.3.0.6-beta. The jar name is vonixguardian-neoforge-26.3-2.3.1.jar.
This release covers the thirteen Fabric, Forge, and NeoForge cells below.
Public wiki: https://modwiki.vonix.network/mods/vonixguardian/
Drop-in jars
| MC version | Fabric | Forge / NeoForge |
|---|---|---|
| 26.3 | vonixguardian-fabric-26.3-2.3.1.jar |
vonixguardian-neoforge-26.3-2.3.1.jar |
| 26.2 | vonixguardian-fabric-26.2-2.3.1.jar |
vonixguardian-neoforge-26.2-2.3.1.jar |
| 26.1.2 | — | vonixguardian-neoforge-26.1.2-2.3.1.jar |
| 1.21.1 | vonixguardian-fabric-1.21.1-2.3.1.jar |
vonixguardian-neoforge-1.21.1-2.3.1.jar |
| 1.20.1 | vonixguardian-fabric-1.20.1-2.3.1.jar |
vonixguardian-forge-1.20.1-2.3.1.jar |
| 1.19.2 | vonixguardian-fabric-1.19.2-2.3.1.jar |
vonixguardian-forge-1.19.2-2.3.1.jar |
| 1.18.2 | vonixguardian-fabric-1.18.2-2.3.1.jar |
vonixguardian-forge-1.18.2-2.3.1.jar |
Pick the matching jar for your server, drop into mods/, restart.
Verifying
SHA-256 checksums are in SHA256SUMS. Run:
sha256sum -c SHA256SUMS
Configuration
On first boot, the mod writes config/vonixguardian/config.json. See README for the full schema.
Commands
/vg inspect, /vg lookup, /vg rollback, /vg restore, /vg purge, /vg near, /vg undo, /vg status, /vg reload, /vg help. Alias: /guardian.
See CHANGELOG.md for the full feature surface.
v2.3.0
VonixGuardian v2.3.0
Server-side block, inventory, and entity auditing with rollback tools for modded Minecraft.
Highlights
Taken from CHANGELOG.md section [2.3.0]. Schema version is 9.
Command replies now say what happened, and the dangerous commands do what their flags
claim. A purge marked as a preview or a count leaves the log in place. Changing one
actions setting keeps the item and entity blacklists. Undo is described as what it is,
a second change to the world. Rollback, lookup, and status are written so the outcome
and the number that matters are visible on the first read.
Every claim below was checked against this tree's source, not copied from a commit
message. What could not be verified is named in Verification and is not asserted;
what was checked and found still broken is in Known open.
Breaking changes
- A purge with no world selector covers every world. The reply names the scope it
used (all worlds, or the world you named). Limit a purge withr:#nether,
r:#overworld,r:#end, orr:#world_<name>. Rollback and lookup still default to
the world you are standing in. - A window such as
t:1h-2hdeletes only rows inside that window. A single age such
ast:90dstill deletes rows older than that age. The safety floor is checked against
the newest row that would be deleted, so a window reaching into the last 30 days
(in-game) or 24 hours (console) is refused even when its older edge is old enough. - Rollback output no longer contains
affected=. A check that parsed the old
key=value line will not find it. Zero counters are omitted from the line entirely.
A clean rollback readsDone — SUCCESS; a result needing repair reads
Needs repair — REPAIR_REQUIRED. - Chat colours are lighter. In the default
aquatheme, block and item ids are
near-white (#F4FFFF) instead of#00AAAA, which measured 3.85:1 against a mid-grey
chat background — below WCAG AA — and disappeared against a bright scene.
Added
/vg batch,/vg batch show <id>,/vg batch close <id>(permission
vonixguardian.rollback). List shows open batches with mode and action count; show
lists the action ids the batch covered; close marks the audit row finished. Close does
not replay the rollback, undo it, delete its action rows, or otherwise touch the world,
and the reply says so on every path — including "already closed" and "no such batch".
Registered in all ten command cells.- Purge preview prints the match count, up to eight sample rows (world, coordinates,
target, actor), and how many more match. Nothing is deleted. - Lookup rows show the world, the item amount where one applies, and a UTC clock time
beside the relative time. Sign side, dye colour, and waxed state appear when stored.
#verboseadds the inventory slot, source tag, paired row id, and the before/after
block state. The row id is click-to-copy, the target copies its full id, and the
coordinates offer/vg tpin the chat box. Where a client's chat API refuses the
click event, the text still renders. - A command failure names the failure. When a throwable carries no message — the
common case — the reply uses the exception type instead of printingnull.
Fixed
/vg purge #previewand/vg purge #countdeleted rows. The documented dry run
performed the purge: the flags were copied onto the filter and never read. They now
count (preview also samples) and call neither the delete nor the optimize path./vg purgesilently narrowed to the caller's world. The handler applied the
sender's world as a default, so an operator standing in the Overworld purged only the
Overworld and was told the row count as if that were the whole server. A bare purge
now spans every world and names the scope; ar:selector is kept as given.- A two-sided time range inverted the purge window.
t:1h-2hdeleted everything
older than the newer edge. It now deletes only rows inside the window. /vg config seton anactionskey wiped both blacklists to disk. The handler
rebuilt theActionsblock through a compatibility constructor that substitutes empty
lists foritemBlacklistandentityBlacklist, then saved it. Every write now starts
from the live block and changes one field.- Rolling back several edits of one block restored only the newest and reported
skipped=0. Older rows at an already-planned position were dropped from the plan
without being counted, so rows the operator asked about vanished from the operation
entirely. They are now counted as skipped; the newest row is still the one applied. - A failed rollback left its batch open forever and logged one WARN per affected
action on every boot. Boot now logs a single line naming the open batch ids and the
action count, and points at/vg batch. /vg statusread the database on the server thread. The report is built off-thread
and the lines are sent back on the server thread. On a slow or remote database the
diagnostic no longer stalls the tick it is being used to investigate./vg statuslabelledSELECT 1as "health". A trivial query cannot see a locked
table, a full disk, or a permission failure, so the row is nowreachableand states
what answered. The schema row readsvg_schema_versionand compares it with the
version this jar creates, so drift is named instead of assumed. A configured theme
name that is not registered is reported rather than silently resolved away./vg statusflooded chat. 62 lines with[VonixGuardian]on every one is now a
one-sentence opener plus five sections (version, storage, writer, recovery,
configuration) with the brand on the first section only. Counters that answer one
question share a row; per-type and per-batch detail still prints when it exists.r:#worldeditanswered "no results" when WorldEdit was absent, no selection
existed, or the selection could not be read. Each case now names itself./vg helpdescribed undo as dropping history. It now says undo changes the world
again. The command list is rendered fromCommandSpec, so it cannot omit a
subcommand that the spec knows about. It still does not list the registered
compatibility literals that are not in the spec (inspector,page,stats,
version) or there/roaliases — see Known open.- Error paths ended in the word
null. See Added. - A paused audit writer could let one row escape and accept another in the same
instant. The worker had already removed the held row when pause became visible, so
the queue looked empty. The row goes back and the next submit is rejected and recorded.
Changed
- The rollback line reconciles against the plan. It reports the plan total whenever
it differs from what changed (251 changed (of 468 planned)), and states plainly when
a gap has no other explanation —unplannedGapnames the remainder rather than leaving
the operator to subtract. The formatter accepts a per-reason skip histogram and will
render it, but no caller supplies one yet, so the line reports the skip total only. #counton rollback and restore is one line and says nothing was changed.
#previewsays how many blocks would change and that the world was not changed.#verboseon a lookup adds its fields on the same line rather than a second row;
the hover text carries the same detail without the flag. Long names are shortened on
screen while the click-to-copy value keeps the full id.- All fifteen language bundles now carry the full 32-key set. Fourteen bundles held
7 of 32 keys, so a non-English locale silently fell through to English for the other
25. Thett(Tatar) bundle resolves every key but keeps 29 lines in English
deliberately, each marked#TODO-i18nwith the reason, rather than inventing a
translation. The bundles only cover the parser and status vocabulary; every command
reply inGuardianCommands,LookupText, andMutationOutcomeFormatteris still a
hardcoded English literal — see Known open. /vg batchclosing an audit row is reported separately from changing the world.
The two are never conflated in one sentence.
Removed
LookupPermissionFilter.filter()— unreachable; the live path usesvisiblePage()
andcountVisible(). Proven unreachable by grep before deletion.CommandSpecaliases no loader registers (nfor near,?for help), and
Lookup.atPoson the 1.18.2 Forge cell. The spec had drifted from the real command
tree; the drift was removed rather than the tree changed to match it.
Known open — verified against this tree at release
Re-checked at the tip of the released commit, not carried forward from the candidate.
Items that were open when this entry was drafted and are now fixed have been removed
rather than left to mislead a reader.
| Issue | Effect |
|---|---|
a:+block / a:-block sign is parsed but not compiled into SQL |
QueryParser records PLACE_ONLY / BREAK_ONLY; no SQL builder reads it. Place-only and break-only filters therefore behave as the whole family. |
/vg help omits four registered literals |
inspector, page, stats and version exist in the command tree but not in CommandSpec, so the rendered list leaves them out. |
Ten near-duplicate GuardianCommands copies |
A single defect must be fixed ten times. A parity test now fails if the copies diverge, but the duplication remains — CommandTree has no consumer yet. |
| Command replies are not translatable | Every reply in GuardianCommands, LookupText and MutationOutcomeFormatter is a hardcoded English literal. The bundles translate player-facing parser errors only, so language=de changes those and little else. |
| No benchmark, so no performance claim | PerfReport exists but there is no method document, and the block-write hook added in thi... |
v2.2.1
VonixGuardian v2.2.1
Server-side block, inventory, and entity auditing with rollback tools for modded Minecraft.
Highlights
Taken from CHANGELOG.md section [2.2.0]. Schema version is 9.
Fixed
- Orphaned block entities after rollback (
OE1). A rollback that cleared or replaced a block usedtrySetBlock(..., AIR, null). VanillaLevel.setBlock(pos, state, UPDATE_ALL)only removes a block entity as a side effect of aBlockEntity-owning block-state change, so a stale block entity at the position survived the write, was re-serialised into the region file, and on the next chunk load reconstructed its recorded id (minecraft:bed/minecraft:banner) against an unrelated block state. That throwsClassCastExceptioninsideBedBlockEntity/BannerBlockEntity, aborts the block entity, and repeats per affected position on every chunk load — observed live as 142 console errors from a single affected area, with permanent cosmetic loss of bed colour and banner pattern.WorldMutator#tryClearBlocksets the block to air first, while the genuine block entity is still attached, so vanilla's own removal path runs. It then reads the position with a non-creating check (EntityCreationType.CHECK). A survivor is removed explicitly. The method returns true only when the final state is air and that check read is null. It does not call an entity-creating accessor between the removal and the state write. If the air write does not land, the block entity is left in place so its contents are not discarded. The engine routes every removing inverse (BLOCK_PLACE,IGNITE/BUCKET_EMPTY/STRUCTURE_GROW/PORTAL_CREATE/FLUID_FLOW,BURN/FADE/LEAVES_DECAY/BUCKET_FILL, and explosion block clears) through it instead of a plain airsetBlock.trySetBlockgoes through oneplaceBlockhelper per cell. After the state write, a non-creating read must be null when the target block owns no block entity. When the target owns one and no NBT was supplied, the fresh entity is not treated as stale. A failed place restores the previous state and returns false.- Container deposit rollback on the 1.18.2, 1.19.2, 1.20.1, and 1.21.1 cells counts matching stacks before it shrinks any of them. A short quantity returns false and leaves the remainder in place. The 26.x cells already did this preflight.
- Implemented across all 13 loader cells.
- A place that targets a block entity reports failure when no block entity is present after the write, and NBT is applied only when the entity at the position is the type the target block creates. A pre-existing entity that belongs to another block fails the place and restores the previous state instead of receiving the snapshot.
- Compensation restores captured NBT even when the previous state is already present (
setBlockreturning false is not treated as a failed restore).
- Admission drops are journaled before they are counted when the quarantine has capacity. Queue overflow and an explosion-join rejection append to the durable quarantine outbox before the drop counter moves. A full quarantine cannot retain the action: it increments the overflow counter and logs the action type, id, world, and coordinates at ERROR, so the drop is counted and visible but not replayable.
/vg statusprintsdropped,quarantined,qOverflow, andqWriteFail. A rejected explosion handoff is journaled asentries=<n>at the explosion centre only; the per-block list is not retained, so that row is a loss record and not a rollback source. - Open rollback batches stay open. Boot does not replay them.
/vg statuslists open batch ids, mode (ROLLBACK/RESTORE), affected counts, andvg_repair_requiredrows. Staff inspect those rows before re-running a rollback or restore.
Changed
- NBT-less rollback of a block position reports failure when the clear does not land, instead of reporting success with a stale block entity left behind.
purge.autoPurgeSecondsstays0(GuardianConfig.DEFAULT_AUTO_PURGE_SECONDS).0means unbounded retention.7776000(90 days) isSUGGESTED_BUSY_SERVER_AUTO_PURGE_SECONDSand is not written into existing configs. Boot logs one warning when the loaded value is0.rollback.requireConfirmdefaults tofalse. Rollback and restore still apply immediately at op level 3. Setting it totruemakes/vg applythe confirmation. The permission table is unchanged.- Privacy docs match the shipped
Privacy(false, …)default.hashIps: truewith the placeholder salt is a hard validation error. Hash width and salt handling are unchanged. Schema version stays 9.
Added
OrphanedBlockEntityClearTestplus fake-level and source-contract tests for the clear/place order, the container preflight, and the Gradle profile split.- Thirteen primary jars at
mod_version2.2.0: Fabric and Forge on 1.18.2, 1.19.2, and 1.20.1; Fabric and NeoForge on 1.21.1; NeoForge on 26.1.2; Fabric and NeoForge on 26.2 and 26.3. - NeoForge 26.2 cell (
mc-26.2/common+mc-26.2/neoforge) targeting Minecraft 26.2 / NeoForge 26.2.0.88. Java 25, ModDevGradle 2.0.147, MixinJAVA_25, Shadow 8.3.9. Loader ranges: NeoForge[26.2.0.88,26.3), Minecraft[26.2,26.3). Build profilemc262on Gradle 9.2.0. The jar version is the rootmod_version. - NeoForge 26.3 cell (
mc-26.3/common+mc-26.3/neoforge) for Minecraft 26.3. The loader pin is NeoForge26.3.0.6-beta(ModDevGradle 2.0.147, Java 25, MixinJAVA_25). The artifact version is the rootmod_version(vonixguardian-neoforge-26.3-2.2.0.jar), with no extra suffix. Build profilemc263on Gradle 9.2.0. Re-pinneoForge.versionwhen NeoForge publishes a stable 26.3 loader. This cell is one of the thirteen release jars. - Fabric 26.2 cell (
mc-26.2/fabric, packagemc.v26_2): Loom 1.17.21, Fabric Loader 0.19.5, Fabric API0.161.0+26.2, Java 25. Build profilemc262fabricon Gradle 9.6.0. It is not configured bymc262. - Fabric 26.3 cell (
mc-26.3/fabric): Fabric Loader 0.19.5, Fabric API0.161.0+26.3, Loom 1.17.x, Java 25. Build profilemc263fabricon Gradle 9.6.0. It is not configured bymc263.
Thirteen primary jars share version 2.2.1. The NeoForge 26.3 cell is built against the NeoForge loader pin 26.3.0.6-beta. The jar name is vonixguardian-neoforge-26.3-2.2.1.jar.
This release covers the thirteen Fabric, Forge, and NeoForge cells below.
Public wiki: https://modwiki.vonix.network/mods/vonixguardian/
Drop-in jars
| MC version | Fabric | Forge / NeoForge |
|---|---|---|
| 26.3 | vonixguardian-fabric-26.3-2.2.1.jar |
vonixguardian-neoforge-26.3-2.2.1.jar |
| 26.2 | vonixguardian-fabric-26.2-2.2.1.jar |
vonixguardian-neoforge-26.2-2.2.1.jar |
| 26.1.2 | — | vonixguardian-neoforge-26.1.2-2.2.1.jar |
| 1.21.1 | vonixguardian-fabric-1.21.1-2.2.1.jar |
vonixguardian-neoforge-1.21.1-2.2.1.jar |
| 1.20.1 | vonixguardian-fabric-1.20.1-2.2.1.jar |
vonixguardian-forge-1.20.1-2.2.1.jar |
| 1.19.2 | vonixguardian-fabric-1.19.2-2.2.1.jar |
vonixguardian-forge-1.19.2-2.2.1.jar |
| 1.18.2 | vonixguardian-fabric-1.18.2-2.2.1.jar |
vonixguardian-forge-1.18.2-2.2.1.jar |
Pick the matching jar for your server, drop into mods/, restart.
Verifying
SHA-256 checksums are in SHA256SUMS. Run:
sha256sum -c SHA256SUMS
Configuration
On first boot, the mod writes config/vonixguardian/config.json. See README for the full schema.
Commands
/vg inspect, /vg lookup, /vg rollback, /vg restore, /vg purge, /vg near, /vg undo, /vg status, /vg reload, /vg help. Alias: /guardian.
See CHANGELOG.md for the full feature surface.
v2.2.0
VonixGuardian v2.2.0
Server-side block, inventory, and entity auditing with rollback tools for modded Minecraft.
Highlights
Taken from CHANGELOG.md section [2.2.0]. Schema version is 9.
Fixed
- Orphaned block entities after rollback (
OE1). A rollback that cleared or replaced a block usedtrySetBlock(..., AIR, null). VanillaLevel.setBlock(pos, state, UPDATE_ALL)only removes a block entity as a side effect of aBlockEntity-owning block-state change, so a stale block entity at the position survived the write, was re-serialised into the region file, and on the next chunk load reconstructed its recorded id (minecraft:bed/minecraft:banner) against an unrelated block state. That throwsClassCastExceptioninsideBedBlockEntity/BannerBlockEntity, aborts the block entity, and repeats per affected position on every chunk load — observed live as 142 console errors from a single affected area, with permanent cosmetic loss of bed colour and banner pattern.WorldMutator#tryClearBlocksets the block to air first, while the genuine block entity is still attached, so vanilla's own removal path runs. It then reads the position with a non-creating check (EntityCreationType.CHECK). A survivor is removed explicitly. The method returns true only when the final state is air and that check read is null. It does not call an entity-creating accessor between the removal and the state write. If the air write does not land, the block entity is left in place so its contents are not discarded. The engine routes every removing inverse (BLOCK_PLACE,IGNITE/BUCKET_EMPTY/STRUCTURE_GROW/PORTAL_CREATE/FLUID_FLOW,BURN/FADE/LEAVES_DECAY/BUCKET_FILL, and explosion block clears) through it instead of a plain airsetBlock.trySetBlockgoes through oneplaceBlockhelper per cell. After the state write, a non-creating read must be null when the target block owns no block entity. When the target owns one and no NBT was supplied, the fresh entity is not treated as stale. A failed place restores the previous state and returns false.- Container deposit rollback on the 1.18.2, 1.19.2, 1.20.1, and 1.21.1 cells counts matching stacks before it shrinks any of them. A short quantity returns false and leaves the remainder in place. The 26.x cells already did this preflight.
- Implemented across all 13 loader cells.
- A place that targets a block entity reports failure when no block entity is present after the write, and NBT is applied only when the entity at the position is the type the target block creates. A pre-existing entity that belongs to another block fails the place and restores the previous state instead of receiving the snapshot.
- Compensation restores captured NBT even when the previous state is already present (
setBlockreturning false is not treated as a failed restore).
- Admission drops are journaled before they are counted when the quarantine has capacity. Queue overflow and an explosion-join rejection append to the durable quarantine outbox before the drop counter moves. A full quarantine cannot retain the action: it increments the overflow counter and logs the action type, id, world, and coordinates at ERROR, so the drop is counted and visible but not replayable.
/vg statusprintsdropped,quarantined,qOverflow, andqWriteFail. A rejected explosion handoff is journaled asentries=<n>at the explosion centre only; the per-block list is not retained, so that row is a loss record and not a rollback source. - Open rollback batches stay open. Boot does not replay them.
/vg statuslists open batch ids, mode (ROLLBACK/RESTORE), affected counts, andvg_repair_requiredrows. Staff inspect those rows before re-running a rollback or restore.
Changed
- NBT-less rollback of a block position reports failure when the clear does not land, instead of reporting success with a stale block entity left behind.
purge.autoPurgeSecondsstays0(GuardianConfig.DEFAULT_AUTO_PURGE_SECONDS).0means unbounded retention.7776000(90 days) isSUGGESTED_BUSY_SERVER_AUTO_PURGE_SECONDSand is not written into existing configs. Boot logs one warning when the loaded value is0.rollback.requireConfirmdefaults tofalse. Rollback and restore still apply immediately at op level 3. Setting it totruemakes/vg applythe confirmation. The permission table is unchanged.- Privacy docs match the shipped
Privacy(false, …)default.hashIps: truewith the placeholder salt is a hard validation error. Hash width and salt handling are unchanged. Schema version stays 9.
Added
OrphanedBlockEntityClearTestplus fake-level and source-contract tests for the clear/place order, the container preflight, and the Gradle profile split.- Thirteen primary jars at
mod_version2.2.0: Fabric and Forge on 1.18.2, 1.19.2, and 1.20.1; Fabric and NeoForge on 1.21.1; NeoForge on 26.1.2; Fabric and NeoForge on 26.2 and 26.3. - NeoForge 26.2 cell (
mc-26.2/common+mc-26.2/neoforge) targeting Minecraft 26.2 / NeoForge 26.2.0.88. Java 25, ModDevGradle 2.0.147, MixinJAVA_25, Shadow 8.3.9. Loader ranges: NeoForge[26.2.0.88,26.3), Minecraft[26.2,26.3). Build profilemc262on Gradle 9.2.0. The jar version is the rootmod_version. - NeoForge 26.3 cell (
mc-26.3/common+mc-26.3/neoforge) for Minecraft 26.3. The loader pin is NeoForge26.3.0.6-beta(ModDevGradle 2.0.147, Java 25, MixinJAVA_25). The artifact version is the rootmod_version(vonixguardian-neoforge-26.3-2.2.0.jar), with no extra suffix. Build profilemc263on Gradle 9.2.0. Re-pinneoForge.versionwhen NeoForge publishes a stable 26.3 loader. This cell is one of the thirteen release jars. - Fabric 26.2 cell (
mc-26.2/fabric, packagemc.v26_2): Loom 1.17.21, Fabric Loader 0.19.5, Fabric API0.161.0+26.2, Java 25. Build profilemc262fabricon Gradle 9.6.0. It is not configured bymc262. - Fabric 26.3 cell (
mc-26.3/fabric): Fabric Loader 0.19.5, Fabric API0.161.0+26.3, Loom 1.17.x, Java 25. Build profilemc263fabricon Gradle 9.6.0. It is not configured bymc263.
Thirteen primary jars share version 2.2.0. The NeoForge 26.3 cell is built against the NeoForge loader pin 26.3.0.6-beta. The jar name is vonixguardian-neoforge-26.3-2.2.0.jar.
This release covers the thirteen Fabric, Forge, and NeoForge cells below.
Public wiki: https://modwiki.vonix.network/mods/vonixguardian/
Drop-in jars
| MC version | Fabric | Forge / NeoForge |
|---|---|---|
| 26.3 | vonixguardian-fabric-26.3-2.2.0.jar |
vonixguardian-neoforge-26.3-2.2.0.jar |
| 26.2 | vonixguardian-fabric-26.2-2.2.0.jar |
vonixguardian-neoforge-26.2-2.2.0.jar |
| 26.1.2 | — | vonixguardian-neoforge-26.1.2-2.2.0.jar |
| 1.21.1 | vonixguardian-fabric-1.21.1-2.2.0.jar |
vonixguardian-neoforge-1.21.1-2.2.0.jar |
| 1.20.1 | vonixguardian-fabric-1.20.1-2.2.0.jar |
vonixguardian-forge-1.20.1-2.2.0.jar |
| 1.19.2 | vonixguardian-fabric-1.19.2-2.2.0.jar |
vonixguardian-forge-1.19.2-2.2.0.jar |
| 1.18.2 | vonixguardian-fabric-1.18.2-2.2.0.jar |
vonixguardian-forge-1.18.2-2.2.0.jar |
Pick the matching jar for your server, drop into mods/, restart.
Verifying
SHA-256 checksums are in SHA256SUMS. Run:
sha256sum -c SHA256SUMS
Configuration
On first boot, the mod writes config/vonixguardian/config.json. See README for the full schema.
Commands
/vg inspect, /vg lookup, /vg rollback, /vg restore, /vg purge, /vg near, /vg undo, /vg status, /vg reload, /vg help. Alias: /guardian.
See CHANGELOG.md for the full feature surface.
VonixGuardian v2.2.0-rc.1 — 26.x multiloader port
VonixGuardian v2.2.0-rc.1 — 26.x multiloader port (PRE-RELEASE)
Adds four new loader cells for the Minecraft 26.x line, ported 1:1 from the
2.1.2 NeoForge lane. Built on top of v2.1.2 (9b63124).
New cells
- NeoForge 26.2 — Minecraft 26.2 / NeoForge
26.2.0.88, Java 25, Gradle 9.2.0+ - NeoForge 26.3 — Minecraft 26.3 / NeoForge
26.3.0.6-beta, Java 25, Gradle 9.2.0+- NeoForge has no stable 26.3 release yet; this cell is a pre-release / beta-channel artifact
- Fabric 26.2 — Minecraft 26.2 / Fabric Loader
0.19.5/ Fabric API0.161.0+26.2, Loom 1.17.21, Gradle 9.6.0+ - Fabric 26.3 — Minecraft 26.3 / Fabric Loader
0.19.5/ Fabric API0.161.0+26.3, Loom 1.17.21, Gradle 9.6.0+
All cells embed the unified mod_version (2.1.2); MC/loader identity is carried
in the artifact name and mod metadata, not the version string.
Verification performed
Each cell was booted on a real dedicated server at its target
Minecraft/loader version and reached full readiness (Done (…)), with
VonixGuardian initialising its SQLite schema (schema v9, 9 tables) and
registering its /vg command tree.
Defects found and fixed by runtime boot-testing (not catchable by compilation):
TntBlockMixin— 26.2/26.3 renamedexplode(...)Vtoprime(...)Z; the
injection callback requiredCallbackInfoReturnable<Boolean>.ConcretePowderBlockMixin—updateShapegained three parameters and
reordered in 26.x (LevelReader,ScheduledTickAccess,RandomSource);
descriptor retargeted and pinned explicitly.LeavesBlockMixin— decay moved fromticktorandomTick.RavagerMixin—destroyBlockinvoke owner narrowedLevel→ServerLevel.PortalShapeMixin—createPortalBlocksnow a lambda body.- Fabric 26.x —
Explosionbecame an interface (ServerExplosion),drop
signature changed,ContainerMixintarget moved toContainerUser.
Additionally, silently non-binding require = 0 redirects that were masking
lost audit coverage were identified and raised where the target is confirmed
present, so a future mapping change fails loudly rather than degrading coverage.
Installation
Drop the matching JAR into your server mods/ folder.
| Minecraft | Loader | File |
|---|---|---|
| 26.2 | NeoForge | vonixguardian-neoforge-26.2-2.1.2.jar |
| 26.3 | NeoForge | vonixguardian-neoforge-26.3-2.1.2.jar |
| 26.2 | Fabric | vonixguardian-fabric-26.2-2.1.2.jar |
| 26.3 | Fabric | vonixguardian-fabric-26.3-2.1.2.jar |
Fabric cells require Fabric API (declared hard dependency).
Pre-release notice
- NeoForge 26.3 is pinned to a beta loader (
26.3.0.6-beta); the cell will be
re-pinned when NeoForge publishes a stable 26.3. - These are new loader cells: they are boot-verified but have not yet seen
production server traffic. - The existing 26.1.2 NeoForge lane is not modified by this release, and it
carries a known outstanding defect (its TNT-prime mixin targets a method that
does not exist in real 26.1.2 bytecode, so that attribution is silently inactive
underrequire = 0). Tracked separately; not addressed here.
Checksums
See SHA256SUMS attached to this release.
v2.1.2
VonixGuardian v2.1.2
Server-side block, inventory, and entity auditing with rollback tools for modded Minecraft.
Highlights
- Extends slot-level stateful container and hopper tracking across all nine supported cells, with exact before/after slot diffs and paired transfer correlation.
- Preserves item NBT, block-state properties, block-entity NBT, and entity NBT through capture, queue admission, rollback, and restore; oversized payloads are rejected before decode or admission.
- Keeps paired transfers fail-closed: incomplete or stale pairs are not mutated, and second-half failures compensate the first half when possible.
- Carries forward additive schema/migration continuity through schema v8 (, , , and ) without a destructive migration.
- Fixes null-key recovery for Java-null, blank, and literal actor names, deterministic UUID aliases, valid-name preservation, duplicate-key race recovery, and ItemFrame-style collisions.
- Repairs Fabric hopper callback descriptors and mixin visibility/packaging assertions, including the 1.20.1 Container-based callback signature.
This stable release is shared across all nine supported Fabric, Forge, and NeoForge version/loader cells.
Public wiki: https://modwiki.vonix.network/mods/vonixguardian/
Drop-in jars
| MC version | Fabric | Forge / NeoForge |
|---|---|---|
| 26.1.2 | — | vonixguardian-neoforge-26.1.2-2.1.2.jar |
| 1.21.1 | vonixguardian-fabric-1.21.1-2.1.2.jar |
vonixguardian-neoforge-1.21.1-2.1.2.jar |
| 1.20.1 | vonixguardian-fabric-1.20.1-2.1.2.jar |
vonixguardian-forge-1.20.1-2.1.2.jar |
| 1.19.2 | vonixguardian-fabric-1.19.2-2.1.2.jar |
vonixguardian-forge-1.19.2-2.1.2.jar |
| 1.18.2 | vonixguardian-fabric-1.18.2-2.1.2.jar |
vonixguardian-forge-1.18.2-2.1.2.jar |
Pick the matching jar for your server, drop into mods/, restart.
Verifying
SHA-256 checksums are in SHA256SUMS. Run:
sha256sum -c SHA256SUMS
Configuration
On first boot, the mod writes config/vonixguardian/config.json. See README for the full schema.
Commands
/vg inspect, /vg lookup, /vg rollback, /vg restore, /vg purge, /vg near, /vg undo, /vg status, /vg reload, /vg help. Alias: /guardian.
See CHANGELOG.md for the full feature surface.
VonixGuardian v2.1.1
VonixGuardian v2.1.1
Reliability and compatibility hardening across the complete nine-cell release matrix:
- 1.18.2 Fabric and Forge
- 1.19.2 Fabric and Forge
- 1.20.1 Fabric and Forge
- 1.21.1 Fabric and NeoForge
- 26.1.2 NeoForge
Highlights
- Reports authoritative rollback, restore, and undo terminal states with applied, skipped, failed, compensated, and repair-required counts.
- Adds additive schema continuity for historical rollback tables and the
vg_actions(ts, id)composite index. - Preserves historical databases without destructive migrations, including safe handling of empty schema-version metadata beside existing fact tables.
- Hardens item/entity blacklist matching with exact namespaced semantics, safe malformed-override handling, and snapshot-safe reload behavior.
- Prevents stale asynchronous command and preview results from being delivered after a newer command generation.
- Improves rollback and migration correctness around partial batches, compensation, repair-required state, and outbox/quarantine handling.
- Aligns platform mixins, nested Fabric core metadata, NeoForge ranges, and packaging checks across all nine cells.
Verification boundary
- All nine primary artifacts were built and packaged from the same source release commit.
- Classifier outputs such as
-all,-sources,-slim,-shadow, and-devare excluded. - The packaged 1.18.2 Fabric artifact was smoke-tested through mod activation, Minecraft readiness, world save, and clean shutdown.
- Live database migration, live-server deployment, world modification, and production performance profiling are not performed by this release publication.
Assets
| Minecraft | Loader | Asset |
|---|---|---|
| 1.18.2 | Fabric | vonixguardian-fabric-1.18.2-2.1.1.jar |
| 1.18.2 | Forge | vonixguardian-forge-1.18.2-2.1.1.jar |
| 1.19.2 | Fabric | vonixguardian-fabric-1.19.2-2.1.1.jar |
| 1.19.2 | Forge | vonixguardian-forge-1.19.2-2.1.1.jar |
| 1.20.1 | Fabric | vonixguardian-fabric-1.20.1-2.1.1.jar |
| 1.20.1 | Forge | vonixguardian-forge-1.20.1-2.1.1.jar |
| 1.21.1 | Fabric | vonixguardian-fabric-1.21.1-2.1.1.jar |
| 1.21.1 | NeoForge | vonixguardian-neoforge-1.21.1-2.1.1.jar |
| 26.1.2 | NeoForge | vonixguardian-neoforge-26.1.2-2.1.1.jar |
Use SHA256SUMS to verify downloaded artifacts:
sha256sum -c SHA256SUMS
See CHANGELOG.md in the repository for the complete version history and configuration documentation.
v2.1.0
VonixGuardian v2.1.0
Server-side block, inventory, and entity auditing with rollback tools for modded Minecraft.
Highlights
- Extends slot-level stateful container and hopper tracking across all nine supported cells, with exact before/after slot diffs and paired transfer correlation.
- Preserves item NBT, block-state properties, block-entity NBT, and entity NBT through capture, queue admission, rollback, and restore; oversized payloads are rejected before decode or admission.
- Keeps paired transfers fail-closed: incomplete or stale pairs are not mutated, and second-half failures compensate the first half when possible.
- Carries forward additive schema/migration continuity through schema v8 (, , , and ) without a destructive migration.
- Fixes null-key recovery for Java-null, blank, and literal actor names, deterministic UUID aliases, valid-name preservation, duplicate-key race recovery, and ItemFrame-style collisions.
- Repairs Fabric hopper callback descriptors and mixin visibility/packaging assertions, including the 1.20.1 Container-based callback signature.
This stable release is shared across all nine supported Fabric, Forge, and NeoForge version/loader cells.
Public wiki: https://modwiki.vonix.network/mods/vonixguardian/
Drop-in jars
| MC version | Fabric | Forge / NeoForge |
|---|---|---|
| 26.1.2 | — | vonixguardian-neoforge-26.1.2-2.1.0.jar |
| 1.21.1 | vonixguardian-fabric-1.21.1-2.1.0.jar |
vonixguardian-neoforge-1.21.1-2.1.0.jar |
| 1.20.1 | vonixguardian-fabric-1.20.1-2.1.0.jar |
vonixguardian-forge-1.20.1-2.1.0.jar |
| 1.19.2 | vonixguardian-fabric-1.19.2-2.1.0.jar |
vonixguardian-forge-1.19.2-2.1.0.jar |
| 1.18.2 | vonixguardian-fabric-1.18.2-2.1.0.jar |
vonixguardian-forge-1.18.2-2.1.0.jar |
Pick the matching jar for your server, drop into mods/, restart.
Verifying
SHA-256 checksums are in SHA256SUMS. Run:
sha256sum -c SHA256SUMS
Configuration
On first boot, the mod writes config/vonixguardian/config.json. See README for the full schema.
Commands
/vg inspect, /vg lookup, /vg rollback, /vg restore, /vg purge, /vg near, /vg undo, /vg status, /vg reload, /vg help. Alias: /guardian.
See CHANGELOG.md for the full feature surface.