Skip to content

Releases

v2.3.2

Choose a tag to compare

@Vonix-Network Vonix-Network released this 15 Nov 13:47

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

Choose a tag to compare

@Vonix-Network Vonix-Network released this 14 Nov 22:10

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

Choose a tag to compare

@Vonix-Network Vonix-Network released this 14 Nov 21:19

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

Choose a tag to compare

@Vonix-Network Vonix-Network released this 14 Nov 19:09

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 with r:#nether,
    r:#overworld, r:#end, or r:#world_<name>. Rollback and lookup still default to
    the world you are standing in.
  • A window such as t:1h-2h deletes only rows inside that window. A single age such
    as t:90d still 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 reads Done — SUCCESS; a result needing repair reads
    Needs repair — REPAIR_REQUIRED.
  • Chat colours are lighter. In the default aqua theme, 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.
    #verbose adds 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 tp in 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 printing null.

Fixed

  • /vg purge #preview and /vg purge #count deleted 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 purge silently 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; a r: selector is kept as given.
  • A two-sided time range inverted the purge window. t:1h-2h deleted everything
    older than the newer edge. It now deletes only rows inside the window.
  • /vg config set on an actions key wiped both blacklists to disk. The handler
    rebuilt the Actions block through a compatibility constructor that substitutes empty
    lists for itemBlacklist and entityBlacklist, 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 status read 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 status labelled SELECT 1 as "health". A trivial query cannot see a locked
    table, a full disk, or a permission failure, so the row is now reachable and states
    what answered. The schema row reads vg_schema_version and 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 status flooded 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:#worldedit answered "no results" when WorldEdit was absent, no selection
    existed, or the selection could not be read. Each case now names itself.
  • /vg help described undo as dropping history. It now says undo changes the world
    again. The command list is rendered from CommandSpec, 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 the re/ro aliases — 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 — unplannedGap names 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.
  • #count on rollback and restore is one line and says nothing was changed.
    #preview says how many blocks would change and that the world was not changed.
  • #verbose on 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. The tt (Tatar) bundle resolves every key but keeps 29 lines in English
    deliberately, each marked #TODO-i18n with the reason, rather than inventing a
    translation. The bundles only cover the parser and status vocabulary; every command
    reply in GuardianCommands, LookupText, and MutationOutcomeFormatter is still a
    hardcoded English literal — see Known open.
  • /vg batch closing 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 uses visiblePage()
    and countVisible(). Proven unreachable by grep before deletion.
  • CommandSpec aliases no loader registers (n for near, ? for help), and
    Lookup.atPos on 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...
Read more

v2.2.1

Choose a tag to compare

