TickMender

37 switchable fixes for crashes, memory leaks, server lag and slow starts in large Fabric 1.21.1 packs. No gameplay change.
Back to Files

tickmender-1.0.0.jar

File nametickmender-1.0.0.jar
Uploader
NavrelisNavrelis
Uploaded
Oct 4, 2026
Downloads
6
Size
337.4 KB
Mod Loaders
Fabric
File ID
9058491
Type
R
Release
Supported game versions
  • 1.21.1

Curse Maven Snippet

Fabric

modImplementation "curse.maven:tickmender-1726415:9058491"

Learn more about Curse Maven

What's new

Changelog

All notable changes to TickMender are documented here. The format follows Keep a Changelog and this project uses Semantic Versioning.

1.0.0 - 2026-10-04

First public version. TickMender is the fix mod of the Nytheria modpack (Minecraft 1.21.1, Fabric): 37 switchable repairs for crashes, lost data, memory leaks, lag and slow starts in the game and in other mods, for cases where upstream has no fix. Works on clients and on dedicated servers; neither side needs the other to have it. No dependency on Fabric API, nothing shaded.

Every repair has its own switch in config/tickmender.json (default on unless said otherwise), is a no-op when its target mod is missing or is another version than the one the repair was written for, and keeps what the game does: the same world, the same gameplay, the same picture. What each one does, why it is safe and what can differ is in the README, one section per switch.

