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.
ModerWarehouse
Server-only Valheim warehouse with multilingual sorting, REQ target stock, typo suggestions, validated multi-warehouse lookup, automatic labels, and interactive stock and statistics boards.
| Date uploaded | 2 weeks ago |
| Version | 2.0.0 |
| Download link | CrisHaani-ModerWarehouse-2.0.0.zip |
| Downloads | 93 |
| Dependency string | CrisHaani-ModerWarehouse-2.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.2333ArgusMagnus-ServersideQoL
Serverside-only QoL mod, compatible with vanilla/console (e.g. XBox, PS, Switch) clients. Stack player inventories into chests, generated portal hub, auto-sort chests, refuel smelters from containers, infinite building/farming stamina and much more
Preferred version: 2.0.10ValheimModding-YamlDotNet
Shared version 16.3.0 of YamlDotNet from Antoine Aubry and contributors, net47 package for use in Valheim mods. Maintained by the ValheimModding team.
Preferred version: 16.3.1README
Moder Warehouse 2.0.0 — Final Feature Release
Moder Warehouse is a free, unofficial, server-only warehouse automation mod for Valheim. Players connect with unchanged vanilla clients. The server sorts an input chest, fulfils withdrawal requests, tracks target stock and displays totals on an interactive rotating 4×4 board.
Author: Cris Haani
License: MIT
Release: 2.0.0. Future updates are expected to focus on bug fixes and compatibility.
Moder Warehouse is not affiliated with or endorsed by Iron Gate Studio or Coffee Stain Publishing. Use it at your own risk and back up the world before installing or updating it.


