Longhouse

Longhouse 0.1.0

16 August 2026.

First assembly of the pack. Not published.

Members

Six mods. Devkit is deliberately absent, and so is every mod that is published on its own or has not been played.

Core the version gate the rest depend on
Yoke quality of life
Rist, Utangard progression and pressure
Vaettir, Dyrr the spirits, and the door policy

Held out, each for its own reason: Thralls, Tether, Stoker and Dovetail have never been played through; Surge, Fiends and Delve are published on their own; Nidling is a creature, and a published creature commits the suite to its prefab name forever; Saga writes per-player state and is at 0.1.0. Stow and Furrow are not separate mods any more - both ship inside Vaettir, so the pack gets them through that member.

Generated pins

  • Pins are built by tools/build-manifest.ps1 from each member's own manifest.json, so a pin cannot drift from the version that mod actually publishes.
  • A missing or malformed member is a loud failure rather than a shorter pack. A pack one mod short leaves every player failing Core's version gate for a reason none of them can see from inside the game.
  • That failure did its job and was then ignored: the list named wither after the mod became Utangard, so the generator refused to run and the manifest was hand-edited for two days instead. The pins here are generated again.

Known limits

  • Nothing in this pack has been published, so none of the pins resolve on Thunderstore yet. The pack is assembled ahead of the uploads rather than after them.
  • Several members are at 0.x and have never been run in a session. The pack pins what exists, not what is finished.

What moved · 6

Core joins at 1.0.0

1.0.0

Core is what the suite actually needs from it and nothing else.

Removed

  • The deed registry and the soft-reference asset loader are gone. Both were written for mods that are not in this release, and shipping the plumbing for something nobody can install is how a shared library turns into a junk drawer. They live on the deeds-and-softref branch and come back with the mods that use them, not before.

    discuss
  • The SoftReferenceableAssets reference goes with them, so Core now builds against assembly_valheim, assembly_utils, four Unity assemblies, BepInEx and Harmony.

    discuss

Changed

  • The README describes all three of the things this does. It described two, and the inventory height had never been written down anywhere a person would look.

    discuss
  • EnforceBuilds is in the config table. It has been in the config file since 0.2.0 and missing from the documentation for exactly as long.

    discuss

Dyrr joins at 1.0.0

1.0.0

First published release.

The number means published and nothing else. It sat at 0.9.0 while the repo was public and Thunderstore had nothing on it, because a 1.0 with no package behind it claims a release that does not exist, and because a Thunderstore version can never be reissued once uploaded - so the number had to be spent on the build that actually ships rather than on one that drifted away from it on disk.

Everything below this line was already true at 0.9.0. Nothing about the mod's behaviour changed to get here.

Renamed from Threshold, 2026-08-18

  • The config file. BepInEx names it after the plugin GUID, so a rename hands everyone a file of defaults. That is not merely lost preferences: Enforce defaults to off, so a server that had the door on would quietly have it off with nothing said. The plugin now copies ezomic.valheim.threshold.cfg to its new name on first run, before binding anything, and leaves the old file alone.

    discuss
  • The character bindings. threshold-home.txt is adopted the same way boon-home.txt already was, and the fallback is now an ordered chain rather than a single name, so a machine that skipped a release cannot fall between the two. Losing these would hand every character one free trip to another world, silently and exactly once, and that trip has no undo.

    discuss

Fixed since the split

  • The dedicated server no longer binds a character it does not have. A server has a PlayerProfile object with nobody behind it, so the binding ran there too and minted a fresh phantom id on every startup, one junk line per restart, forever. Binding now requires a local player, which is also the more correct moment: a character has not played anywhere until it spawns.

    discuss
  • Bindings are adopted from Rist's rist-home.txt on first run if dyrr-home.txt does not exist. Without that, moving the feature between mods would have silently unbound every character on the machine and handed everyone one free trip to another world.

    discuss

Verified against a real dedicated server

Both branches, which matters more than it sounds. It refuses a character that has been elsewhere, with the reason on the client's own screen and in its own log, and it admits a clean character on an enforcing server. Until the second one happened, "works" and "refuses everybody" were indistinguishable, because every test until then used a character that had genuinely travelled.

Also confirmed: the menu guard's binding, the adoption of bindings from Rist's old rist-home.txt, and restoring a character backup as the documented recovery. A refused character came back from backup and was admitted.

Every server must enforce