Stability and crash fixes

  • aetherAercloudSave (The Aether 1.5.11): no lost chunk save (ConcurrentModificationException) while a large aercloud is placed and saved at the same time.
  • merchantShutdownSave (Minecraft; seen with Repurposed Structures 7.5.22): wandering traders and villagers survive a server stop; the shutdown save no longer rolls their trades.
  • almostUnifiedTagReloadLock (AlmostUnified 1.4.2): the server no longer fails to start now and then with Failed to load datapacks; the tag reload runs once per data pack load and on one thread.
  • betterCavesCarvedChunkSet (YUNG's Better Caves 3.1.6): the set of carved chunks, which all worldgen threads write without a lock, is one that may be used that way.

World-close memory leaks

A closed singleplayer world, or a stopped server, used to stay in memory for the rest of the game run (about 235 MB per world opened and closed, and about 40 MB per world that were left after the first four). Five fixes let it go:

  • stoppedServerCriteria (Minecraft): advancement criteria listeners of player objects that never leave (Fabric API's fake players).
  • stoppedServerFakePlayers (Fabric API 0.116.17): the fake player map.
  • stoppedServerModStatics: static fields and collections of twelve mods that keep a stopped server, its worlds, its players or its registries (Open Parties and Claims, Eternal Starlight, Porting Lib, Polytone, What Are They Up To, Bad Packets, Connectivity, BCLib, Xaero's library, WorldWeaver, Twilight Forest, Tide).
  • closedWorldRenderContext (Fabric API 0.116.17 and five mods, client): the client world that was left is let go on the title screen.
  • stoppedServerBiomeSearchCache (Minecraft): the per-thread cache of the biome search no longer keeps the registries of every closed world.

In-game performance

Server tick:

  • puzzlesLibDispatchCache (PuzzlesLib 21.1.x): event dispatch about 100 times cheaper per listener call; it was 20 to 30 % of a busy server tick.
  • astralTickProcedures (Astral Dimension 3.0): three per-entity tick procedures without their lookups and chunk loads.
  • betterEndIslandArenaWait (YUNG's Better End Island 3.1.2): the dragon arena is no longer generated on the server thread at the first visit of the End.
  • twilightForestSpawnLookup (Twilight Forest 4.8.734): the spawn-list hook without the ticketed structure lookup.
  • chunkSendingExpiryScan (Chunk Sending 3.9): the packet cache is scanned for expired entries every five seconds, not every tick.
  • goblinTradersKeyCache (Goblin Traders 1.11.2): the storage key without a regular expression per tick.
  • artifactsDoubleJumpRead (Artifacts Remastered 1.0.0) and tideInfoBlockScan (Tide 2.1.1): no chunk load on the server thread from a block read in a chunk that is not there yet.
  • fuelRegistryApplyOnce (Fabric API 0.116.17): the fuel registry is applied once per fuel map, not on every fuel query; EMI's fuel index at a world join took 10 to 44 s before.
  • structurePlaceFilter (Minecraft): a large structure template is processed only for the blocks of the chunk that is generated, not in full for every chunk it overlaps.

World generation while flying over new terrain:

  • structureTemplateCacheHit (Minecraft; matters with ModernFix 5.25.1): a loaded structure template is answered without the cache's lock.
  • puzzlesLibConfigHolderLookup (PuzzlesLib 21.1.62): a config lookup without the message text that was built for every call.
  • terraBlenderRuleMemo (TerraBlender 4.1.0.8): the surface rule of a biome's namespace is looked up once per rule instead of twice per block.
  • betterCavesNoiseCubes (YUNG's Better Caves 3.1.6): the noise cubes of a chunk's carving are written into arrays a worldgen thread keeps; 11.5 % of all garbage of a flight.
  • betterCavesThresholds (YUNG's Better Caves 3.1.6): a column's thresholds without a new map per column; 3.5 % of all garbage of a flight.

Client:

  • betterGrassifySnowNeighbour (BetterGrassify 1.8.7): the "better snow" check of a chunk mesh without its garbage (47 % of the client's garbage while flying) and with one read of the four neighbours per call.
  • irisSameDimensionReload (Iris 1.8.14; off by default): no rebuild of the shader pipeline for a respawn in the same dimension or for entering a world again.

Start-up, world load and resource reload

  • ringPlacementExecutor (Minecraft): no 30 s stall while the worlds are created; world load 6 to 8 s in every warm boot instead of 34 to 47 s in most.
  • zipPackListingIndex (Minecraft): a zip resource or data pack is walked once per open file, not once per listing.
  • craftTweakerScanCache (CraftTweaker 21.0.38): the scan of every jar on the class path runs once per set of jars instead of at every start (4 to 6 s); the answer is kept in .cache/tickmender/ and checked against the jars before it is used.
  • athenaModelDataMemo (Athena 4.0.6, client): Athena's lookup per baked model, once per block.
  • betterEndFlowerPotModels (BetterEnd 30.5.0 only, client): each flower pot model is built once per reload instead of 4 352 times.
  • betterGrassifyModelHook (BetterGrassify 1.8.7, client): the configured block ids are parsed and looked up once per model loader instead of once per id and block state model.
  • twilightForestModelEvents (Twilight Forest 4.8.734, client): no identifier per jar lid for a baked model that cannot be a lid.
  • blockStateModelIdMemo (Minecraft, client): the model id of a block state is built once per reload instead of three times.
  • moreCullingSpriteScanMemo (More Culling 1.0.10, client): each part of a texture is scanned for translucent pixels once per run of the mod's reload listener.

Log filter

  • logFilter: known, harmless WARN and ERROR lines of other mods stay out of the log (52 patterns in config/tickmender-logfilter.json, 39 texts and 13 regular expressions, with hit counters; replaces the log suppressor of NytheriaOptimiser 2.0, whose pattern file is imported once if it is still there). Each pattern names one known message; errors that can be a real defect are deliberately not filtered: recipes that cannot be parsed, loot table and loot modifier errors, advancements that cannot be loaded, missing sprites and models, tag reference errors. An existing pattern file is never rewritten. A summary of the hits is written when a server has stopped, when a world was left and when the client exits.

JVM arguments hint

  • jvmArgumentsHint (client): a player who starts the pack without the JVM arguments it runs best with is shown them once after the title screen is reached: where to paste the line (the CurseForge app's own menu path when the game was started by it), a Copy button, the sentence "If the game runs worse with these arguments, remove them again.", "Done" and "Do not show again". Measured with the launcher's defaults: 100 frames over 50 ms and a freeze of 1.16 s in a flight; with the line: 42 frames and 189 ms. One preset, g1-pack (heap from 7 000 MB, 4 processors, Java 21), from tickmender-jvm-presets.json (replaceable by a file of that name in config/). Every flag is checked against the running JVM, the line never contains -Xmx / -Xms, and nothing is written into the launcher's files. When the heap is below 10 GB on a PC with at least 16 GB, the hint also says that the pack runs best with 10 GB of memory. No hint when the arguments are already set, when another garbage collector was chosen, or with -Dtickmender.jvmHint=off. English and German.

Diagnostics and reporting

  • One line at start-up and one when the last fix has been looked at say the state of every switch (active, idle (...), off (config), inactive (...)); every injector is checked after it was applied and a missing one is named; the first use of every fix is logged once.
  • -Dtickmender.verifyCaches=true: every fix that answers from something it remembered, or with code of its own in place of a mod's, runs the original as well, uses its answer and reports a difference (VERIFY FAILED) and a count (VERIFY RESULT).
  • -Dtickmender.identityDump=<directory> (client): the baked models, texture atlases and resource lists of a run as files that can be compared byte for byte between two runs.

Not included, on purpose

See the README, "Not fixed here, on purpose": Better Caves' aquifer handler, a fixed order of the Puzzles Lib resource packs, Sporran's hasMethodOverride, a fast path for World.getBlockEntity, the game's fluid check in doCheckFallDamage.

This mod has no related projects