You are viewing a potentially older version of this package. View all versions.
Pendulum-ValheimSagas-0.3.26 icon

ValheimSagas

Every Viking has a story. Standalone server website with player statistics, a 2D world atlas, character armory, leaderboards and evolving sagas.

Date uploaded 3 days ago
Version 0.3.26
Download link Pendulum-ValheimSagas-0.3.26.zip
Downloads 18
Dependency string Pendulum-ValheimSagas-0.3.26

This mod requires the following mods to function

denikson-BepInExPack_Valheim-5.4.2350 icon
denikson-BepInExPack_Valheim

BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.

Preferred version: 5.4.2350

README

Valheim Sagas

Every Viking has a story.

Your adventures, remembered: a standalone Valheim mod with a server-hosted website, a living 2D atlas, character armories, leaderboards and optional AI-written sagas.

Viking profile with saved portrait, equipment, Nemesis score and compact Appearance control

Explore your fellowship

  • World Atlas: Valheim terrain captured at runtime, textured brown fog of war, personal or combined exploration, named player markers, online/offline filters and separate kill/loot heat maps.
  • Vikings: persisted equipped-character portraits, game item icons, detailed hover/focus/tap tooltips, resistances, gear effects and personal statistics. Shared portraits and equipment remain available after logout while the host website is running.
  • Leaderboards: boss progression and credited teams, observed fight times, kills and stars, rarity discoveries, carried gold and optional Epic Loot bounties.
  • Optional SLS enhancements: host-colored zone squares that follow SLS fog settings, hover levels above 1, current Nemesis scores and distinct Nemesis boss-kill rankings.
  • Sagas: persistent personal and server stories with a separate recorded-facts ledger. The host must configure OpenRouter first; no template stories are generated.
  • Make it yours: boxed, full-screen or full-screen scrolling scenery. Your personal login can select backgrounds up to your recorded boss progression; everyone sees the saved selection. New browsers default to full-screen scroll.

World Atlas with day/night dial, colored personal icons, a fanned pin group and a last-known Viking marker

Statistics support all history, 30 minutes, 1/6/12 hours, 1/3/7 days and custom dates. Live presence and last-known equipment are independent of the selected time window. Drops, verified earned collections and unknown pickups remain distinct; repeat pickups and bonus loot rolls cannot create extra kills.

Server rankings including optional Nemesis boss kills

Screenshots show an isolated copy of recorded playtest data, with display names replaced for publication. The atlas shows saved playtest exploration, a last-known Viking marker, colored personal icons and a fanned group connected to its true locations. One Viking owns these pins, so they share that Viking's color. The day/night dial uses a labeled example day/countdown because the offline snapshot has no live world clock. The Nemesis leaderboard is shown honestly with no recorded victories yet. These are website captures, not evidence that every multiplayer integration has been verified.

Install and open

  1. Install BepInEx 5 and Valheim Sagas on the host and every participating client. Use the same release on each. In a mod manager, install the package; manually, extract its BepInEx folder into your profile/game installation. Keep the four plugin DLLs and web folder together.
  2. Start a world. A dedicated server is optional: a normal hosted or solo world starts the website on that computer. The website stops when the host closes the world/game.
  3. On the host computer, open http://127.0.0.1:8877/. New configurations allow public viewing without a viewer token. This does not expose a public internet port: the default binding remains loopback.
  4. Settings are in BepInEx/config/org.valheimsagas.collector.cfg. Existing saved settings are preserved on upgrade. Restart the host after changing server settings.
  5. For a dedicated host, use its allocated website TCP port and the wildcard listener described below. Visitors open http://SERVER-IP:PORT/. An HTTPS reverse proxy is optional for a domain and encrypted access; no separate website installation is required.

All participating players need Sagas for full telemetry, portraits and exploration. Epic Loot, Jewelcrafting and Star Level System are optional. Game/Unity assemblies and runtime game assets are not bundled. Biome backgrounds are bundled as responsive WebP images for offline use; unused original PNG artwork is excluded from releases.

Dedicated servers: IP and allocated port

Stop the server and edit the existing [Server] entries in BepInEx/config/org.valheimsagas.collector.cfg. For a hosting panel that allocates port 19908:

[Server]
EnableWebsite = true
ListenPrefix = http://*:19908/
RequireViewerToken = false
DisplayName =
AdvertisedAddress =

Restart the server, then open http://YOUR-SERVER-IP:19908/. Replace 19908 with your allocated website port. Keep the http:// and trailing /; the wildcard * belongs in the configuration, not the browser address. 127.0.0.1 only accepts local requests and will not make the website accessible to remote players. The host must allow TCP on the chosen port; keep the Valheim game/query ports unchanged. You do not need to create a panel reverse proxy for direct IP access.

With DisplayName blank, 0.3.9 reads the host's configured Valheim server name, falling back to its world name. Set DisplayName = Your Fellowship to override it. Set AdvertisedAddress = YOUR-SERVER-IP:GAME-PORT if you want the website to display the address players use to join Valheim. This display-only field does not configure the website listener; the game and website ports are usually different. Neither your public IP nor a panel hostname is discovered automatically. Restart after changing these settings.

Public viewing is enabled by RequireViewerToken = false; existing configurations are preserved on upgrade. For personal login and OpenRouter key submission over the internet, use an HTTPS reverse proxy so credentials are encrypted in transit.

Missing players or stale map positions

A congested game connection can delay player snapshots, exploration and portraits even while the website itself opens normally. Upgrade the host and every Sagas client to 0.3.9 or later and restart their connections. A server name comes from host configuration, so a wrong name is a separate issue from delayed player uploads. If all website data is blank, check the website/API error and server logs too.

For a live marker, the player needs Sagas installed, [Privacy] SharePosition = true, and Visible to other players enabled on Valheim's in-game map. The website's Online Vikings layer must be enabled and its player selection must include that player. Offline positions require the separate Offline - last known layer. Terrain additionally requires ShareMap = true. Upload pacing cannot override these privacy settings.

Multiplayer upload pacing (0.3.9 and later)

