Confirm with your password

TheRavensCall

Server admin & analytics mod. Pairs with client mod WhereTheCrowFlies to track player kills, deaths, bosses, gear, and playtime. Narrates to Discord and Chronicle logs, with a web dashboard and BarrkBOT JSON export.

Server-only Logging

· Website

Stars
0
Downloads
6
Version
1.2.1
Updated
Author
RavenIronStudios
Virus scan
✓ Scan successful
Runs on
Server-only

Description

🐦‍⬛ The Raven's Call

Valheim Mod Deployment Companion Framework Publisher Version

RavenIron's server admin & analytics engine: aggregates player telemetry from WhereTheCrowFlies, chronicles realm history, and feeds live web dashboards and Discord AI bots.


Odin kept two ravens. Huginn flew out each dawn to see what moved in Midgard; Muninn stayed close to hold what had already happened. Together they were his whole knowledge of the nine worlds, whispered into his ear each evening.

The Raven's Call is Muninn, perched upon your dedicated server holding the chronicle of every fallen god, player milestone, and Viking saga. Out in the field, its companion client mod WhereTheCrowFlies is Huginn, flying alongside your players to gather combat, kills, deaths, and telemetry from the living edge of Midgard and send it home.


⚠️ How It Works: Server Mod + Client Companion

In Valheim's multiplayer architecture, the dedicated server acts as a world-state relay. Combat resolution, damage calculations, creature deaths, and player statistics execute exclusively on the game client that owns the local simulation zone. A dedicated server on its own never executes Character.Damage or Character.OnDeath for player combat.

To provide seamless, 100% accurate tracking without missing a single event, the system uses two coordinated mods:

  1. The Raven's Call (Server Mod — This Mod)

    • Installed on the Dedicated Server (or listen-server host).
    • Listens for telemetry routed RPCs (RavensCall_EventReport_V2 and RavensCall_CombatReport_V1) from connected clients.
    • Verifies incoming reports against connected players to ensure authentic data.
    • Maintains the persistent multi-player database (BepInEx/config/TheRavensCall/players/).
    • Serves the live web dashboard on port 2112.
    • Generates the timer-refreshed BarrkBOT_data1.json (players) and BarrkBOT_data2.json (game data) exports for Discord bots.
    • Rotates the daily JSONL Chronicle audit log and posts real-time Discord webhook embeds.
  2. WhereTheCrowFlies (Client Companion Mod)

    • Installed on Player Game Clients.
    • Lightweight, zero-overhead client mod that hooks local simulation events (kills, deaths with cause resolution, damage dealt/taken, bosses slain, fish caught, gear tier, and 105 vanilla stats).
    • Batches continuous telemetry into efficient 10-second updates and transmits them via routed RPC to The Raven's Call.
    • Safe Everywhere: When connecting to vanilla or unmodded servers, client RPC calls silently discard with zero errors, zero latency, and zero log noise.

[!IMPORTANT] Admins: Install TheRavensCall.dll on your dedicated server.
Players: Install WhereTheCrowFlies.dll on game clients so their combat, deaths, boss encounters, and stats are reported to the server's ledger!


📜 Contents

🪶 What It Tracks

