Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Valheim Moments
Capture deaths, boss kills and great loot as animated WebP clips. Discord delivery controlled by the host, with optional Epic Loot details. Windows x64 beta.
| Date uploaded | a month ago |
| Version | 0.23.0 |
| Download link | Pendulum-Valheim_Moments-0.23.0.zip |
| Downloads | 22 |
| Dependency string | Pendulum-Valheim_Moments-0.23.0 |
This mod requires the following mods to function
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.2333README
Valheim Moments
0.23.0 keeps Barely Survived in slow motion through the hit's immediate aftermath, adds independent boss-equivalent controls and experimental cameras for special enemies, and adds biome camera movement choices with cinematic letterboxing. The GitHub and Thunderstore README fixes and animated gameplay examples are included. Existing camera distance, obstruction handling and boss/raid movement options carry forward. Live camera/co-op acceptance remains required.
Save the moments worth sharing: boss victories, rare drops, unfortunate deaths, and anything you catch with a hotkey. Valheim Moments turns recent gameplay into animated WebP clips and can send them to Discord.
Windows x64 beta - 0.23.0. Manual capture, deaths, boss summaries, Epic Loot, ordinary loot and natural acquisitions have passed user testing. Host and joining-player F10 clips have reached Discord, and the WebP clips were confirmed visually.
Grouped multiplayer highlights: compatible creature-death recordings share one Discord post with up to three labeled perspectives. Discoveries and configurable special-enemy captures from 0.14 are included. Settings, sizing, notifications and death-rate improvements from 0.12/0.13 are included. Install 0.23.0 on the host and every recording client. Automated checks cover persistence, rules and hook behavior; in-game exploration, visual/audio and live co-op acceptance remain pending.
Upgrading from an older version
Before updating through Thunderstore, close Valheim and run the bundled Preserve-DiscoveryHistory.ps1 with your mod profile path. This preserves existing discoveries before the updater can replace their old folder:
powershell -ExecutionPolicy Bypass -File .\Preserve-DiscoveryHistory.ps1 -ProfilePath "C:\path\to\your\profile"
Do this on each recording player's computer. The script leaves originals intact and can be run repeatedly. New versions save discovery history under BepInEx/config/ValheimMoments/Discoveries. The manual installer runs preservation automatically. Already-deleted history cannot be recovered by this script.
Personal controls
Set Player Identity.DiscordUserID to your numeric Discord user ID to show Mec (@your Discord account) in Recorded by and Kill credit. Your character name stays unchanged; Discord resolves the account name and handles notification preferences. Leave it blank to opt out. The ID is sent to the connected host; it is self-configured, not an account verification flow.
Set Cinematic Camera: Experimental.RenderCinematics = false to disable the extra rendering workload on your computer while retaining normal recording. LogEnemyKeys is also personal. The separate special-enemy FirstKillOnly and death PlayerNameOverride controls are removed; use CaptureMode for capture rules.
See it in action
Animated gameplay examples. Player names are supplied; the remaining caption details below are fictional examples of Discord output, not verified contents of the footage.
Mec's death

π Mec died!
Recorded by: Mec
Cause: Troll
Ren's legendary drop