Upgrade both the host and every participating client to the same current release, then restart their Valheim processes. Version 0.3.9 addresses a reported three-second multiplayer stall with Steam k_EResultLimitExceeded log spam: background transfers now yield to the game send queue, use separate byte allowances and wait 30 seconds before retrying unacknowledged data. Older clients still send bursts, so updating only the host is insufficient.

Maps import gradually and a first high-resolution portrait can take several minutes on a busy connection. Existing saved portraits remain visible while a replacement uploads. The collector logs Sagas uploads paused when the game queue is busy and Sagas slow stage for work exceeding 50 ms, with repeated warnings limited to once per minute. These diagnostics contain timings/queue sizes, not credentials or coordinates. The multiplayer incident still requires an operator retest; automated transport checks are not in-game verification.

Find a Viking

Vikings always opens a search directory, including when you are signed in. Three featured shared profiles appear below the search, ordered by furthest recorded boss progression and then most recent retained boss victory. Search by name to find more Vikings. Cards lead with a saved head portrait (initials when unavailable), name and the same online/syncing/offline badge used on World and character pages. Their saved saga or biography excerpt is the main body, labelled AI fiction; no story is invented when none exists. The supporting boss tracker shows actual distinct recorded victories as 0/1 or 1/1 per boss and a total out of eight, without assuming earlier bosses were defeated. Direct character links still open that character, and the header search also includes avatar previews. Private profiles are excluded. Recommendations use lifetime progression independently of World statistics filters; pruned achievements cannot supply a recent date.

The boss leaderboard includes Kall Fimbulbringer as the eighth progression tier. Only the installed FrozenKing_p3 final phase counts as his victory; the earlier FrozenKing and FrozenKing_p2 phases are excluded from boss leaderboards and progression. His listed team contains recorded final-phase contributors, not inferred earlier-phase participants. Current telemetry cannot time the entire multi-phase encounter, so Kall is excluded from fastest-fight rankings. Retained old final-phase records are backfilled into permanent progression receipts on upgrade. His victory retains the Deep North scenery.

Map controls and configuration ownership

The full-width atlas opens with its controls tucked away. Use Terrain, Vikings, Activity or Icons to open one compact tray; close it to return to the whole map. Opening a tray preserves your map position and zoom. Statistics & heat maps, below the map, filters event totals, recent activity and heat layers by Viking and date. It does not filter live player positions or icon ownership. Explored terrain is independent unless you explicitly link it to statistics in the Terrain tray.

In Shudnal ConfigurationManager, S marks host-owned [Server] and [Lore] settings; C marks personal privacy and website-login shortcuts. Host settings are read-only while connected to somebody else's server. They show this computer's local hosting configuration, not the remote host's values. The actual host reads its own config; credentials, tokens and paths are never sent to clients. Configure hosting at the main menu or on the host itself, and restart the hosted world after changes. Ownership descriptions remain available without the optional manager. Personal Saga Profiles are configured through website login, separately from the host's Lore settings.

Both [Server] RetentionDays and StatisticsRetentionDays default to 0 (unlimited history). Existing saved values are preserved on upgrade. To remove a previously configured seven-day limit, explicitly change both values to 0 on the host. This preserves remaining records; it cannot restore already-pruned history.

Privacy and personal login

[Server] RequireViewerToken = false is the public-viewing default. Set it to true to require the shared ViewerToken for viewing. Public viewers still only receive data permitted by each player's sharing settings.

Portraits update after equipment or appearance changes settle, with a two-second debounce and a ten-second minimum capture cooldown. Unchanged appearances do not trigger periodic captures. Sitting or attached poses defer a new capture until you stand and settle; the last shared portrait remains visible. Preparation spans multiple frames, GPU readback is asynchronous, and image processing runs in the background. Portraits require a client graphics device supporting asynchronous readback; dedicated servers receive the images from clients. Initial host storage/website startup runs in the background. Map pixels arrive through bounded asynchronous strips, and uncached item icons are queued one per frame; the website and artwork may take slightly longer to become ready. The Sagas staged portrait log reports the maximum main-thread capture work in a frame. Actual rendering still runs on the game thread, so playtesting is required to measure the remaining frame cost.

The atlas has separate Discovered game icons (on) and Player-added icons (off) layers. Game locations, boss markers, beds and death/event markers come from each client's existing map, only on personally explored, shared terrain. They do not reveal undiscovered locations. Enable [Privacy] SharePlayerPins = true in your own Sagas config to publish your manually placed pins; this is off by default and also requires ShareMap. Shared personal pins render above fog, including annotations placed on unexplored ground. Automatic game/mod locations remain exploration-gated. Imported pins owned by another Viking are excluded. The browser's player-icon switch controls display, not sharing consent. Hover/tap an icon for its name, or use Browse visible icons to locate one.

Enable Color by Viking to match player-added pin rings, Viking markers and names. Automatic game icons retain their original colors. Each Viking gets a server-assigned color on first observation in that world, retained through renames, reconnects and restarts. New colors are selected randomly among the most perceptually separated available choices; existing Vikings never change color when someone joins. Large rosters inevitably have closer colors, so names and filters remain available. Shared game locations list their sharing Vikings in the tooltip without adding owner-colored rings. Icons by Viking toggles each person's icons independently of terrain, heat maps and live-position filters, with Show all/Hide all shortcuts. Preferences are saved per browser/world. Game icons are enlarged from 28 to 36 CSS pixels.

Mods using Valheim's regular map pins and runtime sprites are supported, including inspected Epic Loot bounty/treasure pin types. Unknown saved custom pins conservatively require personal-pin consent. Custom texture overlays (such as Jotunn map drawings) are not individual pins and need a dedicated adapter; SLS zones retain their existing integration. No Epic Loot/Jotunn dependency is added.

Icons load separately from terrain and statistics; their runtime sprites are cached, never bundled as copied game assets. Scans examine at most 16 pins per frame, bounded to 2,048 exported pins per character. Changed snapshots upload in paced 32-pin batches; unchanged snapshots only resync every two minutes for recovery. First icons may take 15-30 seconds plus queued upload time to appear, and partially imported terrain can keep automatic locations fog-hidden longer. Pin edits/removals replace the prior set only after every part arrives. The last shared pins remain available offline.