Every death, every kill, every fallen god, every shoreline first walked — The Raven's Call aggregates full-spectrum player telemetry sent by WhereTheCrowFlies:

  • Deaths, with rich root-cause resolution — named creatures, bosses, PvP opponents, fire, frost, poison, drowning, smoke, or falls — and a rolling history of the last 10 deaths per player (killer, biome, position, items lost).
  • Boss kills, credited to everyone within a configurable radius of the kill — no one who stood and fought goes unrecognized.
  • Kill and death milestones — 1, 10, 100, 500, 1000 kills; 1, 5, 10, 25, 50, 100 deaths, and beyond.
  • Biome discovery, tracked per player so "first time in the Mistlands" only fires once, ever, per Viking.
  • Gear tier, tracked as players advance their equipment from Leather through Flametal.
  • Titles, earned through creature-family kill counts, boss kills, and the number of gods felled — up to and including Slayer of Gods for felling all seven.
  • Damage dealt & taken, tracked both for current sessions and lifetime cumulative combat, plus blocks, parries, and damage blocked.
  • Every vanilla stat on your own in-game Stats screen — kills, hits, deaths, jumps, cheats, world loads, PvP hits/kills, arrows shot, portals, distance traveled, and the rest of Valheim's ~105 built-in counters — reported as an absolute snapshot, so it backfills whatever a player had already earned before installing the mod instead of starting from zero.
  • Skill levels & progress, for every skill a player has actually raised (Swords, Bows, Sneak, Jump, and the rest).
  • Fish caught, structures built/removed/repaired, items crafted/upgraded/repaired, resources harvested per type, food & potions consumed, bosses summoned, and guardian powers used.

📯 Where the News Goes

The Raven's Call routes incoming telemetry across four server-driven channels:

  1. Discord, via webhook — player-attributable events post as rich, colored embeds the moment they occur.
  2. The Chronicle — a JSON-lines log on disk, one line per event, rotating daily for server history and audit trails.
  3. The Web Dashboard — a live, standalone web page accessible in any browser for admins and players.
  4. The BarrkBOT Export — a clean JSON file, refreshed on a timer, built specifically to be read by Discord bots.

🤖 BarrkBOT & Discord AI Bot Integration

The Raven's Call is designed from the ground up to give Discord bots everything they need to answer real questions about server players, without the bot ever touching the game itself.

The Export File

Every StatsPushIntervalSeconds (default 10 seconds), the mod writes:

BepInEx/config/TheRavensCall/BarrkBOT_data1.json   ← every player's full record
BepInEx/config/TheRavensCall/BarrkBOT_data2.json   ← static game data (items, recipes, buildables)

Two files, sitting on the server's disk, each overwritten in place. If your Discord bot accesses the game server over FTP/SFTP, these live in a standard location requiring no new ports or special credentials. (The same player data is also available live over HTTP — see The Web Dashboard).

Top-level shape:

{
  "generated_at": "2026-08-17T04:12:00.000Z",
  "world_name": "Midgard",
  "day": 214,
  "online_count": 6,
  "raid_active": false,
  "raid_type": "",
  "players": {
    "Thorium Wubarrk": { "...": "see below" },
    "Asfa W": { "...": "see below" }
  }
}

players is an object keyed by the player's exact in-game display name, matching standard bot player-stats stores and leaderboards.

Per-Player Schema

Every player's record is verified against active server connections:

{
  "name": "Thorium Wubarrk",
  "first_seen": "2026-01-04T18:30:00.000Z",
  "last_seen": "2026-08-17T04:11:52.000Z",
  "online": true,
  "session_start": "2026-08-17T02:00:00.000Z",
  "playtime_seconds_lifetime": 412884,

  "kills_narrative": 341,
  "deaths_narrative": 12,
  "gear_tier": 5,
  "active_title": "Wolf Hunter",
  "titles_earned": ["Boar Hunter", "Wolf Hunter", "Stag Breaker"],
  "biomes_discovered": ["Meadows", "BlackForest", "Swamp", "Mountain"],
  "boss_kills_credited": 4,
  "creature_kills": { "Boar": 118, "Wolf": 54, "Draugr": 31 },

  "session_kills": 9,
  "damage_dealt_session": 4120.5,
  "damage_taken_session": 860.0,
  "kills_observed_lifetime": 355,
  "deaths_lifetime": 12,

  "bosses_defeated": ["eikthyr", "elder", "bonemass", "moder"],
  "caught_fish": ["fish_1", "fish_3", "fish_9"],

  "death_history": [
    {
      "timestamp": "2026-08-17T02:04:11.000Z",
      "killer": "Fuling Berserker",
      "location": { "x": 1204.5, "y": 38.2, "z": -880.1 },
      "biome": "Plains",
      "items": [{ "name": "Bronze Sword", "qty": 1 }]
    }
  ],

  "vanilla_stats": { "Deaths": 3, "Cheats": 289, "WorldLoads": 3342, "EnemyHits": 266, "EnemyKills": 123, "PlayerHits": 0, "PlayerKills": 0, "HitsTakenEnemies": 403, "ArrowsShot": 0, "BossKills": 0, "Jumps": 324, "PortalsUsed": 5, "DistanceTraveled": 38018.4 },
  "skill_levels": { "Swords": 34.0, "Jump": 12.0, "Run": 8.0 },
  "skill_progress": { "Swords": 0.42, "Jump": 0.10, "Run": 0.75 },

  "blocks_session": 4,
  "parries_session": 1,
  "damage_blocked_session": 210.0,
  "builds_placed": 118,
  "builds_removed": 6,
  "builds_repaired": 2,
  "items_crafted": 54,
  "items_upgraded": 11,
  "items_repaired": 3,
  "resources_harvested": { "Wood": 812, "Stone": 240, "Raspberry": 40 },
  "consumables_eaten": 76,
  "bosses_summoned": 4,
  "guardian_powers_used": 9
}