Found by running two servers, one enforcing and one not. The menu guard covers local worlds only; the door covers servers only where Enforce is on. A non-enforcing server is therefore a hole a bound character walks into, and all the mod can do afterwards is log "too late to stop it - that world is now written into the character". The lenient server is the one that ruins the character.

Enforce on every server, and keep a separate character for each.

Known limits

  • RefuseCheats is untested; it needs a character deliberately flagged by devcommands.

    discuss

Rist joins at 1.0.1

1.0.1

Documentation and the text players read, with no change to what the mod does.

Threshold is Dyrr

The companion mod that decides who may join a world was renamed, and Rist pointed at the old name in two places that matter: the config descriptions, which are read by anyone who opens rist.cfg, and the notes on what Rist deliberately does not do. Both now say Dyrr.

The README is shorter

The design argument and the technical notes moved to DESIGN.md, leaving the README as what someone reads before installing. The reasoning is all still there, one link away, rather than in front of a reader who only wanted to know what the mod is.

Its two links are absolute now. Thunderstore builds the package page from the README alone, so a sibling-folder path pointed at nothing there and DESIGN.md is not in the zip at all - both would have rendered as dead links on the store page and nowhere else, which is the kind of fault you only see after publishing.

Em-dashes are gone from the docs throughout.

Utangard joins at 1.1.0

1.1.0

An API for other mods to ask what the group has earned

UtangardApi.GroupHasKey(bossKey) answers the one question this mod knows and nothing else does: whether the group has earned a boss, rather than whether the world has merely seen it die. Those two answers part company the moment somebody is offline for a kill.

It exists because Hoard scales stack sizes by world progression. Reading the raw defeated_ key there would hand out Plains-era stacks for a biome still fenced off here, which is two mods disagreeing out loud about the same word in a way that reads as a bug in whichever one the player happens to be looking at.

A facade rather than making Progression public: the roster, the latch and the deadline are nobody else's business. Read-only by construction, so a consumer cannot open a biome by asking about it.

The README is half the length

The source-code archaeology moved to DESIGN.md - why Character.OnDeath credits one player rather than all of them, what the global keys are called and why, and the handful of things that were nearly bugs. None of it is needed to play, and it was sitting between a new reader and the part that says what the mod does.

Nothing about the gameplay changed in this release.

Vaettir joins at 1.0.0

1.0.0

First release. The number sat at 1.0 once before, early, and was taken back down when whole mods arrived on top of it without it moving. This is the version that earns it: one chain, finished, with everything that was not finished cut out and held on its own branch.

The chain, played end to end in a real world: an ancient seed planted, fed on greydwarf deaths through its growth, opened into a forest spirit, communed with, and the heartwood carried away and built into a stowing post that sorts the chests around it.

The sapling

  • Plant an ancient seed in the Black Forest. It does not grow on time, it grows on death, and only on the deaths of greydwarfs, and only within sight of it. About thirty of them and it opens, which is one raid if the forest comes to you.

    discuss
  • Greydwarfs specifically, not "forest creatures". An early version used the game's own forest faction and swept up trolls, boars and the Elder, which turned clearing out a nest into killing anything anywhere near here. Greylings are on the list at zero, so it is visible that they were considered and refused.

    discuss
  • It can be destroyed, because being asked to fight for an hour beside something you cannot lose is not defending it. Around ten hits from a brute: a fight happening nearby is survivable, a mob left to work on it is not. It says when something is chewing on it and when it is gone, because losing an hour in silence is a mystery rather than a difficulty.

    discuss
  • One hand-built model, with its own icon so the cultivator stops offering a carrot. Built to the game's own measurements rather than to taste, because smoothness is most of what reads as modded and nothing else in the game at that size is round.

    discuss
  • The sapling does not change shape as it fills, and the hover text is what tells you how far along it is. Four staged models exist and work, and three of them were not good enough to ship, so the staging is held for 1.1 rather than released and apologised for.

    discuss

The spirit and the heartwood

  • The sapling opens into a forest spirit. Light with no body, bobbing and pulsing, and waking as you approach. Two rings of beads turn around it in step with each other, with no visible hoop, so it reads as one thing turning rather than as a swarm.

    discuss
  • Press use once and it folds itself into a piece of heartwood you carry away. It is a home rather than a heart: the spirit does not die and hand over a piece of itself.

    discuss
  • Build the heartwood somewhere and you have housed it.

    discuss