@github-actions github-actions released this 20 Oct 06:42

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 used trySetBlock(..., AIR, null). Vanilla Level.setBlock(pos, state, UPDATE_ALL) only removes a block entity as a side effect of a BlockEntity-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 throws ClassCastException inside BedBlockEntity / 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#tryClearBlock sets 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 air setBlock.
    • trySetBlock goes through one placeBlock helper 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 (setBlock returning 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 status prints dropped, quarantined, qOverflow, and qWriteFail. A rejected explosion handoff is journaled as entries=<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 status lists open batch ids, mode (ROLLBACK / RESTORE), affected counts, and vg_repair_required rows. 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.autoPurgeSeconds stays 0 (GuardianConfig.DEFAULT_AUTO_PURGE_SECONDS). 0 means unbounded retention. 7776000 (90 days) is SUGGESTED_BUSY_SERVER_AUTO_PURGE_SECONDS and is not written into existing configs. Boot logs one warning when the loaded value is 0.
  • rollback.requireConfirm defaults to false. Rollback and restore still apply immediately at op level 3. Setting it to true makes /vg apply the confirmation. The permission table is unchanged.
  • Privacy docs match the shipped Privacy(false, …) default. hashIps: true with the placeholder salt is a hard validation error. Hash width and salt handling are unchanged. Schema version stays 9.

Added

  • OrphanedBlockEntityClearTest plus fake-level and source-contract tests for the clear/place order, the container preflight, and the Gradle profile split.
  • Thirteen primary jars at mod_version 2.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, Mixin JAVA_25, Shadow 8.3.9. Loader ranges: NeoForge [26.2.0.88,26.3), Minecraft [26.2,26.3). Build profile mc262 on Gradle 9.2.0. The jar version is the root mod_version.
  • NeoForge 26.3 cell (mc-26.3/common + mc-26.3/neoforge) for Minecraft 26.3. The loader pin is NeoForge 26.3.0.6-beta (ModDevGradle 2.0.147, Java 25, Mixin JAVA_25). The artifact version is the root mod_version (vonixguardian-neoforge-26.3-2.2.0.jar), with no extra suffix. Build profile mc263 on Gradle 9.2.0. Re-pin neoForge.version when NeoForge publishes a stable 26.3 loader. This cell is one of the thirteen release jars.
  • Fabric 26.2 cell (mc-26.2/fabric, package mc.v26_2): Loom 1.17.21, Fabric Loader 0.19.5, Fabric API 0.161.0+26.2, Java 25. Build profile mc262fabric on Gradle 9.6.0. It is not configured by mc262.
  • Fabric 26.3 cell (mc-26.3/fabric): Fabric Loader 0.19.5, Fabric API 0.161.0+26.3, Loom 1.17.x, Java 25. Build profile mc263fabric on Gradle 9.6.0. It is not configured by mc263.

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

Choose a tag to compare

@github-actions github-actions released this 20 Oct 00:10

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 used trySetBlock(..., AIR, null). Vanilla Level.setBlock(pos, state, UPDATE_ALL) only removes a block entity as a side effect of a BlockEntity-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 throws ClassCastException inside BedBlockEntity / 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#tryClearBlock sets 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 air setBlock.
    • trySetBlock goes through one placeBlock helper 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 (setBlock returning 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 status prints dropped, quarantined, qOverflow, and qWriteFail. A rejected explosion handoff is journaled as entries=<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 status lists open batch ids, mode (ROLLBACK / RESTORE), affected counts, and vg_repair_required rows. 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.autoPurgeSeconds stays 0 (GuardianConfig.DEFAULT_AUTO_PURGE_SECONDS). 0 means unbounded retention. 7776000 (90 days) is SUGGESTED_BUSY_SERVER_AUTO_PURGE_SECONDS and is not written into existing configs. Boot logs one warning when the loaded value is 0.
  • rollback.requireConfirm defaults to false. Rollback and restore still apply immediately at op level 3. Setting it to true makes /vg apply the confirmation. The permission table is unchanged.
  • Privacy docs match the shipped Privacy(false, …) default. hashIps: true with the placeholder salt is a hard validation error. Hash width and salt handling are unchanged. Schema version stays 9.

Added

  • OrphanedBlockEntityClearTest plus fake-level and source-contract tests for the clear/place order, the container preflight, and the Gradle profile split.
  • Thirteen primary jars at mod_version 2.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, Mixin JAVA_25, Shadow 8.3.9. Loader ranges: NeoForge [26.2.0.88,26.3), Minecraft [26.2,26.3). Build profile mc262 on Gradle 9.2.0. The jar version is the root mod_version.
  • NeoForge 26.3 cell (mc-26.3/common + mc-26.3/neoforge) for Minecraft 26.3. The loader pin is NeoForge 26.3.0.6-beta (ModDevGradle 2.0.147, Java 25, Mixin JAVA_25). The artifact version is the root mod_version (vonixguardian-neoforge-26.3-2.2.0.jar), with no extra suffix. Build profile mc263 on Gradle 9.2.0. Re-pin neoForge.version when NeoForge publishes a stable 26.3 loader. This cell is one of the thirteen release jars.
  • Fabric 26.2 cell (mc-26.2/fabric, package mc.v26_2): Loom 1.17.21, Fabric Loader 0.19.5, Fabric API 0.161.0+26.2, Java 25. Build profile mc262fabric on Gradle 9.6.0. It is not configured by mc262.
  • Fabric 26.3 cell (mc-26.3/fabric): Fabric Loader 0.19.5, Fabric API 0.161.0+26.3, Loom 1.17.x, Java 25. Build profile mc263fabric on Gradle 9.6.0. It is not configured by mc263.

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

Choose a tag to compare

@Vonix-Network Vonix-Network released this 20 Sep 04:55

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 API 0.161.0+26.2, Loom 1.17.21, Gradle 9.6.0+
  • Fabric 26.3 — Minecraft 26.3 / Fabric Loader 0.19.5 / Fabric API 0.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 renamed explode(...)V to prime(...)Z; the
    injection callback required CallbackInfoReturnable<Boolean>.
  • ConcretePowderBlockMixin — updateShape gained three parameters and
    reordered in 26.x (LevelReader, ScheduledTickAccess, RandomSource);
    descriptor retargeted and pinned explicitly.
  • LeavesBlockMixin — decay moved from tick to randomTick.
  • RavagerMixin — destroyBlock invoke owner narrowed Level → ServerLevel.
  • PortalShapeMixin — createPortalBlocks now a lambda body.
  • Fabric 26.x — Explosion became an interface (ServerExplosion), drop
    signature changed, ContainerMixin target moved to ContainerUser.

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
    under require = 0). Tracked separately; not addressed here.

Checksums

See SHA256SUMS attached to this release.

v2.1.2

Choose a tag to compare

@github-actions github-actions released this 10 Sep 17:56

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

Choose a tag to compare

@Vonix-Network Vonix-Network released this 08 Sep 19:45

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 -dev are 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

Choose a tag to compare

@github-actions github-actions released this 07 Sep 18:15

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.