Field Reference:

Field Description Details
kills_narrative / kills_observed_lifetime Milestone/title kill count vs. raw lifetime kill count. Narrative count gates titles and milestones; observed tracks all verified kills.
deaths_narrative / deaths_lifetime Narrative death count vs. lifetime death count. Ideal for server leaderboards and death counters.
active_title / titles_earned Currently displayed title vs. all unlocked titles. Players can unlock many titles and equip their preferred epithet.
bosses_defeated Defeated boss keys. Canonical short keys: eikthyr, elder, bonemass, moder, yagluth, queen, fader.
session_kills / damage_dealt_session / damage_taken_session Session-scoped combat stats. Resets to zero on each new player connection.
blocks_session / parries_session / damage_blocked_session Session-scoped defense stats. Resets to zero on each new player connection.
playtime_seconds_lifetime Total accumulated play time. Persists across server restarts. Divide by 3600 for hours.
vanilla_stats Every counter on the player's own in-game Stats screen — kills, hits, deaths, jumps, cheats, world loads, PvP hits/kills, arrows shot, portals, distance traveled, and the rest of Valheim's ~105 built-in PlayerStatType counters. Keyed by Valheim's own enum names. Reported by the WhereTheCrowFlies client mod as an absolute snapshot (not deltas), so it backfills a player's true lifetime totals — including whatever they'd already earned before this mod was installed — the moment their client syncs, and can't drift from a dropped packet. Empty until a player's client has synced at least once.
skill_levels / skill_progress Skill level (0-100) and progress-to-next-level (0-1) per skill, e.g. Swords, Bows, Jump, Sneak. Same absolute-snapshot reporting as vanilla_stats. A skill absent from both means the player has never raised it, not that it's at zero.
builds_* / items_* / resources_harvested / consumables_eaten / bosses_summoned / guardian_powers_used Lifetime activity counters — construction, crafting/upgrading/repairing, foraging/farming/sap totals per resource, food & potions consumed, bosses summoned at altars, and Forsaken guardian powers activated. Aggregate counts only, not full histories — same bounded-footprint approach as death_history.

Reading It From a Bot

A minimal Node.js read example:

import { readFileSync } from 'node:fs';

const data = JSON.parse(readFileSync('BarrkBOT_data1.json', 'utf8'));
const player = data.players['Thorium Wubarrk'];

if (player) {
  console.log(`${player.name}: ${player.kills_narrative} kills, ` +
    `${player.deaths_narrative} deaths, title: ${player.active_title || 'none'}`);
}

The Discord Webhook (Narration)

Set WebhookUrl under [Discord] in BepInEx/config/com.raveniron.theravenscall.cfg to post real-time event embeds (deaths, boss kills, milestones, biome discoveries, gear advances) directly into your Discord channel.


