Valheim
Install with App

Details

Latest version
1.0.1
Last Updated
First Uploaded
Downloads
8
Likes
0
Size
199KB
Dependants

Categories

ADDatHost Valheim hosting
€1

Clanheim Server Watch

The Watchtower — Scottish spirit. Viking resolve.

New in 1.0.1: separate Discord channels

Keep one continuously updated status panel while player activity, public server announcements and private alerts go to their own channels. You can point the optional webhooks to the same channel if you prefer.

Config key Suggested channel What it receives
StatusWebhookUrl #server-status One edited panel, player count, uptime and how to join
EventsWebhookUrl #player-activity Player joins/disconnects and current online count
AnnouncementsWebhookUrl #server-announcements Startup, best-effort shutdown and your custom announcements
AdminWebhookUrl Private staff channel Grouped errors and optional confirmed-save notices

Blank webhooks disable their route. Nothing falls back to the status channel. These are Discord messages; the mod does not post announcements into in-game chat or accept Discord commands.

Upgrade from 1.0.0

  1. Stop the server and replace the existing plugin DLL with this version. Keep only one copy.
  2. Keep your existing CFG and status-message.state file.
  3. Start once to generate the new config entries, then stop.
  4. Fill in EventsWebhookUrl, AnnouncementsWebhookUrl, JoinAddress, JoinInstructions and optionally ModpackUrl. Restart to apply.

Your existing StatusWebhookUrl now receives only the panel. Join/leave posts will remain disabled until EventsWebhookUrl is configured. Server start/stop posts require AnnouncementsWebhookUrl. Keep all real webhook URLs private.

Publish a custom server announcement without restarting

In Hosterfy, create a UTF-8 text file in:

/home/container/BepInEx/config/ClanheimServerWatch/

Write the announcement into announcement.tmp, finish saving/uploading it, then rename it to announcement.txt. For example:

Clanheim will restart in 10 minutes for a server update. Please find a safe spot and log out before the restart.

The mod checks every five seconds and waits at least two seconds after the file was last written. It queues the message to AnnouncementsWebhookUrl and renames the file to announcement-last-queued.txt. That archive means queued, not confirmed delivered. Check Discord for delivery before announcing a restart.

Use one announcement at a time. Files over 8 KiB or containing only whitespace are ignored. Messages are limited to 1,800 characters, formatting is flattened, and mentions are disabled. The file route needs AnnouncementsWebhookUrl but is independent of the ServerAnnouncements lifecycle toggle. Network failures or a shutdown can drop queued announcements; it is not a durable message queue.

A continuous view of the realm

The status panel updates even when nobody is online. A join or disconnect requests an earlier refresh on the next five-second polling cycle. The panel shows current players, display capacity, player names (optional), monitor uptime, peak players and join/disconnect totals for this watch, world details and public connection instructions. Counters reset when the monitor/server restarts; players already present on its first sample count toward the peak but not as new joins.

The official Clanheim Discord monitor, built for our Viking community with a Scottish soul. Keep an eye on the realm through a persistent status panel, warrior arrivals and departures, and grouped reports for server staff.

Dedicated-server only. Players do not need to install this mod. Discord webhook setup is required.

Around the watchfire

Feature What it reports
Status panel A single Clanheim-branded message updated every 60 seconds
Warriors online Player count and optional character names
Arrivals and departures Join/disconnect notices in EventsWebhookUrl
Realm information World name, world day, monitor uptime and loaded-plugin count
Performance Sampled Unity main-loop FPS
Seasons Last season/day observed from the Seasons mod's logs, when available
World saves Clearly labelled save preparation or recognised completion observations
Staff reports Repeated warnings/errors grouped into one private digest every ten minutes

The status panel's message ID is retained between restarts. If you delete the message, the mod can create a replacement. Optional public connection details can be shown in the panel.

Built for Clanheim

The staff digest recognises village-processing timeouts, inconsistent village regions, rejected world modifiers, duplicate plugins and the enchanting/loot configuration mismatch. Thousands of repeated village warnings become a single count, rather than thousands of Discord posts.

Alerts report what happened; they do not repair village data or suppress the original server log. Only fixed alert categories and counts are sent. Raw logs, Steam IDs, passwords and webhook tokens are not included in reports.

Requirements

  • BepInExPack Valheim 5.4.2351 (declared as a package dependency).
  • A Valheim dedicated server with outbound HTTPS access to Discord.
  • One Discord incoming webhook for the status channel, with additional webhooks for any other desired channels.
  • Optional webhooks for player activity, public server announcements and private staff reports.

Seasons is optional. Neither Seasons nor Valheim Villages is installed as a dependency. The monitor still runs without them.

Server installation

  1. Stop the server. If you installed the earlier manual build, keep its config and use only one copy of ClanheimServerWatch.dll.
  2. Install this package into your dedicated-server profile, or copy its BepInEx/plugins/ClanheimServerWatch folder into the server's BepInEx/plugins folder.
  3. Start the dedicated server once, then stop it. The mod creates BepInEx/config/com.clanheim.serverwatch.cfg.
  4. In Discord, create an incoming webhook in your status text channel. Paste its URL into StatusWebhookUrl in the CFG.
  5. Create webhooks for player activity and server announcements, setting EventsWebhookUrl and AnnouncementsWebhookUrl. Optionally set AdminWebhookUrl for private staff reports.
  6. Save the file and restart. The first status panel appears after the world reader becomes ready and a 20-second warm-up.