Choose Sun & moon dial, Horizon, or None in the Icons map tray. The readout estimates real minutes/seconds until day or night using the host's world time, day length and time scale. It updates each second without reloading terrain, resyncs with the host, and reports pauses, time skips and overdue updates instead of continuing a misleading countdown. Browser preferences are saved locally; unavailable/stale clock data is labelled. No new mod dependency, external service or port is required. Install the matching update on the host and participating clients.

Map sharing defaults on for new configurations. Profile, portrait and position sharing remain configurable. Live position also follows Valheim's Visible to other players map setting. The atlas only receives permitted exploration; fog is not a client-side substitute for access control.

The header shows Login when signed out. After login, it shows your saved Viking portrait (or an initial when no portrait is available). Click the icon for Saga Settings or Log out. Shared server tokens show a read-only account; Saga Settings explains how to switch to a personal login.

While playing, press Left Ctrl + Insert to copy a personal login token, then paste it into the website's Login dialog. This replaces the previous token for that character/world. Left Ctrl + End revokes it. A personal login enables owner-only scenery and storyteller settings; the shared viewer token does not grant ownership. Tokens are stored in the browser tab session and sent in Authorization headers, never in profile URLs.

Scenery progression follows recorded credit: Meadows initially; Eikthyr unlocks Black Forest, Elder unlocks Swamp, Bonemass unlocks Mountains, Moder unlocks Plains, Yagluth unlocks Mistlands, Queen unlocks Ashlands, and Fader unlocks Deep North. Tracking cannot reconstruct unrecorded boss kills from before installation.

Optional SLS, Epic Loot and Jewelcrafting

None of these mods is required. Without them, statistics, vanilla gear/tooltips, portraits, maps, leaderboards and sagas continue to work. SLS, Epic Loot and Jewelcrafting are independently detected; installing one does not require the others.

When SLS is installed on the host, the atlas mirrors its enabled zone overlay, resolved level palette and above/below-fog setting. Website outlines are capped at 20% opacity (lower host values are preserved), applied once so overlapping borders do not become darker. The website adds a zone-level tooltip only above level 1. Below-fog outlines and tooltips follow the selected shared exploration; above-fog mode reveals the zone grid without revealing terrain. Host zone settings refresh about every 15 seconds. The website also offers a local SLS-layer visibility toggle.

With the SLS Nemesis system enabled, a received score appears on the Viking's portrait and map tooltip. It is the latest host-observed replicated score, not a lifetime total; missing scores remain unknown. Profile privacy still applies. Nemesis boss defeats have separate filtered player metrics and a team-credit leaderboard, and can inform saga evidence. Repeated death reports count once. These encounters do not unlock ordinary boss progression/scenery or enter normal boss-speed rankings. Older events lacking the Nemesis flag cannot safely be backfilled.

Epic Loot independently enhances rarity colors, gear effects, bounty tracking and loot presentation. It is never required for SLS features or basic website operation. See integration details.

Jewelcrafting (Smoothbrain) adds a separate socket section to equipment and hotbar tooltips: filled/empty slots, gem names, cached runtime gem icons and configured effect power ranges. Sagas also reads equipped extra ring/necklace slots and the mod's upgradeable jewelry armor. Socketed gear inherits Jewelcrafting's item color; an Epic Loot rarity color takes precedence when both are present, while both sets of metadata remain visible. Last-known socket information and icons remain available offline under profile-sharing permissions.

Recorded socketed drops/collections and their map details retain gem names; generated sagas may use those recorded facts. Sagas loot notifications are always enabled for earned enchanted/socketed pickups, with duplicate protection and rate limits. Jewelcrafting's special creature equipment spawns use the same actual-drop provenance and deduplication path as other loot. Loose gems in ordinary creature drops are tracked by their game names; gem bags, fusion-box inventories, socket crafting/destruction history and synergy totals are not exported. Socket count is not invented as an Epic Loot rarity or added to its rarity rankings.

Inspected against Jewelcrafting 2.0.10. Its public gem API exposes configured power ranges, not the seeded roll or effective combined total; tooltips label that distinction. No new effective-stat arithmetic is inferred. No Jewelcrafting DLL/assets are bundled and the website/Core never load it. Either mod, both mods, or neither may be used. Real in-game validation with this mod is still required; see integration details.

Enable sagas

On the host, set [Lore] OpenRouterKey or the host process's OPENROUTER_API_KEY environment variable. EnableOpenRouter must be true. An OpenRouter account/key is required, even for free routing; Sagas never accesses an existing browser account automatically.

The host default is openrouter/free, with AllowPaidModels = false, a 20-attempt daily budget and no paid fallback. Without a host key, stats, maps, portraits and leaderboards work normally; saga prose waits. Old template chapters are hidden and preserved locally rather than displayed as generated stories.

Host-funded models and OpenRouter presets

In 0.3.10 or later, the host can pay for everyone's default Viking sagas and the server saga using one OpenRouter key. Configure the host's [Lore] section, then restart:

[Lore]
EnableOpenRouter = true
OpenRouterKey = YOUR_OPENROUTER_KEY
Model = @preset/your-saga-preset
AllowPaidModels = true
DailyBudget = 20

Create the preset in the OpenRouter account that owns the key. Manage model selection, provider routing and price limits in that OpenRouter preset. Sagas does not send a provider/pricing override for paid host requests. There is no second host price ceiling to configure in Sagas. If the preset has no price restriction, Sagas does not add one. A direct model ID also works (for example deepseek/deepseek-v4-flash-0731); its normal OpenRouter/account pricing applies.

DailyBudget limits HTTP attempts per UTC day, including retries, shared across host-funded Viking and server sagas. It is a request count, not a dollar budget. Set monetary controls in OpenRouter. Sagas still controls the factual narrative prompt, structured output request, maximum output length and disabled tools/plugins; a preset does not replace those application requirements. Existing chapters remain cached and are not rewritten when the model changes.

New installations keep Model = openrouter/free and AllowPaidModels = false. With paid routing disabled, Sagas rejects paid direct models and imposes zero token-price limits on presets. Players can keep Host default without adding their own keys; personal paid overrides retain their separate personal key and explicit limits.