🖥️ The Web Dashboard

A full player-stats dashboard served directly by the mod's built-in HTTP server:

  • Open http://localhost:2112 on the server machine, or http://<server-ip>:2112 from any network browser.
  • Displays live vitals, inventories, combat stats, death history, fishing, structure timers, boats, tamed creatures, and progression tracking for every player who has joined the realm.
  • Includes JSON API endpoints: /api/state, /api/gamedata, and /api/health.
  • Can be toggled off with EnableHttpServer = false if only file export is desired.

📖 The Chronicle

Every realm event is recorded as a structured JSON line in:

BepInEx/config/TheRavensCall/Chronicle/TheRavensCall_Chronicle_{yyyy-MM-dd}.log

Rotates daily at UTC midnight. Enable or disable with EnableChronicleLog. Provides a permanent, grep-friendly audit trail for your server.


🏆 Titles & Milestones

Players unlock titles by slaying creature families (100, 500, 1000 kills) and defeating Valheim's world bosses (Stag Breaker, Bane of the Swamp, The Ashen, etc.). Felling all seven gods awards the legendary title Slayer of Gods. Unlocked titles are written directly to active_title and titles_earned in the export data.


🗓️ Seasons

Manage server wipes and eras using in-game console commands:

ravenscall season start [name]
ravenscall season end

Archives Chronicle logs into dated season folders and writes summary stats on completion.


⚙️ Configuration

Configuration is located at BepInEx/config/com.raveniron.theravenscall.cfg:

Section Setting Default Description
Combat AcceptClientReports true Accepts telemetry RPC reports from WhereTheCrowFlies client mods.
Combat LogCombatReports false Enables verbose console logging for incoming combat reports.
Events EnablePlayerDeath ... EnableTitleEarned true Independently toggles narration/Chronicle for each event type.
Format ShowDayNumber / ShowOnlineCount true Appends [Day N] and (N online) to announcements.
Format MessagePrefix Custom prefix added to all broadcast messages.
Log EnableChronicleLog true Writes daily JSONL Chronicle logs.
Bosses BossCreditRadius 100 Proximity radius (meters) for crediting boss assists.
Discord WebhookUrl "" Discord webhook URL for event embeds.
Narrative EnableNarrativeMode true Uses dynamic Norse flavor-text templates.
Companion EnableHttpServer true Runs the web dashboard and local HTTP API.
Companion HttpServerPort 2112 Port for web dashboard and API access.
Companion StatsPushIntervalSeconds 10 Frequency (seconds) for updating BarrkBOT_data1.json / BarrkBOT_data2.json.

📁 Where Everything Lives

BepInEx/config/TheRavensCall/
├── BarrkBOT_data1.json         ← Aggregate player export for Discord bots
├── BarrkBOT_data2.json         ← Static game data export (items, recipes, buildables)
├── players/                    ← Persistent JSON record per player
├── Chronicle/
│   └── TheRavensCall_Chronicle_2026-08-17.log
├── theravenscall.html          ← Embedded dashboard web UI
├── lore.txt                    ← Lore broadcast repository
└── seasons.json                ← Active and historical season metadata

📦 Installation & Dependencies

Server Setup (Admins)

  1. Install BepInExPack Valheim on your dedicated server.
  2. Place TheRavensCall.dll into BepInEx/plugins/.
  3. Launch server to generate configuration files.

Client Setup (Players)

  1. Players install WhereTheCrowFlies on their Valheim game clients.
  2. Combat, deaths, boss encounters, and stats will automatically transmit to The Raven's Call.

Changelog

📜 Changelog

The Raven's Call — RavenIron


🟢 [1.2.1] — Trusting the Crow's Count

A maintenance pass, caught while rejoining a multi-mod build session: the raven still answered to its old companion's name at startup, its own dashboard doubted the very telemetry it exists to relay, and the project's build had quietly broken the day it moved into a new nest.