For Hosterfy, the DLL goes here:

/home/container/BepInEx/plugins/ClanheimServerWatch/ClanheimServerWatch.dll

The configuration is here:

/home/container/BepInEx/config/com.clanheim.serverwatch.cfg

Keep configured webhooks private. Never include that CFG in a public modpack. An empty config is deliberately not bundled, so package updates do not overwrite existing webhook settings. A normal desktop client will leave the plugin inactive and will not generate this server config.

Configuration

Edit while the server is stopped; restart to apply.

[General]
Enabled = true

[Discord]
StatusWebhookUrl =
EventsWebhookUrl =
AnnouncementsWebhookUrl =
AdminWebhookUrl =

[Status]
RefreshSeconds = 60
PlayerCapacity = 10
ShowPlayerNames = true
JoinAddress =
JoinInstructions = Install the official Clanheim modpack in Thunderstore Mod Manager. Launch using Start Modded, then join using the server address. Ask staff for access details.
ModpackUrl =

[Alerts]
DigestSeconds = 600

[Events]
PlayerNotifications = true
ServerAnnouncements = true
SaveNotifications = false
  • StatusWebhookUrl: continuously edited status panel only. Use a plain https://discord.com/api/webhooks/ID/TOKEN URL without quotes or query parameters. Threads/forums are not supported in this release.
  • AdminWebhookUrl: private digests and optional save notifications. Blank disables them; there is no public-channel fallback.
  • RefreshSeconds: 30–900 seconds. Default 60.
  • PlayerCapacity: display only; does not change the game's actual slot limit.
  • ShowPlayerNames: set false for anonymous player counts and notices.
  • EventsWebhookUrl: joins/disconnects only; blank disables these posts.
  • AnnouncementsWebhookUrl: custom and lifecycle announcements; blank disables them.
  • ServerAnnouncements: controls automatic startup/shutdown posts.
  • PlayerNotifications: controls automatic join/disconnect posts. Counters still update when off.
  • JoinAddress: optional public connection address, never a password.
  • JoinInstructions: public setup instructions (up to 600 characters).
  • ModpackUrl: optional public HTTPS link to your actual modpack (up to 250 characters). No address or modpack URL is invented or prefilled.
  • DigestSeconds: 60–3600 seconds. Empty reporting intervals stay silent.
  • SaveNotifications: sends staff notices only for recognised completion logs, not save preparation.

Accuracy and limitations

  • Heartbeat, not an external probe: the panel shows that the server-side monitor recently ran. If its timestamp is older than three update intervals, treat its status as unknown. Abrupt crashes cannot send notifications; reliable offline alerts need an external monitor.
  • Save stages are explicit: preparation does not prove a disk write completed. Completion is recognised only when the game logs World saved or World save finished. Some game builds may show preparation only.
  • Live observations only: early startup logs emitted before this mod loaded and historical logs are not counted. Season information remains unavailable until a matching Seasons message is observed.
  • Five-second player polling: very brief sessions may be missed. Players present in the initial sample are not announced as new arrivals.
  • Main-loop FPS: not network tick rate, ping or CPU usage.
  • Best-effort delivery: HTTP requests run in the background with bounded queues, retries and rate-limit handling. Outages can drop updates. Shutdown notification delivery is not guaranteed.
  • Missing game API: optional fields show unavailable rather than invented values. This mod does not change game methods, world data, or player inventories.

Troubleshooting

Search your server log for Clanheim Server Watch. If it asks for setup, check the generated CFG. If Discord rejects a webhook with HTTP 401/403/404, replace the URL and restart. Rejected endpoints are paused to prevent repeat failures, and URLs are not printed to the log.

Retain BepInEx/config/ClanheimServerWatch/status-message.state to reuse the same panel after restarts. Changing the webhook, deleting that file, or a rare ambiguous network failure may create another panel; remove the unused one manually.

Release status

Version 1.0.1 compiles against real BepInEx and Unity references. 30 automated checks passed, including HTTP retry simulations and a full Clanheim server-log replay. The 1.0.1 DLL adds channel separation, session counters and custom announcement support.

Live validation inside Valheim and against a real Discord webhook is still pending. See VALIDATION.md for details. The target is the dedicated-server setup using Valheim l-1.0.15 and BepInEx 5.4.23.5; optional APIs are read through reflection.

Source and rebuild instructions are included in Source.zip. Only the plugin DLL needs installing on the server. To uninstall, stop the server and remove the plugin; no world cleanup is required.

Credits and licence

Custom-built for Clanheim, for Steven and the Clanheim community. Code and icon were created with AI assistance. This release is published under the included Clanheim Community Release Licence; it is not an open-source licence. The branding and permitted use are Clanheim-specific, but there is no technical server lock.

BepInEx, Valheim, Discord and Thunderstore belong to their respective projects and owners. No affiliation or endorsement is implied.

DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro