Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
| Date uploaded | 9 hours ago |
| Version | 1.2.2 |
| Download link | Ezomic-Yoke-1.2.2.zip |
| Downloads | 91 |
| Dependency string | Ezomic-Yoke-1.2.2 |
This mod requires the following mods to function
denikson-BepInExPack_Valheim
BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.
Preferred version: 5.4.2350README
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.
CHANGELOG
Changelog
Notable changes to Yoke. Format follows Keep a Changelog, and the mod uses semantic versioning.
1.0.0 is the first published version. The numbers below it were development builds; the rule was that 1.0 is spent on the build that actually ships, and it was.
[1.2.2] - 2026-09-30
Added
yoke item <prefab>in the console prints the biome an item is filed under, the rule holding it back if there is one, and its stack size now and in vanilla. It is not a cheat and needs no devcommands.
Changed
- The README has a Bugs and ideas section. Both go to longhouse.thijssensoftware.nl, where you can also vote on other people's ideas.
Fixed
- Some Deep North items were filed as Meadows items, so their stacks were raised once Eikthyr fell rather than waiting on the Deep North: the Elaking and Jotun trophies, the Elaking hair bundle, and the Vanguard chestpiece with its cast and moulds. The Jotun invasion spawns in every biome, and the shared biome index read that as the Meadows. Invasion spawns no longer decide where a creature belongs, and these items now sit in the Deep North with the rest of that armour.
[1.2.1] - 2026-09-12
Changed
- Rewritten README. Same mod, clearer documentation: what it does and how to install it come first, then configuration, multiplayer behaviour, compatibility and troubleshooting. Every config table was checked against the plugin's own Config.Bind calls, so the settings, sections and defaults listed are the ones actually bound. No code changed in this release.
[1.2.0] - 2026-09-09
Rebuilt for Valheim 1.0. This version does not run on pre-1.0 Valheim, and the previous one does not run on 1.0.
Fixed
- Stacks above the vanilla limit are no longer destroyed when a world loads. The load-path guard targets one exact method, and Valheim 1.0 moved the clamp onto a different overload - the string-keyed one became a two-line forwarder holding no clamp at all. So the guard silently stopped guarding, and stored stacks were clamped on load and saved clamped, which destroys the excess permanently. Retargeted, and the guard still covers only the load path, so pickup, crafting and splitting keep vanilla's rules exactly as before.
Added
- A group carrying items no boss will ever raise is now reported at startup, once, naming
the group. Deep North is the first case: nothing in
ProgressionTiersnames it, so its items sit at the base multiplier however many bosses fall - and the progression summary deliberately omits tierless groups, so that was the one thing nothing would have mentioned.
[1.1.0] - 2026-08-29
Changed
-
Metals wait for their own biome now, like everything else does. Ore and bars are held out of the ramp on purpose, because hauling metal is pacing rather than an oversight - but which boss lifted that was a single global switch, and it cut the wrong way at both ends. Black metal got a bigger stack the moment Bonemass died, before the Plains had been seen; copper and tin sat at their vanilla thirty through the entire bronze age with the Elder long dead. Metals were the one thing in this mod not following the mod's own rule.
Each metal now waits for the boss of the biome it comes from: copper and tin at the Elder, iron at Bonemass, silver at Moder, black metal at Yagluth. It asks the same question the multiplier already asks of the same item, so the two cannot drift apart. The pacing survives - never a bigger stack of a metal before you are established where it is mined - and in practice only copper, tin and iron move, since Bonemass is always down long before silver is worth carrying.
-
LiftPortalRuleAtis removed. Naming one biome for every metal was exactly what was wrong, so there is nothing left for it to say. An orphan line in an existing config file is harmless. -
The item list says
metal-heldinstead ofportal-blocked, and names that metal's own boss rather than one answer copied across all of them. The old word described the flag used to FIND the metals rather than the rule being applied, and it read as though the mod had opinions about portals. It does not: nothing here reads or writes what may go through one, andIncludeNonTeleportablenow says so plainly - it is about stack size and nothing else.
[1.0.5] - 2026-08-29
Fixed
- Stack sizes were wrong for a lot of items, permanently, and quietly. The biome
index was lying three ways.
BlackMetalsat in the plains whileBoltBlackmetalsat in the meadows, in the same file: the bolt is black metal, wood and feathers, and on the first pass the bar had not been mapped yet - it is a blast furnace conversion rather than a drop - so the recipe answered from the wood alone. Nineteen recipe outputs were frozen that way. Separately the meadows tier carried Mistlands and Ashlands drops - carapace, charred bone, entrails, the Draugr, Seeker and Fuling trophies - because vanilla ships rows whose biome mask says Meadows and whose spawn is gated behind a global key, and the mask was read without the gate. Twelve rows do this. Both were permanent rather than transient because every writer took the earliest answer and refused every later one, so a wrong first pass could never be corrected.
Changed
BiomeIndexmoves to Longhouse Core's shared source rather than being owned here. It is compiled into this mod, not into Core's DLL, so Core is unchanged and remains a soft dependency.
[1.0.4] - 2026-08-26
Fixed
- 1.0.3's package contained 1.0.2's DLL. The publish zipped a stale staging folder, so the load-guard fix below never actually shipped under that number. This version is the same code, packaged from a fresh build. 1.0.3 should not be installed.
[1.0.3] - 2026-08-26
Fixed
- Stored stacks survive loading. Seen on live: a chest holding 100 greydwarf eyes read 50/100 after a relog, the other 50 destroyed. For a moment after login - before the server's progression keys arrive - every stack limit is briefly vanilla again, the relogging player owns the chests around them, and the game's inventory loader clamps every stored stack to the limit of that moment. The clamp is now removed from the load path, and only there: an over-limit stack shows as 100/50 for a few seconds and normalises when the real limits land, where the clamped half of a stack was simply gone.
[1.0.2] - 2026-08-26
Fixed
- The stack cap no longer shrinks items whose vanilla stack already exceeds it. It was written as a ceiling on the multiplied result, which quietly cut coins from their vanilla 999 to the default cap of 200 - the one item in the game above the cap. The cap now limits growth only; anything at or above it keeps its vanilla stack.
[Unreleased]
Fixed
A boss dying mid-session now moves the stacks you are carrying. 1.0.0 wrote the new numbers onto the item prefabs and stopped there, which is not where the game reads them from: an inventory item is a MemberwiseClone that only looks like it shares its prefab's data, so the wood in your pack kept its old limit until the next world load. That was the one path 1.0.0 shipped unproven, and it did not work. Stacks in your inventory are rewritten as soon as the key arrives, and a chest catches up the moment it is opened.
Changed
Bonemass now raises Ocean goods as well as Swamp ones. No boss lives in the water, so without a row naming it every fish, and chitin, and fishing bait sat at vanilla for the whole game with nothing ever coming to raise them. Bonemass rather than an earlier boss because the longship is the boat that makes a day's fishing worth hauling home.
This is a default, and BepInEx keeps the value already written to your .cfg. Add
defeated_bonemass:ocean:2 to ProgressionTiers to pick it up on an existing install.
[1.0.1] - 2026-08-25
Stack sizes could revert to vanilla for a boss the group had already killed, and stay there for the rest of the session.
ZoneSystem.RPC_GlobalKeys clears the world's key list and re-adds it one key at a time,
on every client, every time anybody sets any key. This mod's hook is on GlobalKeyAdd - the
right place, because it is the only one that catches the bulk list a server sends on connect -
but it acted there, which meant asking "what has the group earned?" once per key against a
dictionary that was still filling up.
With Utangard installed that question goes to its roster, built from the same half-filled dictionary. On the live server it answered "not earned" mid-refill, this mod wrote vanilla stack sizes off the back of it, and no further key ever arrived to trigger a correction.
Fixed
- The key hook marks rather than acts. The flag is drained in
Update, which is the first moment the whole list is certainly in. As a side effect a connect's worth of keys is now one walk of the item database instead of one walk per key.
[1.0.0] - 2026-08-18
First release.
Yoke raises the stacks of a biome's own goods when you kill that biome's boss. Meadows timber doubles when Eikthyr falls, Black Forest ore when The Elder does, and so on to Fader and the Ashlands. Nothing else changes: weight is untouched, equipment never stacks, and until the Swamp is earned a portal still refuses ore.
What makes it different from the rest of its category is that nothing is listed. Which biome an item belongs to is worked out from the game's own tables, so an item a content mod adds lands in the right place by itself:
- the world's vegetation table, where a copper deposit is Black Forest and the deposit says it drops copper ore;
- the spawn tables and spawners, down to the nest that makes the creature rather than the creature itself;
- recipes, smelters, cooking stations and fermenters, where a made thing takes the biome of its latest ingredient, so bread is Plains because barley is;
- each boss's own drops, matched through the global key its death sets;
- and a short override list for the roots that only exist inside locations.
That places 665 of 671 stackable items. The six it does not are crafting oddities, left alone rather than guessed at.
The generated item list beside the config names every item, what was done to it, and which rule or which boss it is waiting on.
Verified in play
Wood at 100 and blueberries at 50 on a world with Eikthyr down, with copper ore still portal-blocked. The biome index, the tier ramp, the portal rule and the retune when a world's keys arrive were all confirmed on a real client.
Not yet seen: a boss dying mid-session and the stacks moving without a restart. The path is exercised on every world load; what is unproven is that one arrival.
[0.13.0] - 2026-08-18
Hoard is now Yoke
A yoke is the bar across the shoulders that turns two loads into one carry, which is what this mod does. "Hoard" named the pile; it never named the carrying, and the carrying is the half the progression is about.
Nothing about the behaviour changed. What the rename touches:
- The plugin GUID is now
ezomic.valheim.yoke, so the config file is renamed with it. Hoard's config is adopted automatically on the first run under the new name, before anything binds, so settings carry over unchanged. That matters more than it sounds:BiomeOverridesruns to about a hundred entries, and a silent reset would drop the mod back to derived-only placement with nothing in the log to explain why the ore stopped stacking. - The assembly, namespace and plugin class follow the name.
- The icon is redrawn: two stacks under a notched bar, rendered through the suite's shared icon script so it sits correctly beside the others.
No world data is at risk. This mod registers no prefabs, so nothing saved is keyed to a name that would stop resolving.
[0.12.1] - 2026-08-17
Everything is placed
665 items placed, six left. Two more derivations and a filled-in override list took the unplaced count from 122 to 6.
- Spawners. A greydwarf nest, a surtling geyser, the skeleton piles in a crypt: the
creature is not in the world's spawn table, the thing that makes it is. Walking
SpawnAreafinds them, which is where most of the missing trophies were. - Bosses place their own drops. A boss stands in a location so nothing else can see it,
but the boss prefab knows the global key its death sets and the tier table knows which
biome that key belongs to. Moder's trophy is a Mountain item because Moder's key is the
Mountain's key, since neither side names an item, and a modded boss added to
ProgressionTiersbrings its drops with it. BiomeOverridesnow ships the roots that live inside locations: ore deposits, dungeon loot, dvergr and charred material, fish, and the trophies of creatures that only appear in a location. Roots, not a full list: the recipe pass turns each one into everything made from it, so cooked fish, chicken, spices and meads all placed themselves from these.
The six that remain are AxeHead1, AxeHead2, BarrelRings, FireworksRocket_White,
Ironpit and ScytheHandle, crafting oddities nobody hauls. They are unplaced rather than
guessed at, because a wrong biome is worse than vanilla, and they stay at vanilla.
[0.12.0] - 2026-08-17
A boss raises the biome it guards
The four hand-made categories are gone. Each boss now raises the stacks of everything that comes from its own biome: Eikthyr the Meadows, The Elder the Black Forest, Bonemass the Swamp, and so on through Fader and the Ashlands. Copper stops being a nuisance once the Black Forest's boss is dead, and not before.
This also settles what the last three versions kept circling: with a biome each, all seven bosses matter without inventing categories for the late ones or adding a percentage drift.
Nothing is listed. Which biome an item belongs to is worked out from four sources:
ZoneSystem.m_vegetation: a copper deposit is Black Forest and the deposit says it drops copper ore, so copper ore is Black Forest.- The spawn tables plus
CharacterDrop: Fulings are Plains, so black metal scrap is Plains. - Recipes, smelters, cooking stations and fermenters, where a made thing takes the biome of its latest ingredient. Barley is Plains, so flour is, so dough is, so bread is, across a mill, a recipe and an oven. Every mead lands off the fermenter the same way.
BiomeOverrides, for what none of that reaches.
Found items take the earliest biome they appear in, made items the latest of their ingredients. Not a contradiction: found is about where it turns up, made is about when you could make it. That rule also repairs a wrong answer for free: Charred warriors drop bronze, so the spawn tables call bronze an Ashlands item, and the recipe calling it Black Forest wins.
On this machine it places 543 items, with 122 stackables left over, mostly fish,
trophies and chest loot, all of which stay at vanilla. The item list prints them so
BiomeOverrides is filled in from what is really missing.
The overrides shipped by default are the ones no table can see: iron scrap and the copper and silver deposits live inside locations, whose prefabs are soft references that are not loaded until the game wants them, and forcing dungeon interiors to load on the way into a world is not worth what it buys.
LiftPortalRuleAt replaces the old metal group: the Swamp tier now lifts the portal rule,
because Bonemass is where iron begins and the copper runs are behind you by then.
Fixed
- The index rebuilt once per item while incomplete, walking every prefab in the scene a thousand times per pass. It is built once per pass now.
SpawnSystem.Awakefires more than once in a loaded world; the rebuild is guarded so it happens on the first one only.- Overrides were applied after the conversions, so copper bars came out unplaced. The smelter pass went looking for copper ore before the override had put it on the map. They are applied before the derivation as well as after.
- Conversions and recipes ran in sequence, which left bread unplaced whatever the pass count, because the step it waited on lived in the other list. They interleave until it settles.
[0.11.1] - 2026-08-17
Progression finishes at Bonemass
ProgressionStep now defaults to 0, so nothing after Bonemass changes a stack size.
The mechanism from 0.11.0 stays as a knob; it is simply off.
Three reasons it should not be the default, and none of them is that it did not work:
- Ten percent is imperceptible. Wood going 100 to 110 is not a reward anyone feels, and it lands at the moment a boss dies, when there is a great deal else to notice.
- The numbers read as a bug. Vanilla stacks are round: 20, 30, 50, 100. Compounding produces 121, 133, 146, 177, which look like a fault rather than a design.
- It drifts past the honest amount. Building ended at 3.54x, well beyond the flat 2x this mod ships and defends. A narrow table that quietly widens forever is the x10 mod taking the long way round.
Ending at Bonemass is a complete design and not an unfinished one: by then you have portals, a cart and a longship, which is the game solving hauling on its own.
[0.11.0] - 2026-08-17
Every later boss adds ten percent (off by default since 0.11.1)
A boss now raises the group it is assigned and every group unlocked before it, by
ProgressionStep, ten percent, compounding. Building unlocked at Eikthyr is 2x, 2.2x once
The Elder is down, 2.42x after Bonemass, and 3.54x with everything dead.
Only three of the seven bosses unlock a group, so without this the whole feature was over by Bonemass and the back half of the game got a reward table that had stopped paying. It also gives the four bosses that unlock nothing something to do, without inventing a category for them or reaching for a second axis like weight.
Ten percent is small enough that it never turns into the x10 mod by accident: six of them
on a doubled stack is 3.5x, and StackCap still caps all of it. ProgressionStep = 0
restores flat tiers.
ProgressionOrderis new, because "later" needs an order and the tier table never had one. A key that is not listed still unlocks its own group; it simply never counts as before or after anything, which is the honest answer for a modded boss key somebody added to the tiers and not the order.- A group still at the base multiplier does not compound. Untouched is untouched, not "unlocked at zero percent".
Untested: the compounding itself. The dev world has only defeated_eikthyr, so no run
here has had two keys down at once, so the unlock path and the retune when a key arrives are
both verified live, the ten percent is verified only by reading it.
[0.10.1] - 2026-08-17
The table is shorter on purpose
Ammo, food and the catch-all group lost their tiers, and trophies moved to Bonemass. Three entries remain: Eikthyr raises building material, The Elder the crops, Bonemass the metal and the trophies.
A group with no entry stays at vanilla forever, and most of the game's stackables are meant to. A mod that eventually doubles everything is a slower version of the one that doubles it on day one; what is left here is the hauling that is actually repetitive.
- The portal rule now says when it lifts. Ore read
portal-blocked, which is a half-truth once a metal tier exists. It now readsportal-blocked until defeated_bonemass. Tallies match on the rule, so a qualified note still counts under it. - "Earned so far" lists only groups a tier can reach. Printing the others at 1x read as a promise that some boss would come for them, and with this table none will.
[0.10.0] - 2026-08-17
Each boss raises one kind of stack
Stacks now start at vanilla and each boss unlocks one group. ScaleWithProgression = false
restores the old flat multiplier.
A flat multiplier cannot tell the two halves of this mod's own argument apart. Meadows scarcity is the game teaching you to plan; the ninth trip to the same copper deposit is not teaching you anything.
- The groups are read off the game's own systems. Building material is whatever appears as a build cost on the Hammer's piece table, crops are the Cultivator's, metal is whatever a portal refuses. So an item a content mod adds lands in the right group by itself, and there is no list here to go stale.
- An earned metal tier lifts the portal rule. The haul is real pacing during the first
copper runs and paid off by the boss that hands you the iron age.
IncludeNonTeleportablestays for anyone who wants it sooner. - The item list names the boss each group is waiting for, so "why is my wood still 50" is answered in the file rather than by reading the tier table.
It hangs on the world's progress, not each player'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 pushed to every client, so everyone computes the same answer with no new networking, and since keys only accumulate the multiplier only ever rises.
Read through the string global-key lookup, not the GlobalKeys enum: that enum stops at
defeated_goblinking in this build, with no defeated_queen or defeated_fader member, so
the enum route would have silently capped the ramp at the Plains.
Utangard decides what counts, when it is installed
Utangard opens a biome only when every member of the group was personally at that boss's
death, which is not the same as the boss having died in the world. Yoke now asks it rather
than reading the raw key, so stacks never arrive for a biome Utangard still has fenced off.
Soft dependency; DeferToUtangard = false turns it off, and neither mod needs the other.
Changed
- The item list gained a Group column, sorts by group, and its header counts describe the
state of the database rather than the last pass, so they no longer appear to
contradict the
Retuned nline in the log, which counts only what that pass moved.
[0.9.2] - 2026-08-17
Added
-
An item list, written beside the config on every run.
ezomic.valheim.yoke.items.txt. Every item in the game, its vanilla stack size and weight, what Yoke made them, and which rule left it alone when it did nothing. Off withWriteItemList = false.ExcludeItemstakes prefab names and prefab names are not guessable: raspberries areRaspberryand a draugr's arrow isdraugr_arrow, so a per-item setting without a list beside it is a setting nobody can spell. It doubles as the answer to "why did this item not change", which is the only question a mod like this ever gets, and it answers it without asking anyone to turn onVerboseand read a log.The rows are built by the tuning pass as it runs rather than by a second walk over the database. A separate walk would be a second copy of the eligibility rules, and the first thing it would do is disagree with the real one.
Fixed
- Weights are written with a decimal point on every machine.
float.ToStringfollows the machine's locale, so on a Dutch install resin came out as0,3, and a comma in a file whose other numbers come from a.cfgthat uses points, sitting next to a column of integers. Both the item list and theVerboselog now format invariantly.
Changed
- The pass logs three counts rather than two: changed, already at those values, and left
alone. They add up to the item count now.
Retuned 0on the second setup of a session reads like a failure until you know the other items were already at the right numbers.
[0.9.1] - 2026-08-17
Core is optional
- Core is now a soft dependency rather than a hard one. Yoke installs and runs on its own, and the Thunderstore package no longer drags Core in with it. Present, Core is used; absent, nothing here is degraded.
- What is given up standing alone is the version gate, not the mod. Item data that
differs between two ends desyncs inventories, and without Core nothing reports that. The
ObjectDB.CopyOtherDBpatch still puts a joining client on the server's numbers, which covers the common case on its own. Solo, none of it applies. - The registration call sits in its own method that is never inlined, because the JIT
resolves the assemblies a method needs when it first compiles that method. A Core call
written directly into
Awakewould drag the assembly in before the installed-check could prevent it, and the missing-assembly exception would land during plugin load, which is precisely the failure the soft dependency exists to avoid.
[0.9.0] - 2026-08-16
First complete build. Carried the number 1.0.0 until the release policy above was settled; it was never published under it.
Stacks
- Stacks double. Wood 50 becomes 100, with a hard ceiling of 200 whatever the multiplier says.
- Weight is untouched by default. The carry limit still decides what comes home, which is the half of the logistics problem worth keeping.
- Ore and metal bars are not modified at all. Metal cannot go through a portal, so hauling it by cart and boat is deliberate pacing rather than an oversight. One config line turns it on if you disagree.
- Equipment is never made stackable. Only items with a vanilla stack size above 1 are touched, because anything that does not stack in vanilla carries per-item durability and quality, and collapsing several into a count throws all but one of those away silently.
Why the defaults are low
The usual version of this mod ships x10 stacks and halved weight, which does not make Valheim more convenient so much as remove a system from it. The tedium and the difficulty are the same mechanic seen from two sides, so the defaults here fix the annoying half and leave the interesting half alone. Everything is a knob if you want the easy version.
Correctness
- Both
ObjectDB.AwakeandObjectDB.CopyOtherDBare patched.Awakebuilds the database at startup andCopyOtherDBrebuilds it when a world loads, so patching only the first means untouched values quietly replace yours the moment you join a game. - Every value is computed from the item's original, captured the first time it is seen and never overwritten. The database is set up more than once, and a mod that multiplies whatever it currently finds squares its own multiplier on the second pass.
- Loads on dedicated servers, and declares to Core's version gate so a host and a client cannot disagree about stack sizes.
Known limits
- If another mod changes an item before this one first sees it, that changed value is what gets recorded as the original.