After signing in, click your profile icon -> Saga Settings. Choose Server storyteller to use the host's setup, or My own storyteller to enter your own OpenRouter key and model/preset. Create up to eight Saga Profiles, each with its own saved OpenRouter key and model/preset. Select a profile and save to switch both together. Request limits and profile/key removal are under Advanced options. A preset can select a model or an OpenRouter @preset/name. Paid routing requires the player's explicit checkbox, a per-million-token price ceiling and a daily attempt limit. The host key must still be configured. Personal keys are encrypted on the host and never returned to viewers, but the host administrator controls that machine: only entrust a key to a host you trust. HTTPS is required for remote browser key submission. Host-paid routing is described above.

Story prompts use relevant recorded events, career totals, bosses and credited teammates, notable loot, current equipment/effects, resistances, bounties and shared exploration summaries. Context is bounded and respects sharing consent; it does not transmit raw account/world IDs, precise coordinates or API keys as story content. Fiction is labeled separately from facts. See lore details.

Data and release status

Back up BepInEx/config/ValheimSagas with the host stopped, including sagas.db and personal-lore.key if present. The key file is required to decrypt saved personal OpenRouter credentials. Do not share backups, configs or tokens publicly. Uninstalling the plugin does not delete recorded history.

0.3.26 is a preview release verified with automated checks. It includes performance fixes for SLS/gear snapshots and staged, change-triggered portrait capture with asynchronous GPU readback and background image processing; fresh local and dedicated-server playtests must confirm frame-time improvements. Automated tests use labeled synthetic fixtures; real credentialed OpenRouter generation, two-client multiplayer acceptance and Linux hosting still require testing. Unresolved attackers and uncertain loot provenance stay unattributed rather than being guessed. Fight durations are observed telemetry, and carried gold is a snapshot, not a lifetime earnings counter.

License

Valheim Sagas is released under the MIT License, copyright 2026 Pendulumgames and Valheim Sagas contributors. The license is included in every distribution.

Third-party dependencies retain their own copyrights and license terms; see third-party notices. The Sagas license does not grant rights to Valheim assets or other third-party content shown in runtime captures or screenshots. Valheim belongs to Iron Gate AB. This is an independent community mod.

Appearance: On a Viking page, open Appearance to choose Boxed, Full Screen, or Full Screen Scroll for your own browser. When viewing your own Viking while logged in, the same popover lets you save unlocked scenery visible to everyone.

Open Sagas inside Valheim

