Drop Stacker
A Fabric mod for Minecraft that automatically stacks dropped item entities on the ground into a single entity, reducing entity lag and keeping your world tidy.
Features
- Instant Merging: New drops are absorbed into a nearby pile the moment they spawn — in the same tick, not after a scan interval. A mob's drops collapse before you see them land.
- Whole-Pile Collapse: Each merge pass drains every compatible neighbour at once, so a 100-item pile becomes one entity in a single pass instead of one item per pass.
- Limitless Piles: Stacks beyond vanilla's 64-item limit — up to your configured
maxStackSize, with per-item overrides. - Visual Feedback: Colorful stack count label displayed above items (configurable thresholds).
- Despawn Timer: Optional countdown on the label with urgency-based color coding (supports infinite items with
∞). - Adaptive Scanning: Idle piles progressively back off from scanning (up to
maxScanInterval), so a world full of settled items costs almost nothing. Safe because new drops push into piles on spawn rather than waiting to be polled. - Item Rules: Blacklist, whitelist, and per-item stack-size overrides — all accepting item tags (
#minecraft:logs) as well as exact ids. - Runtime Control:
/dropstackerreloads config, reports stats, and tunes settings without a restart. - Respects Named Items: An item entity with its own custom name is never relabelled or silently absorbed into another pile.
- Vanilla Parity: Merging honours vanilla's infinite-lifetime, near-despawn, and infinite-pickup-delay guards, and keeps the longest pickup delay so merging can't shorten it.
- Server-Side Only: All logic runs on the server. Vanilla clients see counts and timers with no mod installed.
Requirements
- Minecraft 26.2
- Fabric Loader 0.19.3+
- Fabric API
- Fabric Language Kotlin
- Java 25+
Commands
/dropstacker requires permission level 2 (gamemasters).
| Command | Description |
|---|---|
/dropstacker reload |
Reload the config file from disk |
/dropstacker stats |
Merge passes, entities collapsed, and current settings |
/dropstacker resetstats |
Reset the counters |
/dropstacker toggle |
Enable/disable stacking at runtime |
/dropstacker set maxStackSize <n> |
Change the stack cap |
/dropstacker set scanInterval <n> |
Change the scan interval |
/dropstacker set radius <n> |
Change the horizontal scan radius |
/dropstacker set verticalRadius <n> |
Change the vertical scan radius |
Configuration
The config file is created automatically at .minecraft/config/drop-stacker.json (or config/drop-stacker.json on a server). Fields update automatically on restart if you upgrade the mod.
{
"enabled": true,
"mergeOnSpawn": true,
"maxStackSize": 1000,
"radius": 5.0,
"verticalRadius": 2.0,
"scanInterval": 5,
"maxScanInterval": 100,
"maxMergePerPass": 64,
"ageInheritance": "YOUNGEST",
"labelMode": "ALWAYS",
"showDespawnTimer": true,
"countLowThreshold": 64,
"countHighThreshold": 500,
"hideSingleItemLabel": false,
"despawnTicks": 6000,
"blacklist": [],
"whitelist": [],
"overrides": {}
}
| Field | Description | Default |
|---|---|---|
enabled |
Master switch for all stacking | true |
mergeOnSpawn |
Merge new drops instantly as they spawn | true |
maxStackSize |
Maximum items per stacked entity | 1000 |
radius |
Horizontal scan radius (blocks) | 5.0 |
verticalRadius |
Vertical scan radius (blocks) | 2.0 |
scanInterval |
Ticks between merge scans for an active pile | 5 |
maxScanInterval |
Slowest scan rate an idle pile backs off to | 100 |
maxMergePerPass |
Max neighbours absorbed in one pass | 64 |
ageInheritance |
Despawn timer on merge: YOUNGEST, KEEP_RECEIVER, or OLDEST |
YOUNGEST |
labelMode |
When to show the label: ALWAYS, STACKED_ONLY, or NEVER |
ALWAYS |
showDespawnTimer |
Show despawn countdown on the label | true |
countLowThreshold |
Count at which the label turns Yellow | 64 |
countHighThreshold |
Count at which the label turns Red | 500 |
hideSingleItemLabel |
Hide the label if the stack only has 1 item | false |
despawnTicks |
World despawn rate (matches timer to server settings) | 6000 |
blacklist |
Items that are never stacked | [] |
whitelist |
If non-empty, only these items are stacked | [] |
overrides |
Per-item stack caps | {} |
Item rules
blacklist, whitelist, and overrides all accept exact item ids and item tags (prefixed with #):
{
"blacklist": ["minecraft:elytra", "#minecraft:shulker_boxes"],
"overrides": {
"minecraft:cobblestone": 5000,
"#minecraft:logs": 512
}
}
A note on ageInheritance
The default YOUNGEST means a pile inherits the longest remaining lifetime when it absorbs a drop — so a pile next to a farm keeps resetting its despawn timer and effectively never despawns. That is convenient, but on a busy server it lets item piles accumulate indefinitely. Set KEEP_RECEIVER for vanilla despawn behaviour.
Building
./gradlew build
Output JAR is in build/libs/. Gradle provisions the required Java 25 toolchain automatically.
License
MIT — see LICENSE.
[!CAUTION] I am not great at Kotlin and this project was built with AI assistance. There may be bad code, wrong patterns, or things that could be done much better. If you spot anything — please open an issue or a pull request. I genuinely appreciate it and will learn from it. Thank you.
How to Install Drop Stacker (Mod)
Drop Stacker by suwizx_ is verified for Fabric across Minecraft versions 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6 (latest release: 1.3.0, file size: 84 KB). Follow the steps below to install it safely from ModCraft.tv:
- Click the Download button above and select your Minecraft version (1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6) and platform (Fabric).
- Make sure you have the compatible loader or environment installed for Fabric.
- Move the downloaded Drop Stacker file into your Minecraft
.minecraft/modsfolder and launch the game.
All Versions
+ Add Version- Big thanks to [@Skyfay](https://github.com/Skyfay) (Manu), who wrote both pull requests below**, including the gametests that reproduce each bug. 🙏
## Fixed ([#4](https://github.com/suwizx/drop-stacker/pull/4))
Piles above an item's normal stack size reached vanilla code that never expects them. Each case below has a gametest that fails on the previous version.
- Items were deleted when something picked up a pile.** A hopper under 640 cobblestone kept 64 and deleted 576. Hopper minecarts, villagers, allays and piglins lost items the same way. Dolphins, pandas and raiders took a whole pile into a hand slot that cannot be saved above 99. Every pickup, players included, now takes one vanilla-sized stack at a time and the rest stays on the ground.
- Logging mods such as Ledger failed on piles** (
Value must be within range [1;99]). Pickups now only see vanilla-sized stacks, and a freshly dropped item joins the pile around it instead of swallowing it, so the dropped entity still holds exactly what was dropped. - Thrown items vanished into a pile mid-air.** An item you throw (Q, or a villager or piglin handing it over) now flies and lands first, and only then joins a pile.
- A single item could pull a whole pile across the ground.** The biggest pile in range now takes the others in, as vanilla does.
- Labels froze after a restart or chunk reload**, and those piles never merged again. The label is now recognised as the mod's own after loading.
- Drops reserved for one player** (
target) no longer merge with public drops, or the other way round.
## Added ([#5](https://github.com/suwizx/drop-stacker/pull/5))
The defaults render exactly the label you have today, so existing setups are unchanged.
labelFormat/timerFormat:** build the label from placeholders ({count},{stacks},{countColor},{timer},{time},{timerColor}) and&codes, including&#RRGGBB. A format without a timer no longer rebuilds the label every second, so it only sends an update when the count changes.labelMode: OVERSIZED_ONLY:** label a pile only once it holds more than one vanilla stack of its item (2 totems, 65 planks). Smaller piles look like vanilla drops.labelThroughWalls:** set tofalseto hide labels behind blocks. Clients using Entity Culling needminecraft:itemin itsentityWhitelist, see the README.
## Also
- A format with a signed hex colour such as
&#-1abcdis now kept as plain text instead of being read as a colour. - 24 server gametests now run with every build, including a check that the hidden-label flag reaches the packets actually sent.
## Upgrading
Replace the jar; no config changes are needed. Pickups of a big pile now happen one stack per touch, so collecting a very large pile takes a few touches.
## Requirements
Minecraft 26.3, Fabric Loader 0.19.5+, Fabric API, Fab
...
It is still **server-side only**: install it on the server, and players need nothing. Vanilla clients see stack counts and despawn timers without the mod.
## Requirements
- Minecraft **1.21.1**
- Fabric Loader 0.19.5+
- [Fabric API](https://modrinth.com/mod/fabric-api) (tested with 0.116.17+1.21.1)
- [Fabric Language Kotlin](https://modrinth.com/mod/fabric-language-kotlin)
- Java 21+
## Version numbering
The version is
1.2.1+1.21.1: Drop Stacker 1.2.1, built for Minecraft 1.21.1. The 26.3 build stays 1.2.1. The source for this line is on the [1.21.1](https://github.com/suwizx/drop-stacker/tree/1.21.1) branch.## What's included
Everything from v1.2.1:
- New drops merge into nearby piles the moment they spawn, and a periodic scan picks up piles that have moved.
- Stack sizes up to 1000 by default (
maxStackSize), with per-item and per-tag overrides. - Blacklist and whitelist by item id or tag (
#minecraft:logs). [×count | m:ss]labels showing pile size and despawn timer./dropstacker reload | stats | resetstats | toggle | set <field> <value>(permission level 2).- Piles of more than 99 items survive saving and loading.** On 1.21.1 vanilla can't save a stack over 99 at all, so without this fix saving a big pile would fail.
It is still **server-side only**: install it on the server, and players need nothing.
## Fixed
- Piles of more than 99 items were deleted when the world saved and loaded again.** That covers server restarts, chunk unload/reload (walking away and coming back),
/data merge entity, and item piles moving between dimensions.
Vanilla's save format only allows 1–99 items per stack, so larger piles failed to save and were thrown away. Drop Stacker now saves a vanilla-valid stack capped at 99, plus the true count in an extra
DropStackerCount field, and restores the true count on load.- Vanilla clients are unaffected. The limit only exists in the save file, not in what the server sends to players.
- If the mod is ever removed, those piles load as 99 items instead of disappearing completely.
- Piles already lost under earlier versions can't be recovered, because they were saved with no item data.
If you had set
maxStackSize 99 as a workaround, you can raise it again.## Requirements
Minecraft 26.3, Fabric Loader 0.19.5+, Fabric API, Fabric Language Kotlin, and Java 25. These are unchanged from v1.2.0.
Still **server-side only** — vanilla clients see stack counts and despawn timers with no mod installed.
## Minecraft 26.2
Requires Minecraft 26.2, Fabric Loader 0.19.3+, Fabric API, Fabric Language Kotlin, and Java 25.
Minecraft 26.1.2 users stay on [v1.0.1](https://github.com/suwizx/drop-stacker/releases/tag/v1.0.1); that version is preserved on the [
26.1.2](https://github.com/suwizx/drop-stacker/tree/26.1.2) branch.## Instant merging
Merging is now push-based: a new drop is absorbed into a nearby pile in the tick it spawns, rather than waiting for the next scan. Each pass also drains every compatible neighbour instead of one per scan — collapsing a 100-item pile previously took roughly 500 ticks no matter how low
scanInterval was set, and is now a single pass.## Performance
- Blacklist, whitelist and overrides resolve to registry references once at load. The scan predicate previously allocated a string for every candidate of every scan, even with an empty blacklist.
- Neighbour queries use a shared scratch list with a hard limit, instead of allocating a list of every match to then keep one.
- Scans stagger per entity, so a mob's drops no longer all scan on the same tick.
- Idle piles progressively back off to
maxScanInterval, which is safe now that new drops push into piles on spawn. - Vanilla's own 40-tick merge scan is cancelled, so only one merge system runs.
- The name-tag label is rebuilt only when its rendered text would actually change.
## Fixes
- Merged counts never synced to clients.** Counts were mutated in place, but the entity data tracker compares by equality, so the change was never sent. Merging now builds a new stack and goes through
setItem, as vanilla's own merge does. - Items could not merge for the first half-second after being dropped — the pickup-delay check was stricter than vanilla's.
- Large stacks bypassed vanilla's infinite-lifetime and near-despawn guards; both are re-asserted.
- Item entities with their own custom name are no longer relabelled or silently absorbed into a neighbouring pile.
## New
/dropstacker reload | stats | resetstats | toggle | set <field> <value>(permission level 2) — tune and reload without a restart.- Item **tags** (
#minecraft:logs) inblacklistand the newwhitelist, plus per-itemmaxStackSizeoverrides. - New config:
enabled,mergeOnSpawn,maxScanInterval,maxMergePerPass,ageInheritance,labelMode, andradius/verticalRadius. ExistingscanRadiusX/Y/Zconfigs migrate automatically on first load.
### Note on
ageInheritanceThe default
YOUNGEST preserves 1.0.x behaviour: a pile inherits the longest remaining lifetime when it absorbs a drop, so a pile fed by a farm never despawns. Set KEEP_RECEIVER for vanilla despawn behaviour.## Testing
Verified on a live 26.2 server: m
...
First release — automatically stacks dropped item entities on the ground to reduce entity lag.
### Features
- Dropped items of the same type and NBT merge automatically within a configurable radius
- Stacks beyond vanilla's 64-item limit — up to your configured
maxStackSize - Colorful stack count label above items (green / yellow / red by stack size)
- Optional despawn countdown timer on the label (green → yellow → red as time runs out)
- Server-side merge logic only, no client-side desync
- New config fields are added to the file automatically on server restart
### Config (
config/drop-stacker.json)``
json
{
"maxStackSize": 1000,
"scanRadiusX": 5.0,
"scanRadiusY": 2.0,
"scanRadiusZ": 5.0,
"scanInterval": 5,
"showDespawnTimer": true
}
``### Requirements
- Minecraft 26.1.2
- Fabric Loader 0.19.1+
- Fabric API
- Fabric Language Kotlin
- Java 25+