Repository navigation
Statistics (Skald)
How long the server has been up, how many times it has started, who plays the most and who dies the most. All counted on this machine, and none of it leaves.

Uptime is the total the server has been running, with an alight 4h 32m pill when it is up right now.
Starts counts server starts, with an amber pill counting crashes if there have been any.
Players counts unique people and total visits.
Deaths is the total.
Mod history counts updates and installs.
The player table lists everyone with their playtime, sessions, deaths and when they were last seen. The Playtime and Deaths columns on the Players screen come from here.
Its five columns are sized from the longest each header gets in any language BakaLoader can be read in, measured rather than guessed. Three of them used to be narrower than their own English at the smallest window BakaLoader opens at: Playtime had 56 pixels for a word needing 66, Sessions had 36 for 66, Deaths had 36 for 52, and an English header is one unbreakable word, so it ran over the column beside it. If the card is ever narrower than the table needs, the table scrolls sideways inside it rather than crushing the headers again.
Recent events is a feed of joins, leaves, deaths, starts, stops and crashes.
Mod history is a feed of every mod update and install BakaLoader made, with the versions.
Before anything has happened, the tables say "No players recorded yet. Playtime, sessions and deaths are counted from the moment the first player joins.", "No history yet." and "No mod changes yet."

The same screen on a real server that has only ever been started and stopped:

Each of these is one line in a journal file, stamped with the time and the server profile it belongs to:
a server start, a stop, a crash, a player joining, a player leaving, a death, a failed world save, an automatic start that was held back, a pre-update world snapshot, a mod update, a mod install, and a language pack that was downloaded.
A player entry also carries their key, their name and their character name. A mod entry carries the mod and the versions it went from and to.
Names in the journal are repaired on the way in. Until 1.2.0 BakaLoader read the server's console output with whatever code page Windows was set to rather than as UTF-8, so a name written in Greek, Cyrillic or Japanese went into the journal broken. This screen groups a player's events by their platform id and falls back to matching on the character name for an event that carries no id, which a broken name quietly fails, so one player's deaths could sit apart from their visits. Every read of the journal now puts those names back where it can be proved rather than guessed. See Players.
BepInEx is written into the journal the same way a mod is. A pack BakaLoader puts in counts as an install and a pack it moves to a newer version counts as an update, under the package name denikson-BepInExPack_Valheim, so both show in the Mod history tile and in the Mod history feed. A write that was refused and one that found the pack already in place are not recorded, because neither moved a version. See BepInEx.
Four of those are written down and never shown here: a failed world save, a start that was held back, a pre-update world snapshot and a language pack download. They are in the journal because it is the record of what happened on this machine, and the place you meet them at the time is the condition bar or the Log. Everything else on the list is drawn somewhere on this screen.
One file: %USERPROFILE%\AppData\LocalLow\BakaLoader\ValheimBakaLoader\analytics.json.
It is JSON with short keys, because it accumulates for months. It prunes itself: anything older than 180 days is dropped, and the total is capped at 20,000 entries with the oldest going first.
This file is never uploaded. There is no code path that sends it anywhere. The only thing that reads it is the app itself, to draw this screen and to fill the Playtime and Deaths columns on the roster.
The separate anonymous heartbeat is a different thing entirely, sends three fields, and has nothing to do with this journal. See Privacy and network.
New in 1.0.2. Reset statistics sits in the page head, with the tooltip "Clear every counted number and start the journal again".

It asks first, and the dialog says the two things worth knowing. That it clears everything for every server, because they are all counted in the one journal: "Uptime, starts, crashes, playtime, sessions, deaths and the mod chronicle all go back to nothing, for every realm. They are counted in one journal on this machine." And that the old journal is not thrown away: "The old journal is set aside as one backup copy beside it, and the counting starts again from now."
The old file is renamed to analytics.json.bak-20260910-181500, with the stamp taken when you pressed it. One copy is kept, so a second reset replaces the first backup rather than leaving a pile of them. The toast names the file it kept.
The counters are cleared in memory whether or not the rename works, so you always get what you asked for. If the file could not be set aside, the log says so and only the kept copy is missing.
You can still do it by hand: close BakaLoader and delete analytics.json. Close the app first, or the next write puts it straight back.
The Playtime and Deaths columns on the Players screen are read from this journal, not from the game. They are pulled on a leash: once when the screen opens, and at most every 20 seconds while it is open. The roster itself refreshes twice a second, and that fast poll never becomes a journal read.
So a dash in Playtime means this journal has nothing for that player yet, which is normal for someone who joined before you started using BakaLoader.
You want to know whether the nightly restart is actually happening.
Open Statistics. Starts says 57 and crashes says 2. The Recent events feed shows a stop and a start about four and a half hours ago, and another pair before that.
If the restarts were failing, you would see a start with no matching stop, or a crash entry instead. Cross check with the Log.
Is this sent anywhere? No. It is a local file and nothing reads it but the app.
Why does a player have no playtime? The journal only knows about sessions BakaLoader watched. Anything before that, or any session on an adopted server where BakaLoader could not read the log, is not counted.
Can I export it? Take the file. It is plain JSON.
Does it count time when the server was down? Uptime counts the server running, not the app running.
Do deaths include deaths to fall damage and drowning? It counts what the server logs as a death, which is any death.
Screens
Dashboard (Hearth) Players (Vikings) Mods BepInEx Hexium Configs (Runes) Settings (World) World modifiers Map (Atlas) Log (Saga) Discord (Herald) Statistics (Skald)
Guides
Running the server Automatic restarts Server updates and the launch guard Updating the server Updating BakaLoader Worlds, backups and restore Deleting a world Multiple servers Custom domain Languages The condition bar Command palette and shortcuts Privacy and network Client companion
Reference
Settings reference How mods are matched and updated The bundled plugins World file formats How the map is drawn For mod authors
Help