About Dyrr
From ThunderstoreA door policy: characters that have played elsewhere do not come in. Off until an admin turns it on.
Dyrr
Dyrr is a join policy for Valheim servers. A character that has played on other worlds, that has used cheats, or that arrives with mods the server does not permit can be refused when it connects. Nothing is refused until an admin turns Enforce on.
It also kicks idle players on dedicated servers, reports when a character comes back carrying something it did not leave with, and stops your own client from taking a character into a world it does not belong to.
Features
- Six checks at the join: the character has spawned in another world, the game has flagged it
for cheats, it has run a console command the game classes as a cheat, its own records disagree with each other, the client is running mods the server does not permit, or it did not answer at all. Each can be switched off on its own.
Enforceis off by default. Every connection is still judged and the verdict is written to
the log, so you can see who would be turned away before anyone actually is.
- A refused player is told which rule they broke, on their own screen if they have Longhouse
Core, and in their own log either way.
- Character protection on the client: a character is bound to the first world it plays in, and
the game refuses to start it anywhere else. This works whether or not the server runs Dyrr.
- Idle kick on dedicated servers, with a chat warning first.
- Inventory watch: a log line when a character's inventory changed while it was offline. This
only ever reports. It never refuses or kicks.
- A
dyrrconsole command that prints the standing verdict for everyone currently connected.
How the join check works
Both ends register an RPC as soon as the connection object exists, before either side sends PeerInfo. The client sends what it knows about its own character: the character name, the cheats flag and its counter, the name of every console command the character has ever run, the UIDs of every world it has spawned in, and the BepInEx plugin GUIDs loaded on that machine. The server does the arithmetic in a prefix on ZNet.RPC_PeerInfo and refuses before the player spawns, so a refused player never watches the world load first. All of it comes out of PlayerProfile, which lives on the client's disk, so all of it is self-reported. See Known limits.
Which console commands count as cheats is decided on the server, from the server's own Terminal command table, so a cheat command added by some other mod on the server counts for free. A dedicated server has no guarantee of having built that table when the first player knocks, so there is a fallback list of the 73 vanilla commands registered with isCheat: true.
The mod check is the one that reaches cheating on a dedicated server. Console.IsCheatsEnabled() returns ZNet.instance.IsServer(), so a client's own devcommands does nothing on someone else's server. Anyone cheating there is running a mod that patched around that line, which makes "what is this client running" the more useful question.
The tamper check does not need the client to be honest, only consistent. The game writes the same facts in more than one place: m_usedCheats is a bool, PlayerStatType.Cheats is a counter incremented on the next line, and m_knownWorlds records worlds by name at save time where m_worldData records them by UID at spawn. A flag that is clear beside a counter above zero, or more world names than world UIDs, is an edited save. Neither inequality can be produced by playing the game.
Character protection
Refusing a character at the join arrives too late to help it. Loading a character into any world writes that world into PlayerProfile.m_worldData permanently, and nothing in the game ever removes the entry. So the client half refuses the trip instead.
Each character is bound to the first world it is seen in, recorded in BepInEx/config/dyrr-home.txt. After that:
- Starting a local world with a character bound elsewhere is refused at
FejdStartup.OnWorldStart, with a popup naming both worlds and the file to edit.
- Joining a server whose world is not the character's home is dropped inside
RPC_PeerInfo, before the character spawns and before the game writes anything. This works whatever the server does, and whether or not the server runs Dyrr at all. That is ProtectOnServers.
Neither asks for confirmation. The damage has no undo, so a confirm dialog would just be a button for doing the unfixable thing.
The character select screen carries the answer under the character's name, in a clone of vanilla's own "Cloud save" label: Belongs to <world>, Not bound to a world yet, Has played in <world> and <world> for a character that already has more than one, or Belongs to a world that is not on this PC when the world is a server's. The line follows ProtectCharacter and disappears with it.
A character with exactly one world in its own save is bound on the spot even if Dyrr has never watched it play. A character with more than one is left unbound, since there is no single home left to defend, and those are exactly the characters an enforcing server turns away.
Idle kick
On dedicated servers only. A player whose character has not moved 5cm or turned one degree for IdleMinutes is kicked, after a chat warning IdleWarnMinutes ahead. Position and facing are read off the character's ZDO every five seconds. Walking, fighting, turning the camera or sorting a chest all reset the clock.
The kick itself is vanilla's own InternalKick, the same path the console command takes, so the player gets the ordinary kicked screen with a reason attached. A locally hosted world is never watched.
Highlights
From source dataLoaders
Runs on BepInEx.
Footprint
Rated a light load on a server.
Last update
Its author last shipped an update 44d ago.
Dyrr on Nxeon
From our catalogue- One-click install
- Supported on Nxeon Valheim servers, for BepInEx servers. We download it from Thunderstore, place it, and restart the server.
- Server type needed
- BepInEx
- Server load
- light
- Smallest plan we suggest
- Valheim — 4 GB (4 GB RAM). This follows our own load rating above, not a benchmark.
- Latest build
- 1.4.2, released 2026-09-21
Game versions by loader
| Loader | Game versions | Newest |
|---|---|---|
| BepInEx |
From 8 recorded builds of Dyrr.
Recent builds
| Build | Released | Game versions | Loaders |
|---|---|---|---|
| 1.4.2 | 2026-09-21 | n/a | BepInEx |
| 1.4.1 | 2026-09-12 | n/a | BepInEx |
| 1.4.0 | 2026-09-10 | n/a | BepInEx |
| 1.3.0 | 2026-08-29 | n/a | BepInEx |
| 1.2.0 | 2026-08-26 | n/a | BepInEx |
| 1.1.1 | 2026-08-25 | n/a | BepInEx |
Dependencies
- Required: BepInExPack Valheim
Declared by the newest build that lists any. Required ones are installed with it on one-click installs.
Pick a server or deploy a new one above; it is installed in one click.
What kind of mod it is
From the catalogAdmin & protection
Permissions, moderation, anti-cheat and land protection for the people running the server.
Compatibility
- Game
- Valheim
- Loaders
- BepInEx
- Requires
- One-click install needs a BepInEx server.
Verified at the source
- ✓ThunderstoreOfficial listing, checked 2026-10-01Open ↗
- ✓AuthorEzomic, as published on Thunderstore
- ✓LicenseNot published by the sourceFree






