
Yoke
Bigger stacks, earned biome by biome.Yoke
Yoke raises stack sizes one biome at a time. Kill a biome's boss and the things that biome gives you start stacking higher; everything else stays at vanilla until its own boss falls.
Which biome an item belongs to is worked out from the game's own vegetation, spawn, conversion and recipe tables rather than from a list in the mod, so items added by other mods are placed too.
Built against Valheim 1.0.7, Unity 6000.0.75, BepInEx 5.4.23.5, Harmony 2.9.
Features
- Stacks start at vanilla. Each boss raises one biome's items to 2x, capped at 200.
- Weight is untouched by default, so carry weight still decides what comes home.
- Equipment is never made stackable.
- Ore and bars wait for the boss of the biome they come from.
- Stacks move the moment a boss dies, including what is already in your pack.
- A generated item list beside the config names every item, what happened to it, and why.
- Everything is a config entry: the tier table, the multipliers, the cap, per-item exclusions.
How stacks are earned
Stack sizes sit at vanilla (ProgressionBase = 1) until a boss key is set in the world. Each
row of ProgressionTiers names a boss, a biome and a multiplier. The default table:
| Boss | Global key | Raises |
|---|---|---|
| Eikthyr | defeated_eikthyr |
Meadows |
| The Elder | defeated_gdking |
Black Forest |
| Bonemass | defeated_bonemass |
Swamp and Ocean |
| Moder | defeated_dragon |
Mountain |
| Yagluth | defeated_goblinking |
Plains |
| The Queen | defeated_queen |
Mistlands |
| Fader | defeated_fader |
Ashlands |
The highest earned row naming a biome wins, so rows never compound, and one boss may name several biomes. Bonemass carries the Ocean because no boss lives in the water; without that row every fish, chitin and bait would sit at vanilla all game.
Deep North has no row in the default table, so its items stay at the base multiplier however many bosses fall. Yoke logs one line at startup saying so.
The change lands when the boss dies, not at the next login. Item prefabs, the stacks in your inventory and the stacks in a container are all rewritten (a container catches up the moment you open it).
Any global key works in ProgressionTiers, not just boss keys, so a modded boss can be added
as a row.
How an item's biome is decided
Six routes, all reading the game's own data:
- Vegetation table. A copper deposit is placed in the Black Forest and the deposit drops copper ore, so copper ore is a Black Forest item.
- Spawn tables. Fulings are Plains and the Fuling's drop list has black metal scrap, so black metal is Plains.
- Spawners. A greydwarf nest or a surtling geyser is what the tables know about, not the creature it makes.
- Recipes, smelters, cooking stations and fermenters. Anything made takes the biome of its latest ingredient. Barley is Plains, so flour is, so dough is, so bread is.
- Boss drops. A boss prefab knows the global key its death sets and the tier table knows which biome that key belongs to, so Moder's trophy is a Mountain item without either side naming it.
BiomeOverrides, for the roots none of that reaches: ore deposits inside locations, dungeon loot, fish, and trophies of creatures that only appear inside a location. Roots only; the recipe pass turns each one into everything made from it.
An item found in several biomes takes the earliest. A crafted one takes the latest of its ingredients: found is about where it turns up, made is about when you can make it.
Anything no route can place stays at vanilla and shows as none in the item list, which is
where you find candidates for BiomeOverrides. On a current 1.0 install that is around 80
stackable items out of roughly 1,500 in the database.
Ore and bars
Items the game marks as non-teleportable (ore, bars, and a handful of others) are held at
vanilla until the boss of their own biome falls: copper and tin at the Elder, iron at Bonemass,
silver at Moder, black metal at Yagluth, flametal at Fader. IncludeNonTeleportable = true
gives them their bigger stacks straight away.
Yoke does not read or write what may go through a portal. The no-portal flag is only how it finds the metals; the rule being applied is about stack size.
The load guard
Inventory.Load clamps every stored stack to the item's current maximum. For a moment after
login, before the server's global keys have arrived, those maximums are briefly vanilla again,
and a stack clamped during that window is saved clamped and permanently smaller. Yoke removes
the clamp from the load path only, so pickup, crafting and splitting keep vanilla's rules.
That patch is a transpiler, and a game update can move the IL out from under it. If it cannot install, Yoke holds every stack at its vanilla size and logs an error rather than raising stacks it cannot protect. See Troubleshooting.
Installation
Yoke is a single DLL with no assets.
Requires BepInEx 5.4.2350. BepInEx 5 only; this does not run on BepInEx 6.
Mod manager: install Yoke from Thunderstore.
Manual: drop Yoke.dll into BepInEx\plugins\.
Install it on the dedicated server and on every client, at the same version. It loads fine on
valheim_server.exe.
Configuration
BepInEx\config\ezomic.valheim.yoke.cfg, written on first run.
Stacks
| Key | Default | Effect |
|---|---|---|
StackMultiplier |
2 |
Flat multiplier on vanilla stack size. Used only when ScaleWithProgression is off. |
StackCap |
200 |
Ceiling on stack growth. An item whose vanilla stack is already above it keeps its vanilla stack, so coins stay at 999. |
WeightMultiplier |
1 |
Multiplies item weight. 1 leaves weight alone. |
IncludeNonTeleportable |
false |
Give ore and bars their bigger stacks immediately instead of waiting for their own biome's boss. |
IncludeTrophies |
true |
Also affect trophies. |
ExcludeItems |
empty | Comma-separated prefab names to leave completely alone. |
Progression
| Key | Default | Effect |
|---|---|---|
ScaleWithProgression |
true |
Each boss raises one biome. Off falls back to StackMultiplier for everything. |
ProgressionBase |
1 |
Multiplier for a biome no boss has unlocked. 1 is vanilla. |
ProgressionTiers |
the eight rows above | boss:biome:multiplier, comma separated. Biomes: meadows, blackforest, ocean, swamp, mountain, plains, mistlands, ashlands, deepnorth, all. |
ProgressionOrder |
the seven bosses | The order bosses come in, which is what makes ProgressionStep mean "later". Idle while ProgressionStep is 0. |
ProgressionStep |
0 |
How much every boss after the one that unlocked a biome raises it again, compounding. 0.1 makes Meadows 2x at Eikthyr, 2.2x after the Elder, 3.54x with all seven dead. |
BiomeOverrides |
~100 entries | prefab:biome, comma separated, for items the tables cannot place. The shipped list is the roots (ore deposits, dungeon loot, fish, location-only trophies); everything made from them is derived. |
DeferToUtangard |
true |
When Utangard is installed, ask it whether the group has earned a boss instead of reading the world key. No effect otherwise. |
Diagnostics
| Key | Default | Effect |
|---|---|---|
WriteItemList |
true |
Write ezomic.valheim.yoke.items.txt beside the config. |
Verbose |
false |
Log every item whose stack size or weight changed. |
A malformed ProgressionTiers or BiomeOverrides entry is logged and dropped; the rest of the
line still applies.
With ScaleWithProgression = false, metals are held at vanilla permanently unless you also set
IncludeNonTeleportable = true. There is no biome tier left for them to wait for.
BepInEx writes every entry to disk on first run and the saved value beats a new default in
code, so a default that changes in a later version does nothing on a machine that has already
run the mod. Edit the .cfg.
The item list
BepInEx\config\ezomic.valheim.yoke.items.txt, rewritten whenever the numbers change.
ExcludeItems takes prefab names, and prefab names are not guessable: copper ore is
CopperOre but raspberries are Raspberry and a draugr's arrow is draugr_arrow. So the mod
writes down every item it saw, what it did to each one, and which rule stopped it when it did
nothing.
Prefab Name Type Biome Stack Weight Status
Wood Wood Material meadows 50 -> 100 2
CopperOre Copper Ore Material blackforest 30 -> 60 10
Barley Barley Material plains 100 0.2 awaiting defeated_goblinking
BlackMetal Black Metal Material plains 30 12 metal-held until defeated_goblinking
SwordIron Iron Sword OneHanded swamp 1 0.8 equipment
An arrow means Yoke changed that value. A single number means it did not, and the Status column
says why: a rule that refused the item, or the boss whose death will raise that biome. Rows are
sorted by biome, which puts the unplaced none rows at the bottom.
The header carries the settings that pass ran under, what each biome is currently worth, how many items the biome index placed, and a count per reason:
Earned so far: meadows 2x, blackforest 2x, ocean 2x, swamp 2x, mountain 2x, plains 1x, ...
1522 items: 219 raised above vanilla, 200 waiting on a boss, 978 left alone by a rule, 125 unchanged
(equipment 966, metal-held 12, trophy 0, excluded 0, unguarded 0)
unguarded is the one reason in that list that means the mod is not doing its job rather than
that it decided not to. On a healthy run it is 0.
Multiplayer
Progression is the world's, not the character's. Stack size lives on the item prefab, so per-player stacks would mean two clients holding different item databases: one drops a hundred wood in a shared chest, the other opens it holding a slot over its own maximum, and the next move writes back through the smaller rules. Global keys are world state the server pushes to every client, so everyone computes the same answer. A fresh character joining a Mistlands-era world gets Mistlands-era stacks.
Install the same version on the server and on all clients. A client rebuilds its item database from the server's copy when it joins, and Yoke re-applies its own numbers after that copy.
With Longhouse Core installed, Yoke registers with the version check and the host's Yoke settings are applied on connected clients in memory, without writing to the client's own config file.
Compatibility
Longhouse Core is an optional soft dependency. Installed, Yoke joins the version check (clients whose mod versions or build ids do not match the server are rejected on connect) and follows the host's config. Absent, Yoke installs and runs on its own with none of that. In single player it makes no difference.
Utangard opens a biome only when
every member of the group was personally present at that boss's death, which is not the same as
the boss having died in the world. When Utangard is installed, Yoke asks it instead of reading
the key, so stacks do not arrive for a biome Utangard is still holding shut. Soft in both
directions: neither mod needs the other, and DeferToUtangard = false turns it off.
Other stack mods. Do not run a second one. Yoke captures each item's original stack size and weight the first time it sees the item, so whatever another mod wrote before that point becomes what Yoke treats as vanilla.
If you are coming from Hoard (Yoke's old name), the old .cfg is copied over on first run
so settings carry across, including a hand-edited BiomeOverrides.
Troubleshooting
Everything is at vanilla size. Look in BepInEx\LogOutput.log for UNGUARDED or
LoadGuard could not find Inventory.AddItem. The load guard failed to install, and Yoke holds
stacks at vanilla rather than raising stacks it cannot protect through a world load. It needs
retargeting against the current game version; report it.
One item did not change. Open ezomic.valheim.yoke.items.txt and find its row. The Status
column gives the reason: equipment, metal-held, trophy, excluded, or the boss it is
waiting on.
A whole biome's items never grow. Either no ProgressionTiers row names that biome (the
startup log says which), or the items came out with no biome at all and need a
BiomeOverrides entry. The none rows at the bottom of the item list are the candidates.
A setting I changed did nothing. Check the .cfg on the machine in question. On a server,
Core applies the host's values to clients, so a client-side edit to a synced setting is
overwritten while connected.
A stack reads 100/50. That is a stack that was legal when it was made and is now over its own limit, usually after a biome reclassification in a mod update. The game tolerates it: the slot refuses to grow and shrinks as it is spent. Nothing is lost.
Bug reports
Discord is the fastest route, and the right one if you are not sure whether what you are seeing is a bug. Issues on the repo work too and suit anything long.
Attach:
BepInEx\LogOutput.logBepInEx\config\ezomic.valheim.yoke.items.txtand the.cfgbeside it- whether you were on a server or in single player
- the prefab name of the item, if it is about one item
AppData\LocalLow\IronGate\Valheim\Player.logif a vanilla mechanic broke, since exceptions thrown mid-frame land there rather than in the BepInEx log
Bugs and ideas
Both go to the site. longhouse.thijssensoftware.nl/bugs is for anything broken, and longhouse.thijssensoftware.nl/ideas is for what a mod should do next. You can vote on other people's ideas there as well.
Signing in takes a Steam or Discord account. I work from that list, so the votes decide what I pick up next.
Discord
discord.gg/hJzAVaZ5wb is used for mod information, updates, support, bug reports, and compatibility questions.
Server
There is also a small EU server running the pack if you want somewhere to play: hard combat difficulty, resources at 1x, everything else vanilla, no application and no activity requirements. Connection details are in the Discord.
Building
dotnet build
Targets net462 and references the game's managed assemblies directly, so no NuGet restore is
needed. The build deploys to the repo-local testprofile\; override with
-p:ProfileDir=<path>.
Design notes
Why both ObjectDB entry points are patched, why every value is computed from the item's
captured original, where the biome routes stop, and the bugs that shaped the load guard and the
live-inventory sweep: DESIGN.md.
Part of Longhouse
Yoke is part of the Longhouse modpack, which pins exact versions of the Ezomic mods. You do not need the pack to use Yoke, and it behaves the same on its own.
Author
Yoke is an original mod by Robbin Thijssen (Thijssen Software).
Copyright (c) 2026 Robbin Thijssen. MIT licensed. See LICENSE.

