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 | 20 hours ago |
| Version | 1.0.0 |
| Download link | Ezomic-Yoke-1.0.0.zip |
| Downloads | 19 |
| Dependency string | Ezomic-Yoke-1.0.0 |
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.2333README
Yoke
Bigger stacks, without turning the game into a sandbox.
Built against the installed game (0.221.12, Unity 6000.0.61, BepInEx 5.4.23.3, Harmony 2.9).
The defaults are the point
The usual version of this mod ships x10 stacks and halved weight. That does not make Valheim more convenient so much as remove a system from it. The mid game is largely a logistics problem, and 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:
| Default | Effect |
|---|---|
StackMultiplier = 2 |
Stacks double. Wood 50 → 100 |
WeightMultiplier = 1 |
Weight untouched. Carry limit still decides what comes home |
IncludeNonTeleportable = false |
Ore and metal bars are not modified at all |
StackCap = 200 |
Ceiling regardless of multiplier |
That third one is the important one. Metal cannot go through a portal, so hauling it by cart and boat is a deliberate part of the game's pacing rather than an oversight. Leaving ore alone means your inventory stops being a nuisance for berries and wood while the trip home from a copper mine is still a trip.
Everything is a knob. If you decide you want the easy version, it is one edit away.
Each boss raises one kind of stack
A flat multiplier cannot tell the two halves of that argument apart. Meadows scarcity is the game teaching you to plan; your ninth trip to the same copper deposit is not teaching you anything. So stacks start at vanilla and each boss raises one group:
Kill a biome's boss and the things that biome gives you stack better.
| Boss | Raises |
|---|---|
| Eikthyr | Meadows |
| The Elder | Black Forest |
| Bonemass | Swamp |
| Moder | Mountain |
| Yagluth | Plains |
| The Queen | Mistlands |
| Fader | Ashlands |
So the copper you carry out of the Black Forest stops being a nuisance once the Black Forest's boss is dead, and not before. Every boss matters, and each one eases exactly the hauling you have just finished proving you can survive.
Which biome an item belongs to is worked out, not listed
There is no table of items in this mod. Four routes, all reading the game's own data:
- The world's vegetation table places a copper deposit in the Black Forest, and the deposit says it drops copper ore. So copper ore is a Black Forest item.
- The spawn tables place Fulings in the Plains, and the Fuling's drop list says black metal scrap. So black metal is a Plains item.
- Recipes and stations. Anything made takes the biome of its latest ingredient, because that is when you could first make it. Barley is Plains, so flour is Plains, so dough is Plains, so bread is Plains, through a mill, a recipe and an oven in turn, none of it written down here. Every mead lands the same way, off the fermenter.
- Spawners. A greydwarf nest or a surtling geyser is placed in a biome, and it is the nest rather than the creature that the tables know about.
- Bosses place their own 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.
BiomeOverridesfor the roots none of that reaches: ore deposits, dungeon loot, fish and the trophies of creatures that only appear inside a location. Roots only: the recipe pass turns each one into everything made from it.
That lands 665 of 671 stackable items. The six it does not reach are crafting oddities, left unplaced rather than guessed at, because a wrong biome is worse than vanilla. Anything unplaced stays at vanilla.
An item found in several biomes belongs to the earliest, because that is where you first had to carry it home. A crafted one takes the latest of its ingredients. Those two rules sound contradictory and are not: found is about where it turns up, made is about when you can make it.
The groups are read off the game's own systems, not a list in this mod. Building material is whatever appears as a build cost on the Hammer's piece table, so an item a content mod adds lands in the right group by itself. Metal is whatever the game refuses to send through a portal, the same flag the pacing rule already used.
Every row is one line of ProgressionTiers, so a different table is one edit. Any global key
works, not just a boss key.
An earned metal tier lifts the portal rule. That is on purpose and it is the point: the
haul is real pacing while you are doing your first copper runs, and by the boss that hands you
the iron age you have already paid it. IncludeNonTeleportable remains for anyone who
disagrees and does not want to wait.
In multiplayer, it is the world's progress
Global keys are world state the server pushes to every client, so everyone computes the same answer with no new networking. A fresh character joining a Mistlands-era world gets Mistlands-era stacks, which is the deliberate trade: progress is the world's, not yours.
Keys only ever accumulate, so the multiplier only ever rises. Nothing here can leave a stack sitting above its own limit.
With Utangard
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. Those answers part company the moment somebody is offline for a kill.
When Utangard is installed, Yoke asks it instead of reading the key, so stacks never arrive
for a biome Utangard still has fenced off. It is a soft dependency in both directions: neither
mod needs the other, and DeferToUtangard = false turns it off.
What it will not do
It never makes equipment stackable. Only items with a vanilla stack size above 1 are touched. An item that does not stack in vanilla is a weapon, a tool or a piece of armour, and those carry per-item durability and quality, and collapsing several into a count silently throws all but one of those away.
Design notes
Why both ObjectDB entry points are patched, why every value is computed from the item's
captured original, why the biome routes stop where they do, and the release checklist:
DESIGN.md.
Core is optional
Yoke installs and runs on its own. Core is a soft dependency: present, it is used; absent, nothing here is degraded. Installing Yoke from Thunderstore no longer installs Core with it.
What Core adds is the version gate, a handshake that compares mod versions and build
ids on connect and refuses a client that does not match. Without it nothing reports two ends running different item data, which desyncs inventories. The ObjectDB.CopyOtherDB patch still puts a joining client on the server's numbers, which covers the common case on its own.
Solo, none of that applies and Core is not needed at all.
Config
BepInEx\config\ezomic.valheim.yoke.cfg
| Key | Default | What it does |
|---|---|---|
ScaleWithProgression |
true |
Each boss raises one group. Off falls back to StackMultiplier |
ProgressionBase |
1 |
Multiplier for a group no boss has unlocked; 1 is vanilla |
ProgressionTiers |
see above | boss:group:multiplier, comma separated |
ProgressionStep |
0 |
Later bosses re-raise earlier groups by this fraction, compounding |
ProgressionOrder |
the seven bosses | What "later" means; idle while ProgressionStep is 0 |
DeferToUtangard |
true |
Ask Utangard what the group has earned, when it is installed |
StackMultiplier |
2 |
Flat multiplier, used only when ScaleWithProgression is off |
StackCap |
200 |
Hard ceiling on the result |
WeightMultiplier |
1 |
Multiplies item weight; 1 leaves it alone |
IncludeNonTeleportable |
false |
Also affect ore, bars and anything portal-blocked |
IncludeTrophies |
true |
Also affect trophies |
ExcludeItems |
Comma-separated prefab names to skip entirely | |
WriteItemList |
true |
Write the item list described below beside the .cfg |
Verbose |
false |
Log every item that changed |
A value already written to the .cfg beats a new default in code. Change the .cfg.
The item list
BepInEx\config\ezomic.valheim.yoke.items.txt, rewritten on every run.
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 Stack Weight Left alone because
Wood Wood Material 50 -> 100 2
CopperOre Copper Ore Material 30 10 portal-blocked
SwordIron Iron Sword OneHanded 1 0.8 equipment
An arrow means Yoke changed that value. A single number means it did not, and the last
column says why. The header carries the settings that pass ran under and a count of each
reason, so equipment 677, portal-blocked 22 is the whole safety story at a glance.
This is also the answer to "why did this item not change", which is the only question a mod like this ever gets asked. ## Building
dotnet build
Deploys to the repo-local testprofile\. Override with -p:ProfileDir=..., or build it
into the shared play profile with valheim-own-profile\build-all.ps1.
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.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.