Kvedja
A message of the day in the chat window when you log in.
- Why
- What it does
- The text is not in the mod
- Why it is a client mod and not a server one
- Installing
- Settings
- Multiplayer
- Bugs and ideas
- Licence
A line in the chat window when you log in, read from the Longhouse site.
Why
The greeting is not the point. The point is that there is a board where players vote on what a mod should do next, and a board for bugs, and almost nobody knows either exists.
A link in a README is read once, by the person installing, months before they have an opinion worth casting. A pinned message in Discord is read by the people who are already in Discord. The moment that actually matters is when somebody is in the game, having just been annoyed by something or having just thought of something they wish a mod did, and that is the moment the address is worth having in front of them. The chat window is where they are already looking.
Kveðja is Old Norse for a greeting.
What it does
When you appear in the world, it reads longhouse.thijssensoftware.nl/api/motd and prints what it says into the chat window, one line per line, under a name in orange. Then it stops. It does not repeat, it does not follow you around, and it says nothing at all if the site has nothing to say.
By default it stays quiet when you respawn after dying, because being greeted at the moment you have just lost everything reads as mockery. There is a setting if you disagree.
The text is not in the mod
Which is the design, and worth saying plainly before anybody worries about it.
The message lives on the site and the client reads it when you log in. That means it can be changed without an update to install and without a server restart, and it means the same line reaches you in singleplayer, on Longhouse, and on somebody else's server. It also means this mod makes one small web request per login, to that address and no other, and sends nothing about you with it.
Point Url somewhere else and this is a message of the day for any server that wants one. The
only requirement at the far end is that the answer is plain text.
If the site is unreachable, the request fails and nothing is said. That is deliberate: you cannot fix a site being down, so a greeting that complains about itself is worse than no greeting.
Why it is a client mod and not a server one
Worth writing down because the obvious expectation is the opposite.
A Valheim server cannot put a line in the chat window. The route that looks like it should work, sending a chat message over the network, ends in the client looking the sender up among the connected players, and a dedicated server has no entry in that list. Every attempt produces an error in the log and a floating piece of world text at the centre of the map. The call that does work takes a plain name instead of a player, does no lookup, and has no network path behind it, so it can only be made on the machine that is reading the message.
That is also why a server cannot silence this one, and why every setting here is yours.
Installing
Needs BepInEx. Nothing else. Through a mod manager it is one install. By hand, put
Kvedja.dll in BepInEx/plugins/Kvedja/.
Then start the game once and quit. That first run writes the config file. It does not exist before the mod has loaded, which is the usual reason people think it is broken.
Settings
The file is BepInEx/config/ezomic.valheim.kvedja.cfg. Open it in any text editor. Every
setting has a comment above it, so the file explains itself.
Note that changing a default in a new version does nothing on a machine that has already run the mod. BepInEx writes every entry on first run and the saved value wins.
Multiplayer
Nobody else needs it. It reads a web page and writes into your own chat log. A server does not know it is there, and neither does anybody playing beside you.
If Core is installed, this mod registers with its version gate so a mismatch is reported rather than discovered later. Every setting is marked as yours, the address included. A host imposing that one would be pointing your client at an address of its choosing, and it would still be in your config after you disconnected.
Bugs and ideas
Both go to the site. longhouse.thijssensoftware.nl/bugs is for anything broken, and longhouse.thijssensoftware.nl/ideas is for what a mod should do next. You can vote on other people's ideas there as well.
Signing in takes a Steam or Discord account. I work from that list, so the votes decide what I pick up next.
Licence
MIT. See LICENSE.
Coming next
Written, not released yet. This is what the next version of Kvedja will carry as 1.0.0, and it can still change.
First release.
When you appear in the world it reads longhouse.thijssensoftware.nl/api/motd and prints what it says into the chat window, one line per line, under a name in orange. Then it stops. It does not repeat, it does not follow you around, and it says nothing at all if the site has nothing to say. By default it stays quiet when you respawn after dying.
It also shows the server's own notices in the chat window - who joined, who left, who died - when the server asks it to. Those come from Crier, which has always known all three and could only ever put them in the top-left corner: a server cannot write to the chat window at all, because the path that gets there looks the speaker up in the connected-player list and a dedicated server has no entry in it. That is the same wall the message of the day is built around, so the same mod answers both. Verified in game on 2026-09-22, leaves and deaths.
Nothing appears unless a server sends it, and only the server is listened to: the line is checked against the server's own connection before it is shown, or any player could put words in everyone else's chat window under the server's name.
The text is not in the DLL. It lives on the site and is edited there, so it changes without
an update to install or a server restart, and the same line reaches you in singleplayer, on
Longhouse and on somebody else's server. Point Url somewhere else and it is a message of the
day for any server that wants one, as long as the far end answers plain text.
Settled since 0.1.0 by running it:
- The request works from inside the game. The TLS line came from Crier, which makes the trip from a dedicated server, and a client is a different process, so it was a guess until the scenario watched a real fetch land.
- The timeout is a
CancellationTokenSource, notHttpClient.Timeout. Setting that property per request throwsInvalidOperationExceptionthe second time, because the first request starts the handler. The first login of a session would have worked and every later one would have failed looking like a network fault. - The line arrives under its title.
kvedja-greets-you-in-chatreads the scrollback for the speaker as well as the address, which tells "the message arrived" apart from "the message arrived without its name on it".
Two things the scenario cannot cover, since a replay starts after both have happened. Watch them by eye the first time:
- Whether the chat window opens by itself. Adding a line to the buffer does not do it.
Chat.Updatedraws the window only while its hide timer is under the delay, and the incoming-message path resets that timer, notAddString. Kvedja reaches the timer by reflection and zeroes it. If that binding is ever wrong the message sits in the scrollback, invisible, with everything else reporting success. - Whether four seconds is the right wait. The first second or two after spawning is the loading screen fading out, and a line printed under it has been said to nobody. The number is a guess at the length of a fade.
Registers with Core's gate at Requirement.HostOnly and marks every setting as yours. A host
imposing Url would point your client at an address of its choosing, and Core writes an
imposed value into the guest's own cfg, so it would still be there after they disconnected.
Every setting · 8
All of it lives in one file, written on first run with each description beside its default. The file is the source of truth; edit it there.
BepInEx/config/ezomic.valheim.kvedja.cfg
server On a server, the host's value applies to everyone while they are connected; your own file is left alone and counts again when you leave. yours Keys and personal settings stay as you set them, on any server.
Kvedja 8
| Setting | What it does | Default | Whose |
|---|---|---|---|
| Enabled | Off leaves the plugin loaded and says nothing. Nothing is fetched either, so this also stops the mod asking the site anything at all. | true | yours |
| Url | Where the message is read from. Plain text, one line of chat per line. Empty turns the mod off as surely as Enabled does. Any server can host its own: the only requirement is that the answer is text. | https://longhouse.thijssensoftware.nl/api/motd | yours |
| Title | The name in front of the message, where a player's name normally goes. It is drawn orange by the game, which is what makes the line read as somebody speaking rather than as an error. | Longhouse | yours |
| Voice | How the line is styled. Shout is drawn yellow AND IN CAPITALS, whisper is faded and forced to lowercase; both are done by the game, not here. Normal is the only one that prints what was written. | Talker.Type.Normal | yours |
| Delay | Seconds after you appear in the world before the message is said. Too early and it lands under the loading fade, which looks exactly like it never arrived. | 4 | yours |
| Timeout | Seconds to wait for the site before giving up. Giving up is silent: a message of the day that reports its own failure to a player is worse than no message, because the player can do nothing about it. | 8 | yours |
| Repeat | On says the message again every time you respawn, not only when you log in. Off is once per world session, which is what login means. | false | yours |
| Verbose | Write what was asked for and what came back to BepInEx/LogOutput.log. Off unless the message is not appearing; it is three or four lines per login. | false | yours |
Discussion
Nothing said yet.
Sign in or make an account to join in.