Press Ctrl+Home while playing to open the website in the Steam overlay. Enable Steam Overlay for Valheim and launch the game through Steam (including Gale's usual Steam launch). Change or disable Website Login / OpenWebsite in F1. This uses Steam's browser; it does not embed a new browser or pause multiplayer. Close the overlay with your Steam overlay shortcut (normally Shift+Tab).

Local hosts automatically use their ListenPrefix address/port (wildcard HTTP bindings become loopback for this shortcut). For dedicated servers, set Server / WebsiteUrl to the reachable website address, such as http://example.com:19908/ or your HTTPS reverse-proxy URL. Keep ListenPrefix = http://*:19908/ for a wildcard listener when appropriate; the public URL setting does not change binding or open ports. AdvertisedAddress is the displayed game-server address and is not assumed to be the web address. A player may set Website Login / WebsiteUrlOverride instead. Use a plain HTTP(S) address without credentials, query or fragment. The host sends only that public URL, on an authenticated, rate-limited hotkey request. No background URL polling.

Website login is separate in Steam's browser: use the Login button, and Ctrl+Insert to copy your personal login when needed. The shortcut never includes a viewer token or key in the URL and does not automatically log you in. If Steam Overlay is unavailable, Sagas displays an explanation; your ordinary browser remains available. Actual overlay operation needs an in-game test on your installation.

Map locations and page layout

The atlas leads the World page, followed by Online Vikings and event statistics; Recorded Vikings is at the bottom. Nearby visible map icons become a numbered cluster. Click/tap a cluster to browse its locations, then choose a pin to center its exact coordinates, marked with a crosshair. Zooming separates pins where space permits; coincident pins stay accessible through the picker. The Icons tray's Browse visible icons also supports keyboard selection. Clusters respect the existing discovery, personal-sharing, owner and layer filters. Clustering runs in the browser over the separate cached icon feed; it adds no game capture or network traffic.

Map icons and optional-mod statistics

Click a nearby-pin group to spread up to 12 icons and browse its locations. Double-click it, or use Zoom into group, to zoom closer. Zoom stops at 20 m on the scale bar. Close pins fan out around 40 m when space permits and gather again around 50 m when zooming out; fine lines connect them to their real coordinates. Zoom out to gather them again. Larger or crowded groups keep a scrollable picker. Selecting an individual location briefly highlights its true position, then fades. Game icons retain their original colors; Color by Viking applies only to personal pins and Viking markers.

Statistics use the latest shared profiles to detect Epic Loot and Jewelcrafting, including offline snapshots. Epic Loot adds rarity discoveries and bounty completions. Jewelcrafting adds equipped gems and total equipped socket capacity, including empty sockets. These loadout counts are independent of the time filter, exclude hotbar duplicates and containers, and do not measure combat power. SLS Nemesis statistics follow the host's installed/enabled integration. No optional mod is required.

On first launch after this update, the original Ctrl+F8/F9/F10 defaults migrate to Ctrl+Insert/End/Home respectively; custom shortcuts are preserved. You can change them again in F1. Loot notifications no longer have a configuration toggle.

CHANGELOG

0.3.36 - A story told through places

Update the complete host package, including web, and matching clients. Exact version matching is enabled by default. Preserve configuration and data, restart, and refresh browser tabs.

  • New Viking and server sagas generate up to six connected story scenes in the same request as the biography. Each scene carries its own title, passage and validated evidence references; the full chapter consists of those passages. Target three to six scenes, fewer for sparse evidence.
  • Selecting or replaying a scene changes the story passage and recorded biome/boss artwork. Rounded marker frames echo the story panel; boss-kill scenes have larger, double-bordered major markers. Chapter buttons identify the Viking or server.
  • All map locations and boss status come from server records. Unavailable/private scene evidence hides the scene and breaks the trail. The AI never supplies coordinates. Existing chapters remain unchanged: no conversion, regeneration or additional provider calls.
  • Generation remains queued and cached, with existing credentials and routing controls. Output allowance rises from 1,000 to 2,000 tokens for the structured story; paid opt-in and OpenRouter preset/account pricing behavior stay unchanged. Invalid scene output is rejected; a valid text-only response can remain readable without scene fabrication.
  • Add a working saga screenshot at the top of both release READMEs. Its example story/events are labeled. No test database, seeded saga, game assets or development host ships.

0.3.34

Install the complete package, including web, on the host and use matching client/server versions. Preserve configuration and data, restart, and refresh browser tabs.

  • Replace numbered boss cards with eight original transparent illustrations, layered ornamental SVG frames and static, weighted mist over unrevealed silhouettes. Kall uses a symbolic frozen monument, preserving his appearance as a mystery. No game assets are bundled.
  • Reveal a trophy when a shared victory becomes known, with a brief transition that respects reduced-motion settings. Ordinary refreshes do not replay it.
  • Keep trophy unlocks independent of the selected period, using permanent known-boss receipts plus retained shared victory evidence. Private profiles do not unlock public trophies.
  • Add highest-star encounter records with their own team/date/duration. Ties prefer the shortest valid duration at the highest star tier; absent durations stay absent. Overall fastest fights remain separate. Kall phase-only timing stays excluded.
  • Reorganize Viking comparisons into distinct portrait columns, centered measure labels, larger values and responsive layouts.
  • Bundle eight alpha-preserving 1024x1536 WebP illustrations (about 5.2 MiB total), served locally with lazy loading. No CDN, API key, runtime capture or new dependency is required.
  • Animated saga journeys and dedicated chapter pages remain planned; existing recorded chapter map links are unchanged in this release.

0.3.35 - Follow the saga

  • Curate each journey to six meaningful highlights, favoring boss encounters, rare discoveries and biome variety over repetitive records. Preserve privacy and journey breaks through omitted moments. Separate crowded markers with location spokes, move playback above navigation, and fit the chapter into the clear map area. Moment artwork follows its recorded biome and boss, clearing boss art when moving on.

  • Journey connections now form gentle, zoom-stable curves; the replay arrow follows their tangent. Curves remain clipped to explored terrain and preserve recorded endpoints and breaks.

  • Sagas toolbar selection follows the open tray rather than remaining highlighted when its layer is enabled.

  • New independent Sagas atlas layer with chapter markers, an ornate framed story panel, original local boss/biome imagery, chronological recorded moments and a full chapter journey page. Open a chapter from the map or either Viking/server saga.

  • Gold journey replay supports play/pause, restart, scrubbing, speed selection, a participant perspective and optional camera following. Manual panning releases camera following. Replay pauses offscreen or in a hidden tab; reduced motion removes the moving arrow.

  • Animation uses its own transparent canvas, not a terrain redraw on every frame. The separate chapter index is lazy, paged and capped; each journey contains up to six curated highlights from retained shared locations.

  • Privacy is enforced in the server endpoints and stale browser responses are discarded. Different Vikings, hidden/missing event gaps, intervals over 30 minutes and jumps over 1,200 metres break connections. Connections indicate recorded event order, not a tracked walking path. Imagery and story excerpts remain distinguishable from event evidence; no new provider calls are required.

  • Install the complete matching package on clients and server, including the new journey.js and journey.css website files. Refresh open website tabs. This release does not change gameplay capture hooks or require any optional loot/zone mod.

0.3.33

Install the whole package on the host, including web, then restart and reload browser tabs. Keep configuration/data. Server and clients must match because version enforcement remains enabled by default. Updating only DLLs can leave the old slow website renderer running.

  • Preserve the existing scalable atlas renderer; load world/presence/terrain independently of historical statistics. Show individual feed status and keep last-known terrain during transient failures.
  • Add server/website version and JavaScript-integrity checks, a browser mismatch banner and one host startup warning for stale/mixed web files.
  • Reuse bounded cached retained history with incremental new events, exact period counts, retention invalidation and fresh sharing checks. Bound event coordinate checks to displayed events and reuse discovery masks.
  • Add a World adventure recap, per-browser/world visit bookmark, new chapter links and notable recorded moments.
  • Add Trophy hall and Compare Vikings views inside the Hall of Renown, using its existing time filters. Show recorded first teams and eligible fastest times without inventing solo credit or incomplete fight durations.
  • Link saga chapters to shared, explored recorded event locations. Narrative prose never determines coordinates.
  • Guard delayed statistics/profile responses against overwriting newer presence or reviving revoked profile data; bound overlapping detail requests.
  • Moments integration investigated and planned, not shipped: a capture-time identity/consent export interface is required in Moments. No new captures or mandatory mod dependencies. Host diagnostics downloads, epithets and Steam achievements are excluded.

0.3.32

Upgrade warning: Update the server and every joining client to the same Sagas version, then restart. RequireMatchingVersion now defaults to true; missing or mismatched clients cannot join. Clients without the new handshake may only see Valheim's generic incompatible-version error—check the server log for the Sagas requirement. A host can explicitly set RequireMatchingVersion = false to permit mixed/missing clients, with potentially incomplete telemetry.

Website setup change: New dedicated-server configs with a blank ListenPrefix listen on all interfaces using WebsitePort; public viewing remains the default. Existing saved listener overrides and privacy choices are preserved. Clear an old ListenPrefix only when intentionally switching to the new port-based setup. Sagas does not open firewall/panel ports. Relay/crossplay joins may still need an explicit WebsiteUrl.

  • Give future Viking and server sagas a stronger narrative arc, selective memorable moments and fewer loot/stat lists. Remove the repeated "Fictional embellishment:" prefix, including on existing chapter displays; saved stories and recorded evidence remain intact, with no automatic regeneration or extra API requests.
  • Require an exact Sagas version match before joining by default; hosts can disable RequireMatchingVersion. Missing/mismatched versions are rejected before world admission, with named version errors where the client supports them.
  • Fix Shudnal ConfigurationManager S/C labels: draw ownership indicators at the row entry point, before its unsynchronized-setting visibility filter. Keep host settings locked and secrets unsynchronized.
  • Add WebsitePort for simplified dedicated setup. A blank advanced ListenPrefix binds all interfaces for dedicated servers and loopback for local hosting; existing overrides remain unchanged.
  • Resolve Ctrl+Home using an explicit WebsiteUrl first, then an advertised host or direct-IP connection plus the web port. Relay/join-code connections without a routable host receive clear custom-URL guidance; no external IP-discovery service is used.
  • Log effective website port, listener readiness, private/public mode and override/loopback setup issues. Hotkey failures distinguish disabled, starting, failed and invalid-URL cases.
  • Automated checks do not replace the dedicated version-handshake/crossplay and in-game F1 verification listed in IN-GAME-TESTS.md.

0.3.31

  • Default personal map-pin sharing on for new configurations; preserve existing saved choices and the independent browser layer toggle.
  • Clarify public/private website settings, optional shared viewer credentials, dedicated wildcard binding, and the OpenRouter daily request-count limit. No configuration keys are renamed or removed.

0.3.30

  • Fix severe website map stalls when zoomed out over large explored worlds. Terrain now uses cached overview chunks with bounded, on-demand close-up detail instead of repeatedly decoding thousands of individual tiles.
  • Stream exploration in small incremental pages; unchanged terrain is no longer downloaded every five seconds. Existing map records are indexed gradually, without changing worlds or character saves.
  • Preserve exact exploration checks for icons and events. Overview fog is conservative at partially explored edges; detailed terrain restores precise edges as it loads. Sharing changes reset cached map data.
  • Coalesce drag/wheel redraws, reuse SLS paths and fog masks, and cache heat-map gradients and event grouping. Keep pin clustering, player colors, separate layers and existing zoom limits.
  • Synthetic full-world benchmark (76,648 tiles): 1,000 markers improved from roughly 43 seconds per redraw to a 5.5 ms median. With 40,000 SLS squares and 5,000 events, median 9.1 ms / maximum 24.8 ms in the measured run. These are headless-browser timings, not dedicated-server or in-game acceptance.
  • Update the host's plugin and refresh open website/Steam-overlay tabs to load the matching website and API. No configuration changes are required.

0.3.29

  • Fix Sagas loot-tracking metadata preventing InventorySlots from stacking otherwise identical items. New provenance stays on the ground item's network object and is not copied into inventories or player redrops.
  • Automatically remove only obsolete sagas.origin / sagas.source tags as inventories load and items enter inventory checks. Preserve all other item metadata, including enchantments, sockets, quality, and large-stack data. Existing ground items migrate their provenance when loaded by their owner; no offline save editing is required.
  • Keep server-side loot deduplication and quantity limits. Ground stacks with uncertain mixed provenance remain ordinary pickups instead of inflating earned loot.
  • Includes 0.3.28 concurrent browser logins and compressed map uploads. Update the server and all Sagas clients together, then restart. In-game multiplayer stacking validation is still required.

0.3.28

  • Allow up to32 concurrent personal login credentials per character/world. Issuing a code no longer invalidates another browser; Ctrl+End explicitly revokes all. Server stores hashes only.
  • Remember browser logins across tabs/restarts, synchronize same-browser tabs, and recover from rejected tokens: public viewing retries anonymously; private viewing returns to login. Chrome and Steam still require separate initial sign-ins.
  • Losslessly compress upload payloads on a worker before bounded V4 fragmentation. Bound decompression output; retain global pacing, per-lane byte allowances and gameplay pressure gates. Requires server and clients updated together.
  • Run bounded map capture independently from the three-second profile tick, alternate nearby/history scans, and limit unchanged partial-tile work to prevent one edge tile blocking history import.

0.3.27

  • Fix dedicated-server identity resolution using the ready peer's owned Player ZDO; reject mismatched ownership, non-player objects and conflicting IDs. Apply consistently to logins, telemetry, presence and Nemesis lookup.
  • Return explicit personal-login identity/service/storage errors and log credential-free shortcut notices. Dedicated login persistence runs off the game thread. Website URL requests no longer depend on player metadata.
  • Guard the not-yet-created world during client startup without repeated exceptions.
  • Send telemetry in bounded, interleaved fragments instead of large RPC bursts; keep global pacing, per-lane budgets, durable event acknowledgments and privacy cancellation. Bound assembly size, lifetime, concurrency and receive rate.
  • Distinguish Steam pending data from ordinary acknowledgment backlog; retain strict pending/delay/total gates and conservative non-Steam fallback. Report actual queue details and recovery.
  • Requires 0.3.27 on server and clients. No configuration migration required. Dedicated multiplayer performance is pending real playtest.

Changelog

0.3.26

  • Refresh the README atlas image with the day/night dial and real-time countdown visible (labeled example clock on recorded offline playtest data).

  • Cap atlas zoom at 20 m on the 100-pixel scale bar across wheel, buttons, keyboard and cluster zoom.

  • Spread nearby pins around 40 m and gather them at 50 m, with separate thresholds to avoid flickering. Manual cluster opening, exact-position lines and close-pin selection remain available.

0.3.25

  • Move default shortcuts away from Moments and Valheim function keys: Ctrl+Home opens the Steam website, Ctrl+Insert copies a personal login, Ctrl+End revokes it. One-time migration changes only the old default combinations; custom bindings are preserved.
  • Remove EnableLootNotifications. Earned enchanted/socketed pickup notices are always enabled, retaining provenance checks, deduplication, freshness and rate limits.
  • Show Epic Loot rarity/bounty panels only for shared profiles reporting Epic Loot; add Jewelcrafting equipped-gem and socket-capacity rankings and overview/profile highlights. These use latest loadouts, exclude hotbar duplicates and containers, and are not combat-power scores. SLS Nemesis panels remain host-capability gated.
  • Replace persistent pin crosshairs with a fading location halo. Small groups fan out with exact-position leader lines, double-click/zoom controls, automatic high-zoom separation and animated gathering on zoom-out. Neighboring icons reserve space; dense groups retain an accessible scrollable picker. Reduced-motion preference respected.
  • Cache the map background during brief pin animations; no extra game capture or network polling. Refresh the README atlas screenshot from an isolated playtest copy with colored personal pins and a fanned group.

0.3.24

  • Optional Smoothbrain Jewelcrafting support: socketed gear/hotbar tooltips, gem icons and configured power ranges, extra equipped ring/necklace slots, jewelry armor, item colors and portrait change detection. No hard mod dependency.
  • Preserve socket metadata in actual drop/collection records, map inspection, offline snapshots and saga evidence. Special creature equipment spawns use existing provenance/deduplication; opt-in Sagas notifications include earned socketed pickups.
  • Keep Epic Loot rarity/effects alongside Jewelcrafting sockets. Configured ranges are not reported as rolled/effective totals; gem-bag/fusion-box contents are excluded.
  • Installed 2.0.10 API inspection, synthetic present/absent adapter tests, persistence/media/privacy checks and desktop/mobile browser coverage. Real gameplay verification remains pending.

0.3.23

  • Configurable Ctrl+F10 Steam overlay website shortcut, local listener fallback, dedicated host public URL and personal override. Explicit authenticated/rate-limited URL request; credentials never sent in URLs. Steam browser login remains separate.
  • Move Online Vikings below the atlas and Recorded Vikings to the bottom of World.
  • Cluster crowded visible map pins with count badges, a scrollable location picker and an exact-position crosshair. Preserves discovery, ownership and personal pin consent; no extra telemetry.
  • Installed Steamworks API inspection, URL validation checks and synthetic desktop/mobile map regression coverage. Actual in-game Steam overlay and dedicated-host URL exchange still require playtesting.

0.3.22

  • Fix duplicated portraits in Online Vikings and Recorded Vikings after the directory update.
  • Share one online/syncing/offline badge across World rosters, search cards and character profiles. Fix status disappearing when revisiting the same Viking through search by clearing the cached markup consistently.
  • Reorganize search cards around the character and an excerpt from their saved saga/biography, clearly labelled AI fiction. Show an honest empty state when no generated saga exists.
  • Add an eight-boss checklist and completion total from authoritative lifetime receipts; skipped bosses remain 0/1. No additional generation requests or polling endpoints.

0.3.21

  • Keep automatic game icons in their original colors. Color by Viking applies to personal pins, Viking markers and names.
  • Make Vikings a search directory for everyone, with three featured profiles ranked by recorded progression and recent boss victories. Add saved head portraits, achievement/presence cards, keyboard navigation and avatar previews in header search.
  • Add Kall Fimbulbringer to boss progression and leaderboards using the installed final-phase prefab. Exclude early phases from boss wins; omit phase-only times from fastest full-fight rankings. Backfill retained final-phase progression on upgrade and keep the Deep North backdrop after victory.

0.3.20

  • Make the atlas full width with compact Terrain, Vikings, Activity and Icons trays; retain map position/zoom while changing options, with keyboard close and mobile layouts.
  • Replace ambiguous adventure filters with an explicit Statistics & heat maps drawer and active scope summary. Terrain, live positions and icon ownership remain independent.
  • Label host-owned and personal settings in Shudnal ConfigurationManager. Lock local hosting controls during remote sessions; never synchronize host secrets. No new required mod or network feed.
  • Confirm both history-retention defaults are zero/unlimited; preserve existing configured retention values and document how to change them.

0.3.19

  • Increase game map icons from 28 to 36px; add optional matching Viking colors for pin rings, player markers and names, plus independent per-Viking icon checkboxes. Store world-specific server-owned colors once and choose separated new colors without recoloring existing players. Preserve all sharers on deduplicated game locations.
  • Shared personal annotations now appear above fog, including undiscovered coordinates, only with ShareMap and SharePlayerPins consent. Automatic game/mod locations remain personally exploration-gated.
  • Include sprite-backed custom Minimap pin types, including inspected Epic Loot bounty/treasure pins. Unknown saved custom pins require personal consent; separate drawing overlays need adapters.
  • Replace static phase text with real-time estimates until day/night, honoring host day length/time scale and showing paused, skipping or overdue states. One-second browser countdown does not reload the map.

0.3.18

  • Add separately loaded discovered game pins and opt-in personal map pins, runtime game sprites, browser layer toggles and hover/tap/keyboard-list inspection. Enforce owner sharing and personal fog on the server; exclude copied cartography pins. Preserve offline pins, deduplicate shared game locations, atomically replace multipart snapshots and retry lost acknowledgements.
  • Bound pin scanning to 16 entries per frame, encode snapshots off-thread, share existing upload budgets and capture at most one item/map icon per frame across both queues. No proprietary map artwork is bundled.
  • Add two original host-synchronized daylight graphics (sun/moon dial and horizon) and None, with persistent per-browser preferences and stale/unavailable states.
  • New automated privacy, persistence, multipart, HTTP, API and browser checks. Real in-game pins, icon appearance and frame-time impact still require playtesting.

0.3.17

  • Reduce website SLS zone outlines to at most 20% opacity, respecting lower host values. Composite the layer once so shared/overlapping boundaries do not become darker; preserve level colors, hover/tap details and fog rules. In-game SLS settings are unchanged.
  • Resolve initial SLS and Epic Loot metadata inside each registered plugin assembly instead of searching all loaded assemblies. Add limited world/equipment startup phase logs to distinguish remaining initialization costs; real startup timing gains still require a fresh playtest.

0.3.16

  • Construct host storage and website services on a worker. Keep local telemetry pending until adoption; retire abandoned startup and drain active storage off-thread before reopening the database.
  • Read the coherent world atlas asynchronously in bounded strips, avoiding the full-image synchronous GPU readback and 64 MB main-thread copy. Export only complete, personally fog-masked tiles; pending capture never publishes temporary fallback tiles. Preserve explicit degraded terrain fallback on unsupported/failed readback.
  • Queue uncached item icons and render at most one per frame, outside equipment snapshots and active portrait/map preparation. Equipment can arrive before its icons.
  • Log atlas setup/readback, icon batch maximum, outbox startup and per-phase portrait costs. Startup timing improvements still need a fresh game session; individual Unity render calls remain on the main thread.

0.3.15

  • Spread portrait preparation, bone copying, equipment effects and visibility/framing passes across frames. Freeze the character pose before preparation; retain native skinned rendering and weapon effects.
  • Replace synchronous portrait pixel readback with bounded asynchronous GPU requests. Copy callback data into detached arrays, then reconstruct transparency and encode PNGs in the background. Keep GPU resources alive until callbacks finish, including cancellation and partial submission failures. Unsupported graphics devices retain the saved portrait instead of falling back to blocking readback.
  • Capture only after appearance changes settle: two-second debounce and ten-second minimum cooldown, with no periodic refresh. Defer seated/attached poses until standing and settled; keep the last shared portrait during deferred capture and upload. Profile privacy revocation still removes access.
  • Add per-frame capture-work timing. Automated checks cover scheduling, resource lifetime, pixels, persistence and installed APIs; real GPU appearance and frame-time improvements require a playtest. Individual Unity render operations still execute on the main thread.

0.3.14

  • Refresh portraits after settled equipment/cosmetic changes, with a two-second debounce, ten-second capture cooldown and ten-minute safety refresh instead of rebuilding every minute. Failed captures retry no faster than once per minute.
  • Move final-resolution transparency reconstruction, size-limit fallback, PNG encoding and hashing to a single background job using detached pixel arrays and Unity's thread-safe array encoder. Keep rendering/readback synchronous on the game thread; no async GPU readback or multi-frame render preparation.
  • Retain the last good portrait during processing; reject outdated results after appearance, character, world or consent changes. Preserve normal 1024x1536 output and body visibility checks.
  • Log preparation, visibility/framing, final render/readback and background processing timings separately. In-game appearance, orientation and frame-time confirmation remain required.

0.3.13

  • Address periodic game-thread stalls: cache Epic Loot and SLS reflection metadata instead of repeatedly searching assemblies and members. Runtime item effects, rarity colors and settings are still read fresh.
  • Capture SLS zones incrementally (up to 128 zones per frame with a 2 ms target), publishing only complete detached snapshots. Run snapshot validation/copying on a bounded background task; Unity/mod reads stay on the main thread.
  • Add separate portrait timing warnings to distinguish occasional image capture from equipment work. Preserve upload backpressure and pacing.
  • This is a performance fix candidate; a new in-game and dedicated-server playtest is still required.

0.3.12

  • Group page layout and owner-only Viking scenery in a compact Appearance popover, with clear personal-view versus public-profile labels. Keep the small trigger beside profile tabs on mobile and use a clean scenery selector with a compact save action.
  • Replace saved setups with Saga Profiles, each containing its own encrypted OpenRouter key and model/preset. Switching profiles switches credentials; deleting a profile removes its credential.
  • Keep paid opt-in, request limits, HTTPS key submission and server storyteller defaults.

0.3.11

  • Replace the signed-in Login button with a saved-portrait account icon and a compact Saga Settings / Log out menu. Preserve anonymous public browsing and shared-token read-only access.
  • Separate token login from storyteller settings. Start with Server storyteller or My own storyteller, reveal personal key/model controls only when needed, and place saved setups/request limits under advanced options.
  • Preserve existing setups and spending controls, add clearer errors and keyboard/focus behavior, and clear unsaved secrets when dialogs close.

0.3.10

  • Add host AllowPaidModels opt-in for direct models and OpenRouter presets, funding default Viking and shared server sagas with the host key. Free routing remains the default.
  • Preserve paid preset pricing/provider settings by omitting Sagas provider overrides; manage monetary limits in OpenRouter, with the existing shared daily attempt budget in Sagas.
  • Keep personal-key price ceilings, persistent chapters, retry queues and server-only credentials. Document setup in both publication READMEs.

0.3.9

  • Clarify the existing MIT license, Pendulumgames attribution and third-party content boundaries in the public READMEs and packaged notices.

  • Use the configured Valheim server name when the website DisplayName override is blank; retain the world name as a fallback.

  • Document dedicated-host wildcard listeners (http://*:PORT/), allocated TCP ports, advertised game addresses, and troubleshooting for missing player markers.

  • Pace client telemetry with separate byte allowances and a shared packet interval; pause uploads when Valheim's socket send queue is busy.

  • Send one terrain tile per packet, keep at most two map batches pending, and remove immediate duplicate map sends. Retry unacknowledged events/maps/media after 30 seconds.

  • Preserve portraits during upload, capture at most once per minute, and allow longer assembly time for deliberately paced high-resolution transfers.

  • Log slow collector stages and network backpressure at most once per minute per stage. Dedicated-server multiplayer validation is still required for the reported Steam send-limit incident.

0.3.8

  • Add optional host SLS zone outlines using its live bounds, levels, palette, transparency and fog setting; show zone levels above 1 on hover/tap.
  • Display consented latest Nemesis scores on map tooltips and the portrait corner, using the host-observed player ZDO rather than client snapshot claims.
  • Track distinct Nemesis boss deaths and team credit in filtered player metrics and leaderboards; preserve classification through retention and feed factual context to sagas.
  • Keep Nemesis encounters out of ordinary progression/scenery unlocks and normal boss-speed rankings.
  • Verify both SLS and Epic Loot remain optional, with independent detection and no hard assembly references.

0.3.7

  • Expand personal and server saga evidence with career, equipment, effects, resistances, exploration, boss teams, bounties and loot context while preserving consent and narrative continuity.
  • Require host OpenRouter configuration for story generation. Hide legacy template stories; leave failed generation pending instead of inventing fallback prose.
  • Add encrypted personal OpenRouter keys and named model/preset choices, explicit paid opt-in, token-price ceilings and daily attempt limits.
  • Unlock scenery progressively from recorded boss credit, beginning with Meadows. Public viewing and full-screen scrolling scenery are defaults for new settings; preserve existing preferences.
  • Replace unexplored atlas background with a procedural textured brown parchment treatment without distributing game textures.
  • Prepare a shared Thunderstore/Hexium package, original package icon, public documentation and recorded-playtest website screenshots.

Earlier previews

Established standalone telemetry, provenance-aware loot, runtime terrain, portraits and gear icons, character/server sagas, leaderboards, personal login, responsive biome scenery and isolated Gale Test installation workflows.