One possible expansion stage. The pictured chests are examples: Moder Warehouse works with every suitable vanilla storage container, not only the chest type shown here.
A personal note from the author
Dear players and server administrators,
I would like to give you a small glimpse into my world. We are a close-knit Valheim group that has been playing together since the early days, and – like some of you – we run a public server of our own.
Whenever we returned from another long expedition, it took quite a while to sort and empty our inventories. Or we simply dropped everything nearby, which eventually left us with impressive piles of loose materials. We needed a solution – and that is how Moder Warehouse came into being.
I decided to create my first Valheim mod. Days passed, new ideas appeared, and one problem after another was solved. After the warehouse had been running for a few days, my younger crew – who study mathematics – approached me and demanded a statistics board. Later, caretaker Krause joined us. He keeps the warehouse tidy and rejects items that have no business being there.
This entire mod is a hobby for me: a chance to create something useful and, at the same time, a little playful. The joy of playing should take centre stage again – not endless depositing and withdrawing, or spending hours running through storage rooms in search of one particular item. Those chores had gradually started to diminish our enjoyment of the game.
Once the first version was running reasonably well, I thought: surely we are not the only people with this problem. So I decided to prepare a public package and make it available to all of you.
I deliberately chose the MIT licence. Anyone who feels inspired should be free to continue working on the mod, improve it and contribute new ideas. I hope it gives you more time for adventures, more enjoyment, and a little more order across your world.
Best wishes,
Cris Haani
P.S.: You may wonder why there is no direct way to contact me. That is a deliberate choice. I would rather work quietly and discreetly in the background than take part in large discussions. I am not chasing clicks or likes, and I probably never will. But if you enjoy the mod, you are still very welcome to leave a thumbs-up here—that little bit of feedback is more than enough for me. With that said: stay healthy and remember to enjoy life!
Requirements
Install on the dedicated server only:
- BepInExPack for Valheim 5
- ServersideQoL 2.0.10 or a confirmed compatible later version
- YamlDotNet 16.3.1
- Moder Warehouse
BepInEx, ServersideQoL and YamlDotNet are separate dependencies and are not included. YamlDotNet is used for optional JSON translation files; the built-in German and English languages remain available without custom translations. Players joining the server do not need Moder Warehouse or YamlDotNet on their client.
Installation
- Stop the server and create a tested world backup.
- Install BepInEx, ServersideQoL and YamlDotNet. Thunderstore managers install these
declared dependencies automatically; for manual server installation, place
YamlDotNet.dllinBepInEx/plugins. - Copy
ModerWarehouse.dlltoBepInEx/plugins/ModerWarehouse/ModerWarehouse.dll. - Start the server.
- Confirm
Loading [Moder Warehouse 2.0.0]and the initialization message in the BepInEx log.
Quick start
Choose a warehouse id such as main. Place ordinary signs no more than three metres
from their intended chests:
| Sign text | Purpose |
|---|---|
[WH:main:IN] |
input chest, warehouse centre and optional language selector |
[WH:main:OUT] |
output chest |
[WH:main:REQ] |
request and target-stock sign |
[WH:main:INFO] |
live container-capacity sign |
[WH:main:BOARD] |
bottom-left anchor of the automatic 4×4 board |
[WH:main:STATS] |
bottom-left anchor of the automatic 4×4 statistics board |
[WH:IGNORE] |
exclude the nearest container |
[WH:DELETE] |
remove a generated warehouse sign |
[WH:CLEAN] |
clean overlapping generated signs at one position |
Only suitable containers within the input radius that have an associated storage sign
are managed. A normal item label or an explicit blank ... sign opts a chest in. A
chest without a sign is completely ignored: it is not scanned, changed, or included in
stock displays. [WH:IGNORE] explicitly excludes a chest. Private, open, in-use, cart
and unsuitable auto-destroy containers are not used. Items stay safely in the input
chest when no destination has capacity.
Internal and cheat-object safety filter
Moder Warehouse sorts only genuine player-handled items. Internal attack prefabs, boss abilities, developer weapons and cheated items are ignored in the player-facing IN chest and remain there for the player to remove. The mod never deletes or rewrites rejected IN contents. Valid items in the same IN chest continue to be sorted.
If the scanner finds a forbidden object in managed storage, it removes only that object; genuine items in the same chest remain untouched. An automatically labelled chest that becomes empty is released for normal use again.
If a genuine item is manually placed in the wrong labelled storage chest, housekeeping moves it to a matching labelled, homogeneous or free chest. It is never deleted. Every correction records item, amount, source and target in the server log. Open or currently used chests remain untouched until a later scan.
[WH:IGNORE] is the explicit quarantine mechanism. Excluded chests are neither
scanned nor cleaned.
Valheim stores the persistent m_cheated marker on each individual item. When it is
set, even an otherwise ordinary item such as wood or stone is denied sorting. Every
scan checks this marker in addition to blocking internal and dedicated cheat prefabs.
Languages
English and German are maintained built-in languages. Set the server-wide default in
ch.cris.valheim.moderwarehouse.cfg:
[Localization]
Language = English
Use English, German, en or de. A warehouse can override the server default by
adding a second line to its IN sign:
[WH:main:IN]
LANG=DE
Changing LANG= updates the board, help, capacity, request, delivery and automatic
chest-label text on the next scans. Physical signs are shared world objects, so one
warehouse shows one language to every player. Manually written signs are deliberately
never translated or rewritten.
Additional interface languages can be installed as JSON data files. See
docs/TRANSLATING.md. Missing entries fall back to English.
English and German item names are accepted for searches regardless of display language.
Input and automatic labels
Put unsorted items into the IN chest. Existing matching stacks are filled before empty slots are used.
To enroll a destination, attach either a normal item label or a blank vanilla sign
whose complete text is .... An unsigned chest remains private to the player and is
invisible to the warehouse. Once an enrolled chest contains only one item type, Moder
Warehouse recognises it as a destination for matching items. If AutoCreateLabels is
enabled, it gets a persistent white label after AutoLabelDelay (90 seconds by
default); an existing ... sign is reused.
For exact sign placement, attach and orient an ordinary vanilla sign yourself and set
its complete text to .... Moder Warehouse reuses that sign instead of creating one.
Ordinary storage labels and ... adoption signs must be within LabelDistance of the
chest (one metre by default). The separate three-metre MarkerDistance applies to
functional signs such as IN, OUT and REQ and is deliberately not used for dense racks.
Automatically created labels are placed on the decorated oval front of vanilla chests;
older server-generated back-side labels are migrated automatically. Player-built signs
are never moved.
The first automatic assignment records the underlying Valheim item token. From then on,
the label follows LANG=/Language, even while the chest is empty. Do not use ... on
a sign that should remain manually controlled.
Existing non-empty manual labels still reserve and route their nearest chest, but their
text is never translated. Older automatic signs are migrated only when the mod can
identify them safely; if an old label does not switch language, clear its text to ...
once and let Moder Warehouse adopt it.
Requests
Initialize a request sign once with [WH:main:REQ]. Its warehouse association is
stored persistently, after which the sign accepts requests such as:
Wood 100
Stone 10, Wood 20, Resin 5
German names, English names and internal prefab names are supported. Each comma- separated request receives its own result. Available items are delivered even if another requested item is missing. Results remain visible for at most 8 seconds. The REQ sign then returns to unmet target stock or to the neutral REQ prompt when all targets are met. Keep the OUT chest closed while the server performs a request; a saved target-stock list never overwrites a fresh command.
Target stock
Store a persistent shopping list on the initialized REQ sign:
SOLL Wood 1000, Stone 500, Resin 100
Red means missing or critically low, orange means below target and green means the target has been met. Normal withdrawal requests remain available at any time.
INFO sign
[WH:main:INFO] shows free enrolled chests with a blank ... sign, empty
reserved/labeled chests and occupied chests versus total managed capacity. The
warehouse association persists after the first successful initialization.
Interactive 4×4 stock board
Place [WH:main:BOARD] as the bottom-left cell and leave space to its right and
above. The server creates fifteen additional vanilla signs. The sign's written face
defines the board front; the board grows right and upward.
The top row shows warehouse, filter, page and container occupancy. Twelve alphabetical item totals are shown below it. Pages rotate every three seconds by default. With multiple valid warehouses, an additional cached network overview page is available.
- Edit BESTAND with a prefix such as
Gto filter and freeze the list. - Edit SEITE with a page number to hold that page.
- Use both controls together when required.
- Enter
AUTOor clear the control to resume rotation immediately. - Automatic rotation resumes after 60 seconds without another filter change.
The board wakes while a player is within five metres. Otherwise it displays a large
sleep message and stops rotating. On waking it briefly shows stock changes since the
last visit. After input sorting it shows an EINGELAGERT delivery confirmation.
Container occupancy is green below 80 percent, orange from 80 percent, and red with an expansion warning from 95 percent.
4×4 statistics board
Place one vanilla sign as the bottom-left anchor and write:
[WH:main:STATS]
The server creates fifteen signs to the right and above. Four local pages rotate automatically: today, a direct 7/30/90-day comparison, trends/forecast, and dated records. Metrics include deposits, withdrawals, balance, daily average, top items, current total, item types, current and average chest usage, peak/low stock, strongest trends, the item expected to run out first, and the input/output ratio.
Movement history is stored as compact daily aggregates on the anchor sign. Windows roll every day instead of resetting at the start of a month. Data older than 90 days is automatically removed, so storage cannot grow forever. Player identities are not recorded. Forecasts are simple flow projections, not guarantees. The statistics board uses the same wake distance and sleep behaviour as the stock board.
Two cells are interactive: edit PERIOD to any whole number from 1 to 90, and
edit PAGE to 1, 2, 3 or 4. The server restores its rendered text after
reading the command. A separate control sign is created below the board and accepts
combined commands such as 27 TREND, 30 3, TODAY OVERVIEW or AUTO. German
commands such as 27 TREND, HEUTE UEBERSICHT and VERGLEICH are accepted too.
Manual selection returns to normal page rotation after 60 seconds without another
input. Forecasts remain marked as insufficient until a useful data basis exists.
Multi-warehouse network
Reduce an individual warehouse radius directly on its IN sign:
[WH:main:IN] R=60
The configured server radius remains the upper limit. IN chests require at least 210 metres separation by default. The automatic help sign reports radius and zone validity. Conflicting zones and duplicate ids are locked until corrected.
REQ always searches and withdraws locally first. Only after a complete local miss does it read other valid warehouses and report their id and available amount. This world lookup is informational only: it never claims a remote chest and never moves, reserves or teleports an item.
Warehouse IDs are globally unique (case-insensitive). A new IN sign is rejected with a localized reason if its ID is already in use, its input chest is missing, or it is less than the configured minimum distance (210 m by default) from another valid IN. Existing valid warehouses are protected from a conflicting new marker. Renaming an IN ID migrates its linked REQ, INFO, help, BOARD and STATS signs, generated board cells, and associated runtime/statistics state when the links are unambiguous.
REQ searches the local warehouse first. On a local miss, its read-only world lookup
can inspect persistent remote inventory data without a player standing at that
warehouse. Results distinguish LIVE, timestamped last-known (AS OF), and
UNKNOWN data; an incomplete or failed read is never presented as live. Remote
results are informational only: they do not reserve, claim, or transfer items.
Fuzzy suggestions are limited to plausible item-name typos, show the matched item in
green on the large stock board, and page through longer lists before returning to
normal stock display. Leaving the board area resets the search display.
From the second valid warehouse onward, stock and statistics boards automatically gain a cached network overview page. It is informational, not a cross-warehouse transfer system. Warehouse inventory and movement statistics remain separate.
Expanding and running multiple warehouses
Build more suitable chests with a storage sign within the configured radius; unsigned
chests are not enrolled. Capacity updates on the next scan. Use another id for an
independent site, for example [WH:harbour:IN] and [WH:harbour:OUT].
Tested limits and performance
The 1,081-chest stress run was performed for the 1.2.1 release. It is historical validation, not a new 2.0.0 stress-test result. The 2.0.0 multi-warehouse and rename changes have separate targeted laboratory checks. Larger warehouses are not claimed as supported by a new 2.0.0 stress run.
MaxMovesPerCycle = 250 is not a chest limit. It limits stack transfers in one
processing cycle so a large delivery cannot monopolise the server; remaining work is
continued in later cycles. Chests are scanned every three seconds by default and after
relevant changes. Very large warehouses need time after arrival for Valheim to load
the surrounding zones and for ServersideQoL to register every chest. In the 1,081-
chest stress test this took roughly 10 to 15 seconds. This is an observation, not a
guarantee; hardware, network and world state affect it.
Validation performed for 1.2.0
- construction and registration of 1,081 chests inside one 100-metre warehouse
- a complete one-item-per-chest run followed by a physical audit of every chest for empty, mixed or multiple-slot destinations
- historical 1.2.0 assignment/routing checks; since 2.0.0 each storage chest must be
explicitly enrolled by an item label or a blank
...sign - German/English displays, search names and mod-managed automatic labels
- ambiguous names such as
Stein/Bernstein,Holz/Edelholz, and identical English display names backed by different internal items - statistics board, period controls, sleep/wake and rolling 90-day retention
- open-container protection and processing after the container is closed
- legitimate IN sorting, passive retention of cheated IN items, managed-storage
cleanup and unchanged cheat quarantine through
[WH:IGNORE] - server restart, persistent labels and restoration from a verified world backup
The stress test intentionally used a private laboratory helper. That helper and its test objects are not included in the public package. The number 1,081 describes tested chests, not 1,081 officially playable Valheim items.
Configuration defaults
| Setting | Default | Meaning |
|---|---|---|
Enabled |
true |
enable warehouse processing |
Language |
English |
default interface and automatic-label language |
Radius |
100 |
storage radius around the IN chest |
MarkerDistance |
3 |
maximum sign-to-chest distance |
LabelDistance |
1 |
maximum storage-label or ... sign distance |
ScanInterval |
3 |
seconds between scans |
MaxMovesPerCycle |
250 |
safety limit for stack movements |
AutoCreateLabels |
true |
create automatic chest labels |
AutoLabelDelay |
90 |
seconds before automatic labeling |
ResultDisplaySeconds |
8 |
maximum request-result display time |
BoardPageSeconds |
3 |
stock-board page duration |
BoardWakeDistance |
5 |
stock-board wake distance |
DeliveryNoticeSeconds |
6 |
delivery-message duration |
VisitSummarySeconds |
12 |
visit-difference duration |
CapacityWarningPercent |
80 |
orange capacity threshold |
CapacityCriticalPercent |
95 |
red capacity threshold |
Test configuration changes on a world copy. Very short scan intervals and very large radii may increase server load.
Troubleshooting
- Plugin does not load: verify BepInEx and ServersideQoL, remove duplicate DLLs,
and check the log for
Loading [Moder Warehouse 2.0.0]. - IN or OUT is not detected: verify exact spelling, matching warehouse id and a sign-to-chest distance below three metres.
- Items remain in IN: check capacity, matching stacks, private/open containers and
nearby
[WH:IGNORE]signs. - Request fails: use
Item amount, separate entries with commas, and keep enough free space in OUT. - Automatic label stays in the old language: only mod-managed labels are rewritten.
Manual signs stay untouched. Replace an old automatic label's text with
...once to let the mod adopt it safely. - Board grows incorrectly: the anchor is the bottom-left cell; clear the space to
the right and above, remove it with
[WH:DELETE]or[WH:CLEAN], then rebuild once.
Updating, rollback and removal
Stop the server and back up both the world and old DLL before every update. After an update, verify the log and test one small deposit and withdrawal. For rollback, restore the matching world backup and previous DLL together.
Before removal, optionally delete generated boards and signs with [WH:DELETE].
Then stop the server, back up the world and remove ModerWarehouse.dll. Chests and
their contents are vanilla world objects; generated signs may remain as ordinary signs.
Privacy, support and license
Moder Warehouse contains no telemetry, analytics, advertising or intentional external network communication. Remove passwords, IP addresses and platform identifiers before sharing logs.
Reports should include the Valheim, BepInEx, ServersideQoL and Moder Warehouse versions, server operating system, reproduction steps and a privacy-cleaned log excerpt.
The source code is available under the MIT License. Use, modification and redistribution are allowed while retaining the copyright and license notice. The software is supplied without warranty and is used entirely at your own risk.
CHANGELOG
Changelog
2.0.0 - 2026-09-26
Final feature release. Future updates are expected to focus on bug fixes and game or dependency compatibility.
- Added globally unique warehouse identities, minimum-distance validation and clear, localized rejection reasons while protecting already registered warehouses.
- Duplicate IN validation now persists the accepted marker identity and leaves the IN marker text untouched; rejection details are shown on its linked help sign instead.
- Added linked-group rename migration for REQ, INFO, help, BOARD and STATS signs, generated board cells, runtime state and warehouse statistics.
- Added read-only world inventory lookup for REQ suggestions, including explicit live, timestamped last-known and unknown freshness states; remote items are never moved.
- Added typo-tolerant item suggestions on the large stock board, with highlighted item names, paging and automatic return to the normal board.
- REQ results now return within at most eight seconds to unmet target stock or the localized neutral prompt when all targets are met.
- Made stock/statistics sleep colours follow translated word length in every loaded language; restored the default three-second board rotation and retained the responsive warehouse scheduler.
- Warehouse network pages are informational summaries; inventory and movement history remain separated by warehouse.
- Enforced explicit storage-sign opt-in throughout local sorting, storage displays and
persisted world-stock reads: ordinary chests without a label or blank
...sign are ignored. Remote warehouse requests remain read-only and never transfer items. - Reduced synchronous global REQ lookup work with spatial sign-to-container matching and by decoding only signed storage inventories inside valid warehouse radii; remote stock remains informational and is never transferred.
- Declared YamlDotNet 16.3.1 directly for optional JSON translation files; the shared library remains a separate dependency and is not bundled in the Warehouse package.
All notable public changes to Moder Warehouse are documented here. Private laboratory iteration notes are maintained separately and are not public release entries.
1.2.1 - 2026-09-20
- Changed IN safety filtering to be non-destructive: internal, cheated and otherwise invalid items remain in the player-facing IN chest and are ignored by sorting.
- Kept automatic cleanup for forbidden items found in managed storage containers.
- Prevented rejected custom or unknown prefabs from poisoning later legitimate IN transfers through stale live-container state.
- Added a separate one-metre storage-label association radius while retaining the three-metre functional-marker radius for IN, OUT and control signs.
- A blank
...sign directly at a chest now supersedes an obsolete hidden label that the mod previously generated for the same chest. - Fixed automatic labels being placed behind vanilla chests. New labels use the decorated oval side, and previously generated back-side labels migrate once.
- Added housekeeping for genuine items manually placed in the wrong labelled storage chest. They are safely refiled and every move logs item, amount, source and target.
- Stock and statistics boards now wake when a player approaches any of their 16 signs, rather than measuring only from the bottom-left anchor.
1.2.0 - 2026-09-20
- Added an optional automatic 4x4 statistics board using
[WH:<id>:STATS]. - Added rolling daily movement history with automatic pruning after 90 days and no player identity tracking.
- Added four statistics pages for period totals, comparisons, trends/forecast and dated records.
- Added interactive period and page controls, including freely selectable periods from 1 to 90 days and automatic return to rotation after 60 seconds.
- Added a combined control sign below the board for commands such as
27 TREND,30 3,HEUTE UEBERSICHTandAUTO. - Added safe migration of the earlier 3x3 statistics prototype to the final 4x4 layout while preserving recorded history.
- Added clear insufficient-data reporting for projections instead of presenting immature forecasts as reliable results.
- Fixed item routing collisions caused by one label being contained in another name,
such as German
SteinmatchingBernsteinorHolzmatchingEdelholz. - Automatic labels now route by their persisted internal item id. Ambiguous manual
translations such as German
Harzrequire a matching sample item in the chest, preventing the server from guessing between distinct item types. - Fixed the stock board and visit-difference snapshot failing when two distinct item
tokens share the same localized display name, such as two English
Clubentries. - Added a safety filter for Valheim's persistent per-item
m_cheatedmarker. Cheated items are rejected at IN with a visible red board message and removed from managed storage without touching legitimate items in the same chest. - Added protection against internal attack, boss-ability, developer and cheat prefabs that technically expose ItemDrop data but are not real player inventory items.
- Added
[WH:IGNORE]as an explicit quarantine escape hatch: ignored containers are never scanned or cleaned by the safety filter. - Fixed persistent automatic labels becoming associated with a merely nearby chest while their originally linked chest was temporarily unloaded.
- Validated blank automatic assignment and routing against a 1,081-prefab laboratory run, followed by a physical per-container inventory audit.
1.1.0 - 2026-09-18
- Added maintained English and German interface localization.
- Added global
Languageconfiguration and per-warehouseLANG=overrides. - Added external JSON translation files with English fallback and a generated template.
- Added English and German item-name lookup for deposits, requests and target stock.
- Automatic chest labels now follow the selected warehouse language while manually written signs remain untouched.
- Existing linked automatic labels are migrated safely when their origin can be identified.
- Fixed target-stock shopping lists overwriting newly entered withdrawal requests and their result messages.
- Preserved server-side request transfers and automatic labels across restarts.
1.0.0 - 2026-09-18
- First public release candidate.
- Server-only sorting from one input chest into nearby storage containers.
- Safe multi-player input ownership and open-container protection.
- Output requests by German, English or internal item name.
- Persistent multi-item target stock lists with coloured status.
- Interactive rotating 4x4 stock board with filters, pages and sleep mode.
- Delivery confirmation and changes-since-last-visit display.
- Capacity warnings and live warehouse information signs.
- Persistent automatic labels for homogeneous storage chests.
- Administrative markers for ignoring containers and removing generated signs.