The stowing post

  • One mod, not two shipped together. Stow arrived carrying its own [BepInPlugin], and leaving it there meant one DLL announcing two plugins in the log, writing two config files, registering with Core's version gate twice, and reporting two different version numbers. It reads as two mods in a trenchcoat, and it was one. The post's half is now driven by Vaettir's own plugin class: one GUID, one config file, one Harmony instance, one registration.

    discuss
  • Nothing you have built is affected. The piece keeps its internal name, so posts already standing survive.

    discuss
  • Its settings moved into ezomic.valheim.vaettir.cfg, under [Post], [Sorting], [Carrier] and [Keys]. Anyone who had tuned ezomic.valheim.stow.cfg copies those values across once; nothing reads that file any more.

    discuss
  • Delete BepInEx/plugins/Stow if you are upgrading by hand. Two copies loaded at once is the one thing that will go wrong.

    discuss
  • One spirit, not two. Each mod used to build its own from its own script and they had drifted into visibly different creatures. There is one now, and the carrier is that one at 0.62 scale so it is the size it has always been on screen. Set the scale to 1 for a full-size spirit.

    discuss
  • One setting still drops the heartwood from the recipe and puts the post back to wood and nails, for anyone who wants the sorting without the ritual.

    discuss
  • A spirit carries ten items a trip, so a stack of fifty wood leaves the post in five trips rather than crossing the room in one. A big load looks like a big load. ItemsPerTrip sets it and 0 restores the whole stack. This is the number the post upgrades are meant to raise.

    discuss
  • The carrying spirit and the one you commune with are the same creature, which took three passes to actually mean. The merge gave them one mesh; they still resolved their material through two different lookups against two different donor lists, and even once that was fixed only one of them glowed. The glow is a Light and an emission write, and the carrier had half of one, so the room around it lit up while its own mesh stayed flat. Colour, range, pulse depth and pulse period were each a second value too.

    discuss
  • The last of the seams from when these were two repos are gone. Icons and PropIndex each existed in two diverged copies, one per old namespace, and the comment justifying that said a copy was better than reaching into a sibling repo. There is no sibling repo.

    discuss

Requires

Longhouse Core is optional. Without it nothing refuses a client that lacks this mod, and that matters: the sapling, the spirit, the heartwood and the post are registered pieces, and a client that cannot resolve one throws the object away rather than erroring. A server without Vaettir silently destroys everything already standing. Solo, none of that applies.

Known gaps

  • Dedicated servers are untested. Everything here has been exercised in single-player. Each spirit, sapling and post is driven by whoever owns it, so co-op should be fine, and should is doing real work in that sentence.

    discuss
  • The spirit's parting has no effect on it. The setting names a vanilla particle to play where it stood and ships blank, because a wrong name costs the moment its flourish rather than breaking anything. It is a flourish that is missing, not a step that fails.

    discuss
  • The sapling stirs while it grows, and that motion is new enough that it has had far less play than the rest of the chain.

    discuss

Held for later releases

  • 1.2 - sowing a rank of seeds by Farming skill, and the sapling's staged growth. The staging works and has been played; three of its four models were not good enough. It sits directly behind 1.1 rather than ahead of it because the staged models are the visible half of the same piece, and it is worth knowing how a sapling plays once it is worth standing next to before choosing how it should look while you do.

    discuss
  • 1.3, a refinement pass - better animation throughout, and the post's own panel: fetch, tidy and presence. All three were built and none of them were proven, and with the three of them out the panel had nothing left in it, so it goes whole.

    discuss
  • 1.4 - bonemeal, and the bone mill that grinds it.

    discuss
  • 1.5 - upgrades for the stowing post. It starts out carrying ten items a trip and each upgrade raises that, so a post becomes something you improve rather than something you finish. It also gives the heartwood somewhere to go after the post is built.

    discuss
  • 1.6 - an upgrade that houses a second spirit, so two stacks are in the air at once rather than one moving faster. Two of them working is worth watching; one of them hurrying is a number.

    discuss
  • Unscheduled - the vaettr visitor and the market they were to stand in.

    discuss

Late fixes

  • A dropped heartwood no longer falls through the floor. Stripping the donor's mesh took the collider with it, because on that donor both live on the same object, and an item with weight and nothing to rest on simply keeps going. Found by throwing one away.

    discuss
  • The spirit's parting effect setting was renamed before release rather than after, when it would have stranded the old key in other people's configs.

    discuss

Archived history

Stow and Furrow were separate repos before this. Their history is in archive/, one git bundle each, clonable with git clone archive/stow.bundle. See archive/README.md.

Yoke joins at 1.0.0

1.0.0

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.

Discussion

Nothing said yet.

Sign in or make an account to join in.

← 1.0.2