🩹 Fixed

  • Dashboard totals didn't trust the crow. total_kills/total_deaths — the legacy-shaped fields the web dashboard reads — were still built from the server's own directly-observed counts, which undercount badly (a dedicated server owns no zone with a player in it). vanilla_stats.EnemyKills/.Deaths, reported by WhereTheCrowFlies, already carry the real lifetime totals, and BarrkBOT itself already prefers them per BARRKBOT_CONTRACT.md — but the dashboard alias never did. It now prefers the crow-reported totals, falling back to the observed count only until a player's client has synced at least once.
  • Startup logs and /health still answered to "SteveCompanion" and its long-retired version number (0.2.3) — leftovers from the mod this one was merged from. Now reports its real name and version.
  • The build had silently broken the day this project moved under PAUSED/ — every library reference resolved one directory too shallow, failing 131 ways at once with no single obvious cause. Reference paths fixed; verified clean, 0 warnings, 0 errors.

🟢 [1.2.0] — Muninn Finally Listens to Both Ears

WhereTheCrowFlies had been broadcasting a full second RPC channel (RavensCall_EventReport_V2) since its own 1.0.1 — kills, deaths, damage, building, crafting, harvesting, consumables, world events, and every one of Valheim's ~105 built-in player stats — and this mod only ever registered a listener for the old RavensCall_CombatReport_V1 channel. An unregistered routed RPC is a silent no-op in Valheim, so none of it errored; it just vanished. A player with 123 lifetime kills and 266 hits on their own Stats screen showed 0 of either here. This release registers the other ear.

✨ Added — RavensCall_EventReport_V2 receiver

  • Full server-side handling for all ten V2 event types: kill, death, damage/defense batches (now including blocks, parries, and damage blocked), fish catches, building, crafting, harvesting, consumables, and world events (boss summons, portal use, guardian powers).
  • Two new event types, added this pass in coordination with WhereTheCrowFlies: StatSnapshot (11) and SkillSnapshot (12) — both absolute, not delta, reports. PlayerRecord.VanillaStats now carries every counter from a player's own in-game Stats screen (deaths, cheats, world loads, kills, hits, PvP kills/hits, jumps, arrows shot, portals, distance, and the rest), and SkillLevels/SkillProgress carry every skill they've raised — keyed by Valheim's own enum names, read straight off the client's PlayerProfile.m_playerStats and Player.GetSkills(), no hardcoded ID tables on either side to drift out of sync.
  • Because these are absolute snapshots, not accumulated deltas, a player's entire pre-existing history backfills the moment their client first syncs — no waiting for enough new activity to "catch up," and no permanent drift if a packet is ever dropped.
  • Kill/death/fish crediting is shared with the existing V1 path (CombatEventDedup already collapses the redundant dual-send every V2-capable client makes for backward compat). Damage batches avoid double-crediting via a new V2DamageTracker: V1's damage packet is only skipped for a player confirmed to also be sending V2 — so a V2-capable client's redundant dual-send doesn't double the numbers, but a player still on WhereTheCrowFlies v1.0.0 (V1-only, predates V2) keeps getting credited instead of going silently dark.

🔁 Changed

  • JSON exports renamed for consistent, predictable naming: barrkbot_players.jsonBarrkBOT_data1.json, steve_export.jsonBarrkBOT_data2.json. Same content and refresh cadence, just a naming scheme with room to grow.

🟢 [1.1.1] — Official Studio Portal & Metadata Sync

Synchronized release metadata across the RavenIron mod suite, linking the server mod to the official studio portal and setting the foundation for unified telemetry with companion client releases.