Great loot from Skeleton!
Recorded by: Ren
Kill credit: Ren
Loot
- Legendary Iron sword x1
- +25% physical damage
- +15% attack speed
- Bone fragments x6
- Coins x42
Features
-
Personal gallery: F8 opens/closes history; clicking outside also closes it. Each card automatically shows its thumbnail on the left and recorder, time, status and actions on the right. Six memories per page keep thumbnail memory bounded. Open file location selects surviving footage in Explorer. The Discord-link button has been removed. Retry appears only for failed, omitted or unconfirmed delivery, with existing eligibility limits. F7 keeps the current/latest memory. Both keys are configurable.
-
Bounded storage: new originals use Gallery/Recovery; kept originals move to Gallery/Saved. Successful unpinned uploads expire after a 30-second Keep window. Recovery defaults to 20 clips, 250 MiB and 24 hours; history defaults to 200 entries. Existing Clips files are preserved. Saved originals are never quota-deleted.
-
Controlled retries: at most three deliberate retries with 30/60/120-second backoff, only in the original session/host role. Unknown delivery warns about duplicate posts. Restart/world changes disable old retries; no host webhook secrets are stored in gallery history.
-
Timeline controls: hosts can configure raid opening/ending and close-call source/follow-up/playback durations. Defaults retain the 4+6-second raid and 1-to-3 plus 20-to-7 close call. Authenticated host raid IDs allow grouped participant perspectives; unmatched footage stays personal.
-
Raid moments: four seconds at local raid entry plus six seconds after its observed end, joined into one clip through the default host webhook, with compatible participant perspectives grouped when identity is available. βRaid endedβ includes administrative resets and does not claim victory. Leaving, dying, pause or capture reconfiguration abandons it. Busy/missing segments skip the attempt. Live acceptance remains pending; matched 0.23.0 host/clients required.
-
Close calls: enabled by default. Actual damage crossing 5% health starts a pending memory; survive twenty seconds to finish it. One source second around the hit plays for three seconds, with impact at playback second two and slow aftermath through second three; the rest of the twenty-second survival window compresses into seven seconds. No game slowdown or generated frames. Host controls threshold, recovery and cooldown; the clip uses the main webhook and stays personal. Death cancels it and takes capture priority. Live acceptance is pending.
-
F10 captures recent gameplay. F9 pauses/resumes recording.
-
Automatic player-death clips with cause, configurable rate limit, intervening-death summary and optional cheeky captions.
-
Sliding Saving Memory / Memory Saved / Sent to Discord feedback, with player-controlled placement and quiet sound.
-
Boss clips with first-kill rules, all credited players, final-blow attribution and loot.
-
First tracked biome, labeled-location and trader discoveries per character per world.
-
Host-configured special-enemy clips with exact kill-credit keys and per-enemy cooldowns.
-
Optional Epic Loot rarity, modifiers, sockets and unidentified-item display.
-
Ordinary-enemy loot plus tracked natural chest/world pickups, using a shared minimum rarity.
-
Independent boss and ordinary-loot display options, with Markdown headings and bullets.
-
Host-owned Discord channel routing and bot name. Clients relay footage to the host.
-
Local WebP files remain available when delivery fails.
Discoveries and special enemies
Discoveries default on. Physically entering a new biome, a location with a game discovery label, or a trader's greeting range can capture a moment. Nearby discoveries group briefly into one caption. The host can disable categories and set the cooldown; Discord.DiscoveryWebhookURL uses the main webhook when blank.
History lives in BepInEx/config/ValheimMoments/Discoveries, separately for each character/world pair, and survives replacement of the plugin folder. Existing plugin-side journals migrate automatically when loaded. Main biomes, distinct named sub-biomes, traders and named locations are each tracked once per character/world. Named sub-biome announcements require the host to enable Discoveries.SubBiomes (default off); visits while disabled are remembered silently. hidden sector modifiers no longer produce repeated biome discoveries. Preserve the config history when moving profiles. It remembers observations even while recording is paused, disabled or busy, so those visits are not replayed later. Initial loading/warmup is silent. Valheim's existing character history cannot reliably reconstruct exploration in each world: an older destination can count as a first tracked visit after installing this version. Revealed map pins alone do not count. Not every dungeon has a discovery label, and unsupported mod sources are skipped.
Special enemies default to an empty selection. Each player can enable the local Advanced Special Enemies.LogEnemyKeys diagnostic, kills a candidate, then copies its exact confirmed stat key from the BepInEx log into Special Enemies.EnemyKeys. Use commas or semicolons for multiple keys. These are case-sensitive kill-credit identifiers, not prefab names or translated display names; no wildcards are used. Turn the diagnostic off afterward.
Special captures have independent capture mode, rarity, loot display, attribution and optional Discord-route settings. Their CaptureMode uses existing character-wide kill statistics across worlds; the obsolete separate FirstKillOnly setting is removed. Normal bosses always use Boss Kill rules; an accepted special capture replaces the ordinary loot capture for that credited death. Matching shared death IDs allow these perspectives to join the multiplayer director.
Natural treasure highlights
The host can toggle Loot Capture.CaptureChestPickups and CaptureWorldPickups
independently; both default on. MinimumRarity still defaults to Legendary. Use None
for vanilla items or broad testing. Pickup posts identify Collected by: and the
recorder, and use the Good Loot Discord route.
Only loot tagged during a verified natural generation path qualifies, on successful acquisition. Opening a chest alone does not record. Player storage, player drops, gravestones, crafting and deposits into dungeon chests do not qualify. Older untagged contents and unsupported mod sources are skipped. Mixing stacks can remove their eligibility; splitting or picking up a leftover stack does not generate repeat clips. Quick transfers such as Take all are grouped for 0.25 seconds, with at most 64 entries.
Provenance is small item custom data saved through Valheim's normal world/item save paths. It is consumed even if recording is disabled or busy, so old loot cannot be replayed later. Mod removal leaves harmless custom data on unclaimed tracked items. See the natural loot test checklist.
Install
Install using Thunderstore Mod Manager or r2modman, then launch Modded. BepInEx is installed as a dependency. Epic Loot is optional, tested with version 0.14.2, and is not automatically installed by this package.
For multiplayer relay, install this version on the host and every recording client. The host needs the mod even if it does not record footage. Windows headless servers run relay delivery without allocating a graphics capture buffer.
Version 0.9.0 renames the plugin, helper and config identifier. Before upgrading from
an earlier build, close Valheim and move the previous plugin folder out of the active
profile. Keep its Clips folder and copy the previous mod config to
BepInEx/config/local.valheimmoments.cfg before launching. Do not overwrite an existing
new config without comparing your settings. Installing both plugin identities can
cause duplicate recording and uploads. The new plugin folder is ValheimMoments.
First capture
- Enter a world and wait at least five seconds.
- Press F10.
- Wait for encoding to finish. Find the result in this mod's
Clipsfolder under the profile'sBepInEx/pluginsdirectory.
Defaults are 640Γ360, 15 FPS, five seconds before the event, and two seconds after manual/death events. Boss and ordinary-loot clips default to four seconds after. WebP animations have no audio. They are not MP4 videos.
Recording uses a bounded frame buffer (roughly 185 MiB at defaults) and a separate background encoder. Only one clip collects/encodes at a time; extra triggers are skipped. Actual performance depends on your hardware and settings.
Resolution is clamped to 480β1920 wide and 270β1080 high, FPS to 1β30 and quality to 1β100. Aspect ratios stay between 1:2 and 3:1. Effective resolution reduces to a floor of 480 x 270, then FPS reduces when needed to fit the memory budget (48 MiB minimum); the log reports actual settings.
Changing sessions clears the rolling buffer and cancels a clip still collecting. Wait five seconds after entering the new world for a full history. An already running encoder can finish its local file, but that old clip cannot upload through the new session.
Discord setup β host or single-player
Launch once, exit, then edit BepInEx/config/local.valheimmoments.cfg locally:
[Discord]
Enabled = true
WebhookURL = YOUR_DISCORD_WEBHOOK_URL
Username = Valheim Moments
[Capture]
SaveLocalCopy = false
SizePreset = Small
Create the webhook in the destination Discord server's integrations settings. Treat its URL as a secret. Never share a configured file, profile export containing it, or a screenshot of the URL. No webhook is included with this download.
To use separate destinations, enable the matching host option and enter its URL:
UseGoodLootWebhook = false
GoodLootWebhookURL =
UseBossKillWebhook = false
BossKillWebhookURL =
UsePlayerDeathWebhook = false
PlayerDeathWebhookURL =
When an override is off, that event uses the default webhook. An enabled but invalid
override retains the clip locally. Manual clips always use the default destination.
The host's Username is used for every destination.
Joining clients need no webhook. Their local webhook and bot-name settings are ignored in multiplayer. The host Discord.Enabled setting controls uploads and relay. No host webhook credentials or Username are sent to clients. Every post includes Recorded by: with the recording character's name. For joining players, the host takes this name from their connection; host and solo clips use the local character's name captured when the event triggers. Client event captions/rarity decisions are not independently verified by the host.
The host owns automatic triggers, rarity/first-kill rules, timing and post formatting. These settings are read-only on clients in Configuration Manager and follow the host in memory. Clients keep hotkeys, capture opt-out, performance, image flip, local-copy retention and Advanced timing diagnostics editable. Their config files retain preferences for single-player. Client capture waits for host settings; older clients without the settings exchange cannot relay clips.
Capture sizes and saving
Choose Tiny, Small, Medium, Balanced, Large or Ultra for an aspect-aware size, or Custom to edit Width and Height directly below the picker. At 16:9 these correspond to approximately 480x270, 640x360, 854x480, 960x540, 1280x720 and 1920x1080. Memory limits may reduce effective dimensions/FPS. Mismatched canvases are padded instead of stretched.
Capture.SaveLocalCopy=true also works with host Discord disabled. With both off, new clip triggers are suppressed. With Discord on and saving off, confirmed uploads are deleted; failed uploads still remain for recovery. Use F8 for bounded recovery and F7 to keep a memory permanently.
Discord upload allowance depends on the destination/server boost level. Personal Nitro does not establish the webhook allowance. This release retains its conservative 10 MiB client relay cap; check actual file sizes. Motion and detail make resolution/FPS/quality estimates uncertain.
Death limits and notifications
Player Death.CaptureLimit defaults to 1 per 60-second WindowSeconds. Further confirmed deaths are counted for the next eligible death post; failed delivery does not erase the count. Each player has a separate quota, and counts reset with the session. Custom death templates opt into cheeky text using {flavor}; {extra_deaths} places the additional-death count.
Notifications are player-owned: Enabled, Style (Cinematic / Toast: Minimap / Toast: Top Right), SoundMode (Off / OnCapture / OnCompletion / Both), and Volume. Saving Memory waits for the ending footage. Sent to Discord requires confirmed delivery, including the host acknowledgement for joining players. Local-only recording says Memory Saved. Notices slide/fade and draw after the capture copy to exclude them from footage; live renderer verification remains required. The minimap toast follows the existing small map and falls back to the corner when unavailable. WebP remains silent.
Boss and loot settings
The complete configuration reference lists all settings, defaults, templates and host/client ownership.
[Boss Kill] includes CaptureMode, MinimumLootRarity, and PlayerNameMode
(KillCredit, FinalBlow, or Both). First kill means the character's first recorded
kill in Valheim's saved statistics, not its first uploaded clip. FirstKillThenRarity always captures that first kill and filters later kills by rarity. Existing rules migrate; new configs default to this mode.
Kill Credit follows Valheim's credited-attacker records; simply being nearby does not add someone. Names are sorted, and the list is bounded for Discord. If complete metadata is missing, the confirmed recording character is shown with "full list unavailable" rather than claiming that player was the only contributor. The {credit} placeholder (and {player} in Both/KillCredit mode) uses this list. First-kill history still belongs to the recording character. Ordinary-kill loot messages retain their individual credited character; natural pickup messages use Collected by.
TrackPeriodicDamage = true lets the boss owner track Spirit/fire/poison effects for
final-blow attribution. A tick from one known player can supply their name; mixed or
unknown sources stay unavailable. The creature owner follows the host's synced option.
Spirit-damage final-blow attribution passed a
live boss-kill test; fire/poison and additional co-op cases retain automated coverage.
[Loot Capture] MinimumRarity defaults to Legendary. None is useful for testing
any observed drop. Bosses exclusively use boss rules and do not produce a second
ordinary-loot or pickup event. Named rarity thresholds require Epic Loot's optional
adapter; None also supports vanilla loot. Verified natural pickups use the separate
PickupMessage. Crafting and untracked console-spawned items do not trigger highlights.
Both sections have MaxLootItemsShown, ShowQuantity, ShowRarity, ShowItemModifiers,
ShowItemSockets, ShowUnidentifiedStatus, and LootHeader. Highest rarity sorts first.
Unidentified modifiers and sockets stay hidden. Restart after editing the config file;
Configuration Manager edits apply in game, with buffer changes waiting for active work.
Current limits
The host's Director section defaults to Enabled=true, MaxPerspectives=3, MaxPostMiB=20 and CollectionSeconds=10. It reserves space before requesting selected footage. Host footage is primary when available; remaining selection follows connected-peer order. The main caption/loot summary comes from the primary perspective, with recorder labels and personal first-kill status listed separately. These are host-owned settings; each player keeps control of SaveLocalCopy.
The director also applies the 10 MiB per-file cap to host footage. Oversized, late or excess perspectives are kept locally and omitted. No automatic quality reduction or server-tier detection is claimed. Discord can still reject a post below the configured guard. Unconfirmed delivery retains originals and asks you to check Discord before retrying.
- Relay clips are limited to 10 MiB, also subject to the host's lower upload limit.
- Relay transfers are paced and take time before Discord upload. The host accepts one incoming transfer and one grouped upload at a time. The director reserves bounded queue capacity; excess/expired offers are omitted without automatic retry.
- Successfully uploaded unpinned clips are deleted after a 30-second Keep grace, including client originals after host confirmation. Set SaveLocalCopy=true on the recording player to keep them. Failed/skipped clips use bounded recovery. Host relay temp files are removed after delivery or failure; recognized crash leftovers older than 24 hours are swept at startup.
- Compatible creature-death perspectives share a post when offered within the host collection window. Missing IDs, manual captures and personal discovery/death events remain separate.
- Long ragdoll delays can put the killing blow outside an ordinary-loot clip's history.
- Periodic damage can leave final-blow attribution unavailable. No guessed player is shown.
- Discord may reject files according to its current limits; failed uploads retain footage.
- Linux/macOS/Steam Deck recording are not supported by this Windows package.
Future Roadmap
These are future ideas, not features included in this release. Prioritize game-provided events and saved progression data so new content needs as little mod maintenance as possible. Host configuration should control categories, filters, first-time rules and cooldowns; avoid needing a new build just to add an enemy or achievement identifier. Game API changes can still require compatibility updates.
- Extend discovery coverage where additional reliable game events are available.
- Selected achievement unlocks, driven by the game's achievement definitions rather than a hardcoded list.
- Optional fallback re-encoding and larger transfer budgets beyond the current conservative transport cap.
- Optional separate raid-start posts in addition to the combined ending highlight.
- Group overlapping progression events to avoid duplicate posts for the same moment.
Credits
Valheim Moments' original code is licensed under MIT, copyright 2026 Pendulum. Significant portions of the code and the icon were created using AI tools. The Thunderstore listing uses the AI Generated category.
Uses Imazen.WebP and libwebp. Their license and attribution files are included in
the plugin's Licenses folder. Game, Unity, BepInEx, Harmony and Epic Loot binaries
are not redistributed in this package. Icon created with AI-assisted image generation.
This is an unofficial community mod, not affiliated with Iron Gate or Coffee Stain.
CHANGELOG
Changelog
0.23.2
- Synchronize the plugin version, GitHub release and Thunderstore package at 0.23.2, including the corrected README and normal mod-manager upgrade instructions.
- Discoveries may appear once more after upgrading if old history was removed; newly recorded discoveries stay saved across server restarts. No manual migration is required.
- Install matching 0.23.2 on the host and every recording client.
0.23.1
- Simplify upgrading: update normally through your mod manager. No scripts or execution-policy changes are required; the preservation script is no longer bundled.
- Discoveries may appear one more time after upgrading if old history was removed. Once recorded by the updated mod, discoveries are saved outside the plugin folder and no longer repeat on server restarts. This covers biomes, enabled sub-biomes, traders and named locations per character/world.
- Install matching 0.23.1 on the host and every recording client.
0.23.0
-
Add pre-upgrade discovery preservation tooling; announcements wait for durable journal writes.
-
Add personal RenderCinematics and local LogEnemyKeys controls. Retire special-enemy FirstKillOnly and death PlayerNameOverride; preserve explicit CaptureMode values. Correct obsolete setting descriptions.
-
Add optional personal DiscordUserID with host-side recorder/kill-credit mentions, preserving character names and disabling general mention parsing.
-
Remember each main biome and distinct named sub-biome once per character/world. Sub-biome announcements have a host-controlled SubBiomes toggle, default off; disabled visits remain remembered. Ignore hidden sector modifier changes and preserve legacy variant records for silent migration when matched. Move discovery history outside the replaceable plugin folder, with automatic migration of existing journals.
-
Barely Survived keeps slow motion through the immediate aftermath: impact lands at second two of the default three-second slow segment.
-
Special enemies gain independent boss-equivalent capture modes, loot filtering/display, player attribution, Discord routing, and experimental arrival/aftermath cameras. CaptureMode is the sole special-enemy capture rule.
-
Biome discovery gains RiseAndReveal, Orbit and ZoomIn movement choices and an independent BiomeLetterbox toggle, enabled by default for animated black bars and a fading title.
-
Include the GitHub and Thunderstore README fixes and Mec/Ren animated gameplay examples carried forward from the 0.22.0 working copy.
-
Retain the existing camera distance cap, obstruction checks, boss spawn timing and boss/raid movement choices. Use matching 0.23.0 host and recording clients.
0.22.0
- Cap cinematic distance at 3x; existing higher settings clamp to the new maximum.
- Add Orbit, RiseAndReveal and ZoomIn movement dropdown choices for bosses. ZoomIn approaches from 2x distance to 1x over four seconds with a fixed lens; also available for raids. Replaces the test-build zoom checkbox.
- Try elevated viewpoints and wider obstruction checks to reduce trees blocking shots.
- Catch fresh boss arrival after the altar summon delay, with configurable 0-5 second extra delay.
- Add animated Mec death and Ren legendary-loot examples with illustrative Discord captions to both READMEs.
- Live camera and multiplayer acceptance still required.
0.21.0
- Correct upside-down experimental camera footage by default, with a separate player-owned orientation switch.
- Default cinematic distance to twice the original; add host distance (1β8x), sweep (0β180 degrees), raid movement and letterbox controls.
- Raid shots default to rising reveals aimed at the raid center, with Orbit available.
- Add animated top/bottom widescreen bars and fading titles. Boss arrivals show localized name, stars and maximum health; raids show their event text and available configured foe types.
- Preserve burned-in cinematic details through Director validation without adding a second generic Boss Arrival label.
- Remove the gallery Discord-link button, unavailable-link text and optional webhook metadata lookup. Existing gallery history and upload receipt validation remain compatible.
0.20.0
- Add opt-in host-controlled Cinematic Camera: Experimental options for raid opening, boss arrival, boss aftermath and biome discovery, using a separate offscreen camera.
- Cache boss arrivals by exact network identity, then attach once and first in the boss-kill post. Director selects one cinematic per enabled role alongside normal POV attachments.
- Bound cinematic rendering, cached footage, relay packets and final upload sizes. Unsupported, obstructed or unavailable shots fall back to ordinary footage. Camera visuals and multiplayer acceptance need live testing.
- Replace reflection-based Discord receipt/metadata deserialization with a bounded response reader; include safe failure-stage diagnostics. Fix intended for Unknown uploads and disabled gallery links; live confirmation remains required. Existing Unknown history is not automatically repaired.
- Preserve all 0.19.0 gallery, notification and recorder-nameplate improvements. Install matching 0.20.0 on host and clients.
0.19.0
- Gallery cards show thumbnails automatically, with details/actions alongside, six entries per page, F8 toggle and outside-click dismissal. Block gameplay mouse-look and scroll zoom while browsing.
- Replace local animation opening with Open file location. Show retries only for failed, omitted or unconfirmed delivery; retain bounded/session-authorized retry rules.
- Recover new Discord message links from verified webhook metadata when the message receipt lacks a guild ID. Metadata failure does not invalidate a successful upload.
- Add Cinematic, Toast: Minimap and Toast: Top Right notification styles with slide/fade. Saving Memory waits for ending footage; remove Memory Captured and rename delivery feedback Sent to Discord. Draw notifications after capture to exclude them from footage (live verification required).
- Multi-perspective director clips receive bottom-center recorder nameplates; single-perspective clips remain untouched. Remove Perspectives heading and bold appended death Cause labels.
- Document exact EnemyKeys discovery and the Jotunn localization reference. Use matching 0.19.0 host/clients; live UI, renderer and co-op validation remains required.
0.18.1
- Shutdown gallery flushing preserves the player's configured recovery limits and queues a final pass after any active storage worker.
- Age-based recovery expiry now honors the full 30-second Keep grace after completion, including retries of older clips.
- An unreadable gallery index remains intact with a persistent error. Existing unrecognized media is preserved because its pin status cannot be established; new history is not written over the damaged index. Known new captures can still finish and kept originals remain saveable.
- Added regression coverage for custom retention at shutdown, old-clip grace, and corrupt-index preservation. Use matching 0.18.1 host/clients for the existing final gameplay checklist.
0.18.0
- Personal gallery (F8), Keep this moment (F7), lazy thumbnails, local animation opening, and verified Discord message links where available. Both hotkeys are player configurable.
- Central clip ownership protects active encodes/uploads from cleanup. Kept originals move to Gallery/Saved; unpinned confirmed uploads expire after a 30-second Keep grace. Bounded Gallery/Recovery defaults to 20 clips, 250 MiB and 24 hours; history defaults to 200 entries.
- Deliberate retries are limited to three with backoff and the original session/host role. Unknown delivery requires a duplicate-post confirmation. No webhook secrets are persisted in gallery history.
- Host-configurable close-call source/playback timing and raid opening/ending durations, with matching survival checks and memory fitting.
- Authenticated host raid occurrence IDs allow compatible participant perspectives to share director posts. Unmatched identity stays personal. Raid ended still does not claim victory.
- Restart cleanup removes only recognized old transient relay/raid files, preserving unrelated files and permanent Saved originals.
- Final in-game gallery, timeline, raid grouping, dedicated-host and sustained performance acceptance remains pending. No automatic installation or Thunderstore submission.
0.17.0
- Personal raid moments capture a four-second opening and six-second ending, combined through the default host Discord route. Host-owned Raids.Enabled defaults true.
- Local random-event participation excludes forced boss ambience. Captions say Raid ended because timer expiry and administrative reset share ending semantics; no victory claim or multiplayer raid grouping.
- Raw opening frames are released after encoding. Owned intermediate cleanup waits for workers to close and preserves unrelated files. Pause, death, leaving, policy loss, session/capture changes and thirty-minute expiry abandon the attempt. Busy/missing endings are skipped.
- Composition enforces file, dimension, frame and timing budgets. Automated segment decode/timing, cancellation and cleanup checks pass. Live raid quality/performance remains pending. Restart orphan sweeping and gallery are still planned. Matching 0.17.0 host and clients required.
0.16.0
- Close-call clips require surviving twenty seconds after an actual damage crossing. Death cancels the attempt and frees capture for the normal death event.
- Bounded sampling produces a ten-second WebP: one source second slowed to three, then twenty source seconds compressed to seven. Existing memory fitting accounts for selected frames; no full twenty-second raw recording is retained.
- Host controls enable, health threshold, recovery threshold/hold and cooldown. Periodic oscillation cannot repeatedly rearm. Pausing, policy loss, session/character changes and reconfiguration abandon pending captures.
- Close calls remain personal and use the default host webhook. Matching 0.16.0 host/clients required. Automated timing/encoding and event checks pass; in-game acceptance remains pending. Raid clips and gallery are still planned.
0.15.0
- Multiplayer director groups compatible boss, special-enemy and kill-loot recordings into one post with up to three labeled perspectives. Shared owner-generated death IDs distinguish simultaneous kills; first-kill status remains personal.
- Host controls collection duration, perspective count and combined post budget. Offers reserve bounded capacity before selected client transfers start; local host footage uses the same selection path. Late, duplicate and over-budget perspectives are omitted without being marked uploaded.
- Disk-backed relay v2 uses bounded chunks and carries event metadata. Final outcomes distinguish uploaded, omitted, failed and unknown; originals are removed only after confirmed inclusion. Unknown delivery is not automatically retried.
- Uploader validates bounded Discord receipts and retains message identifiers. Stale callbacks and interrupted transfers cannot acknowledge a newer clip. Per-file relay/director cap remains 10 MiB; tier detection, automatic fallback encoding and gallery links remain future work.
- Matching 0.15.0 on host and recording clients is required. Automated three-player simulation passes; live co-op, notification/padding and earlier discovery acceptance checks remain pending. Nothing is installed automatically.
0.14.0
- First tracked biome, labeled-location and trader discoveries, once per character per world. Bounded local history uses atomic asynchronous saves; startup visits are silent and suppressed visits are remembered.
- Host-owned discovery category switches, cooldown, post-event duration and message. DiscoveryWebhookURL falls back to the main route only when blank.
- Configurable special-enemy captures using exact confirmed kill-credit keys, with a diagnostic key logger, first-kill option and per-enemy cooldown. Bosses remain exclusive; accepted special captures replace ordinary kill-loot captures and use the main route.
- Added discovery persistence, Harmony observation, routing and host-policy checks. Updated installer to preserve State during explicit folder migration and let the plugin generate current config defaults.
- Matching 0.14.0 host/client settings required. Preserve State/Discoveries across upgrades. Old per-world exploration cannot be reconstructed; live discovery/co-op acceptance remains pending.
0.13.0
- Brief themed recording, saved, captured and uploaded feedback. Optional original quiet cue with player-owned mode/volume; no audio is added to WebP files.
- Host-owned death quota defaults to one capture per 60 seconds. Per-player counters preserve intervening/unshared deaths until confirmed delivery or local-only save. Session changes clear counters.
- Twenty neutral cheeky death lines without immediate repeats. Custom captions opt in with {flavor}; {extra_deaths} places the additional-death count.
- Structured client relay completion only reports success after final host delivery acknowledgement. Host admission also limits incoming death offers per connection.
- Notification preferences apply without cancelling the current capture. Existing 0.12.0 settings, migration and sizing changes are included.
- Matching 0.13.0 host/client settings schema required. Live banner/audio and co-op acceptance remain pending.
0.12.0
- Six aspect-aware size presets plus Custom, preserving aspect under memory fitting and padding mismatched canvases.
- Player capture settings appear before visibly locked host policy; custom dimensions follow the picker.
- Discord defaults enabled for fresh configs. Relay/upload follow host enablement; redundant switches removed. Host Username remains Valheim Moments by default.
- Capture.SaveLocalCopy supports local-only saving and migrates the old Discord value. Both delivery and local saving off suppress captures.
- One boss CaptureMode supports first kill then qualifying rarity; all legacy combinations migrate. First boss kills receive an explicit caption line.
- Settings protocol v2 requires matching host/client versions. This milestone does not increase the 10 MiB relay cap.
- New UI and padded rendering require live testing; no gallery/discovery/director feature is included yet.
0.11.1 - complete boss kill credit
- Boss Kill Credit now lists all players in Valheim's credited-attacker records, instead of only the recording character. Nearby spectators are excluded.
- Recorded by, Final Blow and personal first-kill history remain independent. Missing roster metadata is explicitly marked unavailable rather than implying solo credit.
- Send the bounded roster alongside vanilla credit; attribution hooks also initialize on headless hosts.
- Updated player/source documentation and multiplayer acceptance checks. Added a Future Roadmap favoring game-driven progression events and host configuration over hardcoded content lists.
- Natural-loot testing was reported successful on 0.11.0. The new roster fix has automated coverage; final live co-op confirmation remains pending.
- Update the host and all recording clients to 0.11.1 for complete attribution metadata.
0.11.0 - natural loot acquisitions
- Added host-controlled natural chest and world pickup highlights, sharing loot rarity/display/routing settings.
- Track verified generation, including Epic Loot 0.14.2 deferred chest rolls; trigger on successful acquisition with Collected by attribution.
- Exclude player storage, gravestones, drops, crafted items, deposits, mixed stacks and unknown provenance. Consume eligibility once, including partial pickups.
- Group quick acquisitions for Take all summaries. Vanilla ordinary/world loot can qualify with MinimumRarity=None without Epic Loot.
- Provenance hooks also run on headless hosts; markers persist in ordinary item custom data.
- Host and recording clients must all update to 0.11.0. New natural-loot behavior has automated coverage; live validation remains pending.
0.10.1 - practical capture minimums
- Minimum capture dimensions are now 480 x 270; defaults remain 640 x 360.
- Memory fitting respects that floor and reduces effective FPS when necessary.
- Minimum frame-pool budget is 48 MiB so maximum clip durations fit at 1 FPS.
0.10.0 β host rules and bounded client settings
- Host controls event switches, rarity/first-kill rules, timing, attribution and post formatting. Connected clients see those options as read-only in Configuration Manager.
- Clients keep hotkeys, capture/relay opt-out, resolution/FPS/quality, memory budget, image flip, local-copy retention and performance diagnostics editable.
- Host policies sync over the connected server's direct RPC channel. Webhook URLs and Discord identity never enter the packet; client config files retain local preferences.
- Host and clients need 0.10.0 or compatible newer versions. Capture waits for host settings; outdated clients without the settings exchange cannot relay clips.
- Added UI/config-file ranges, aspect-ratio limits (1:2 through 3:1), and automatic resolution reduction to fit memory limits. Defaults remain 640x360 at 15 FPS.
- Debug timing is under Configuration Manager's Advanced filter and defaults off.
- Automated policy and bounds checks pass; live settings UI/co-op checks remain pending.
0.9.5 β compact posts and successful-upload cleanup
- Removed the extra blank line before automatically appended generated loot.
- SaveLocalCopy now defaults to false: successful uploads delete the local clip. Joining clients also delete after the host confirms successful Discord delivery.
- Existing installs keep their setting; use SaveLocalCopy=false to enable cleanup. Failed/skipped uploads and older saved files remain local. No session-wide purge.
0.9.4 β loot formatting
- Avoid repeating rarity words already at the beginning of item names, including Magic and Legendary. Matching uses the localized rarity and whole-word boundaries.
- Format each modifier and socket detail with two spaces followed by
* -#. - Applies to both boss and ordinary-loot summaries; hidden unidentified details remain hidden.
0.9.3 β capture session isolation
- Clear buffered footage and cancel a collecting clip when joining, leaving or switching sessions. Pending GPU readbacks from the old session are discarded.
- Keep frames owned by an active encoder intact until it finishes; existing upload guards continue to prevent sending the old clip through a different session.
- Require an active session and local player before recording or triggering a new clip.
- Added automated tests for session changes, late readbacks and encoder ownership.
0.9.2 β periodic final-blow attribution
- Track actual Spirit/fire/poison status-effect sources on the boss owner, without changing game damage or kill credit. A tick from one known player can now supply the final-blow name; mixed or unknown sources remain unavailable.
- Respect fire/Spirit stacking and poison replacement instead of assuming the last direct attacker caused the periodic kill.
- Added Boss Kill.TrackPeriodicDamage (default true, restart required).
- Added automated status-effect attribution checks. Spirit-damage final-blow naming passed a live boss-kill test. Fire/poison and remaining automatic co-op checks are pending.
0.9.1 β recorder attribution for everyone
- Added Recorded by: to host and solo posts for all clip types, using the recording character's name at the time of the trigger.
- Joining-player posts retain host-supplied recorder attribution with the same formatting.
- Confirmed live co-op F10 Discord delivery for both host and joining player, and visual playback of the WebP-only encoder's clips.
0.9.0 β consistent naming
- Renamed source projects, namespaces, plugin DLL, encoder executable and install folder to ValheimMoments.
- Plugin GUID/config identifier is now local.valheimmoments. Upgrading requires migrating the previous config and removing the older active plugin.
- Added explicit development-installer migration options that preserve settings, recordings and the previous plugin outside the active profile.
- Added the project's MIT license and public GitHub source link.
0.8.1 β first Thunderstore beta
- Manual, death, boss and ordinary-loot animated WebP captures.
- Optional Epic Loot details, rarity filtering and first-kill priority.
- Markdown post formatting and independent loot display settings.
- Host-owned Discord destinations and bot name, with bounded client clip relay.
- New 256Γ256 Valheim Moments icon and mod-manager packaging.
- Replaced the prototype's ImageMagick bundle with a smaller WebP-only encoder.
- Multiplayer relay and the new encoder still need fresh live-game validation.