🌐 Metadata & Links

  • Website URL updated to the official RavenIron studio portal (https://ravenirongames.rglmobile1.workers.dev/), matching the client companion mod WhereTheCrowFlies.
  • Version bump to 1.1.1 across manifest.json, PluginVersion, and distribution archives.

🟢 [1.1.0] — The Raven Learns to Listen

What 1.0.0 called "server-authoritative combat resolution" was, it turns out, resolution that never ran. Character.Damage and Character.OnDeath fire on whichever client owns the fight — never the dedicated server — so every kill, death, damage, and catch counter has read zero since launch, for every player, every day. The server was never blind by choice; it just never received a signal. This release gives it one.

🔴 The Bug 1.0.0 Didn't Know It Had

A full day of live play across 28 players produced 11 joins, 5 leaves, and not one kill, death, damage point, or fish. No error, no Harmony failure — the patches are correctly written and attached to methods that simply never execute headless. Full writeup: KILL_TRACKING_FINDINGS.md.

✨ Added — RavensCall_CombatReport_V1

  • A new server-side RPC receiver credits kills, deaths, damage, and fish catches reported by a companion client mod, WhereTheRavenFlys — the client's own Character.OnDeath/Damage/FishingFloat.Catch DO fire authoritatively (they're the owning machine), so it reports what it directly observed instead of the server trying and failing to see it itself.
  • Every report is verified against the live connected-player list before anything is credited — a modded client can lie about a name in the payload, it cannot invent a connected player — rate-limited per sender, and deduplicated against the (still dormant, still kept) server-side patches so a future topology where both fire can't double-count.
  • New config: [Combat] AcceptClientReports (on by default) and LogCombatReports (off by default — verbose, for rollout verification).

🩹 Fixed

  • Biome discovery and gear-tier polling were also walking an empty list. Player.GetAllPlayers() — the API the old poll tick used to find "who's online" — is empty on a dedicated server, the same root cause as the combat gap above. Biome discovery is fixed the same way (it's pure position math); gear-tier detection needs a player's actual inventory, which still has no server-side API, so it remains a known gap pending its own client report.
  • Join/leave counts drifted apart over a day of play (11 joins, 5 leaves on the day this was diagnosed) because a crash or Alt-F4 never fires RPC_Disconnect/SendDisconnect, leaving a session open and online stuck true forever. The poll tick now reconciles the registry against the true connected-player list every interval and closes anything orphaned, logging it to the Chronicle as (connection lost).
  • Boss-kill proximity credit no longer silently misses players who haven't opted into the minimap's "public position" sharing toggle — ZNet.GetPlayerList()'s position field reads (0,0,0) for anyone who hasn't, which would have quietly under-credited boss fights the moment this became position-based. Proximity now reads from each player's character ZDO instead, which stays live regardless of that toggle.

📜 Architecture note

Saga.cs's header comment claimed combat "fires [on the server] for real combat resolution." It never did. Rewritten to describe what's actually true: join/leave/raids/day are server-observed; combat arrives by report.


🟢 [1.0.0] — The Two Ravens Become One

RavenIron's first release. Not a new mod so much as a merger and a rebirth: two older birds — SkaldSaga, who narrated the saga, and SteveCompanionMod, who kept the ledger — folded into one raven and sent out from a new hall.

🔴 Install It on the Server. Only the Server.

This is the change that matters most, and it isn't a bullet point buried in the middle of a list: The Raven's Call runs entirely server-side. Its two ancestors were client mods every player had to install; this one is not. Nothing here needs a menu key, a HUD panel, or a single Viking to know it exists. Drop the DLL in the server's BepInEx/plugins/, and every feature below is already live for every player who connects — no client install, no version-matching, no "everyone update before you log in."

✨ Added — Server-Authoritative Tracking

  • Kills, deaths, and damage are now attributed to the player who actually caused them, resolved from the server's own combat resolution — not assumed to be "whoever's game client is currently reporting." A creature killed by no one's hand (environment, another creature) is no longer wrongly credited to a bystander.
  • Boss kills credit everyone in the fight, not just whoever's client happened to detect it first — configurable radius, same as before, now computed once by the one machine that actually knows where everyone stood.
  • Biome discovery and gear-tier tracking moved off client UI callbacks onto server-side polling — the old hooks (a UI toast, an equip-menu callback) never fired on a headless server to begin with, so this isn't a change in behavior so much as the feature actually working for the first time in a dedicated-server context.
  • A multi-player data store replaces the old single-active-character model. Both ancestor mods kept exactly one character's data in memory, swapped in and out — fine for a client watching one player, useless for a server watching a whole roster at once. The Raven's Call now holds every known player's record simultaneously, one JSON file per player, loaded at startup and saved as it changes.

🤖 Added — The BarrkBOT Export

  • barrkbot_players.json, refreshed on a timer, one aggregate file with every player's kills, deaths, titles, gear tier, biomes, bosses, caught fish, playtime, and recent death history — built specifically to be read by a Discord bot with zero game-client dependency. See the README for the full schema and a bot-side read example.
  • Session-scoped stats (session_kills, damage_dealt_session, damage_taken_session) now correctly reset on every reconnect — previously (in development) these could silently accumulate for a server's entire uptime rather than resetting per session.
  • Lifetime playtime is now tracked and persisted per player, accumulated on every disconnect and surviving server restarts.

✨ Added — Kept From Both Ancestors

  • Discord webhook narration for deaths, boss kills, milestones, biome discovery, gear tier, and titles — colored embeds, same nine event types as SkaldSaga always sent.
  • The JSONL Chronicle log, rotating daily, unchanged in format.
  • Titles earned through creature-family kill counts and boss kills, up to Slayer of Gods for felling all seven — the full title table carried over from SkaldSaga.
  • The admin season system (ravenscall season start/end), archiving the Chronicle by era.
  • The full player-stats web dashboard (theravenscall.html, formerly stevecompanion.html) — inventory, crafting, combat, death history, fishing, timers, boats, tamed creatures, progression — now correctly showing every player who has ever connected, not just whoever was locally logged in when the old mod ran.
  • Randomized narrative message templates (EnableNarrativeMode), so a death or a boss kill doesn't read the same way twice in a row.

🩹 Fixed (relative to the two ancestor mods)

  • The dashboard's /api/state no longer produces duplicate JSON keys. The old per-character merge stitched three separate files together with raw string surgery, appending a second copy of bosses/combat/death_history on top of the first — technically valid JSON, but only correct under a "last key wins" parser. The new single-source-of-truth merge emits each field exactly once.
  • Kill counters no longer count deaths nobody actually caused. The old companion mod incremented a kill counter for any creature death a client happened to observe, including ones dealt by other players, tamed creatures, or the environment.
  • A resummoned-and-refought boss now credits correctly. An early build of this merge's boss-kill dedup logic kept a permanent record of "this boss, at this position, already killed" that never expired — silently blocking credit for every kill after the first at any altar players return to. Fixed before release; re-fighting a boss now always credits properly.
  • Fish-catch attribution now uses the actual catching player instead of assuming it was whoever's client was running.
  • Removed the old client→server RPC relay for boss-kill detection entirely — redundant now that the server detects its own combat authoritatively, and one less network round-trip per boss fight.

⛔ Removed

  • All custom in-game UI: the event-feed HUD panel, the title-selection menu, the stats panel, and their keybinds. These required a client install to render at all, which contradicts this mod's whole reason for existing. Deaths, boss kills, and milestones are still fully visible — through Discord and the Chronicle, which don't ask anything of a player's machine.
  • The per-peer "lore whisper" (a center-screen message shown only to a client with the mod installed) — replaced by periodic lore postings to Discord/Chronicle, visible to everyone rather than no one.
  • The bespoke config-sync RPC system. With no client install to sync to, it had nothing left to do.

Full version history & older downloads →

Manual installation instructions
1

Install BepInExPack Valheim

BepInExPack Valheim is required to run mods in Valheim.

Download BepInExPack Valheim 5.4.2333 · View mod page

Check out the mod page for detailed installation instructions.

2

Install TheRavensCall

This mod only needs to be installed on the server.

Download TheRavensCall 1.2.1

Extract the ZIP and place the file(s) into the BepInEx/plugins/ folder inside your Valheim game folder.