


PINS selection, and excluded-tile setSESSIONS (N) button on the idle compile panel opens a SESSIONS overlay listing every saved session — name (Session 1, Session 2, …), tile count, and when it was last used — with three per-row actions:
OPEN — resume that sessionRENAME — give the session a custom name (North coast survey) via the vanilla text dialog. Cosmetic only — folders and web-map paths never move. Submit an empty name to go back to the default Session NDELETE — wipe that session (tiles + folder). Follows the panel's "L-CTRL = destructive variant" rule: greyed out and labelled DELETE (L-CTRL) until you hold Left CTRLNEW SESSION starts a fresh session in the lowest free slot. Default names are automatic and stable — deleting Session 2 never renumbers Session 3; the next new session reuses the free numberRESUME button always targets your most recently used session, and shows that session's name (RESUME SESSION 2 (14), or your custom name) once more than one exists or the session is named (with a single unnamed session it stays RESUME COMPILE (N), exactly as before)EXIT the current session, then OPEN another. While compiling, the MANAGE TILES title shows which session you're in (MANAGE TILES — SESSION 2 (14)), and the start/resume messages name the sessionWEB MAP exports to its own stable folder — webmap_<world>/ for Session 1 (existing bundles keep their path and keep updating in place) and webmap_<world>_s2/ etc. beyond — and shared-tile auto-import lands in whichever session is openSession 1 — same folder, same webmap path, nothing moved or rewritten (its index only gains a last-used stamp the first time you resume it)CLEAR button moved into the SESSIONS panel as the per-row DELETE, so deleting always shows exactly which session — and how many tiles — you're removingWater used to show hard straight-edged seams where compile tiles met: the map shader animates the wave pattern over time, so tiles captured at different moments baked different wave states. Fixed from both ends:
General.Freeze Water Waves setting, on by default; applies to SEND/COPY texture captures and compile tiles). Water depth tinting is unaffectedWEB MAP button to the compile result panel (next to SAVE). It writes a self-contained, offline, interactive web viewer to compiled/webmap_<world>/ — double-click its index.html and it opens in any browser with no server, no internet, and no third-party librariesSAVE (a flat PNG with the pins baked in), the web map keeps the pins as a filterable overlay: it recomposes a pin-free base image at native resolution (the same path SAVE uses) and ships the pins as data plus one baked PNG per distinct pin icon/tint, so the overlay lands pixel-for-pixel where the baked pins would havePINS panel (most-common first, then alphabetical), and mod-added pin kinds get their own group automaticallyindex.html) rather than spawning a timestamped copy, and wipes stale icons / old base images so nothing orphaned is left behind. After the export the button morphs to COPY DIR so the next click puts the bundle folder on your clipboardOutput.Output Format (.jpg / .png) and encodes off-thread like SAVE, so the button can't be double-clicked mid-exportTILES button to the compile panel that opens a MANAGE TILES overlay — a scrollable grid listing every captured tile in the active session, each with a thumbnail, a label + metadata line, and two per-row actions:
EXCLUDE / INCLUDE — hold a tile back from (or return it to) the next COMPILE without deleting it, so you can A/B a composite or drop a bad reading and get it back laterREMOVE — delete that tile outrightUPDATE TILE / REMOVE TILE controls, this panel can act on any tile — including imported/shared tiles and tables the player is nowhere nearTILES button label shows the excluded count (TILES (10, 2 off)) so you can tell tiles are held back without opening the panel. The exclusion set is persisted with the session and survives resume; COMPILE, the PINS listing, and the WEB MAP export all honour itPINS button to the compile panel (between the capture controls and COMPILE). It opens an INCLUDE PINS overlay — a wrapping grid of every distinct pin icon that actually falls inside your captured tiles, each a clickable thumbnail. Turn a kind off and the next COMPILE skips every pin drawing that icon; turn it back on to restore it. ALL / NONE toggle the whole set, DONE (or clicking the dimmed backdrop) closes
RESUME COMPILE, so it survives a logoff. It resets to all-included on START / CLEAR ALL / DISCARD. The PINS button label shows the hidden count (PINS (3 off)) so you can tell pins are held back without opening the panelPINS listing) — it marks your spawn, not a wayfinding feature. The always-on start temple landmark is unaffected: it still composites, just isn't offered as a PINS toggle (it's a landmark, not a choice)CANCEL + CLEAR buttons into a single EXIT button: a tap suspends the session (kept on disk, RESUME any time); hold Left CTRL and it morphs to a red CLEAR ALL (L-CTRL) that wipes the whole session. One button, the panel's consistent "L-CTRL = destructive variant" ruleREMOVE TILE button into UPDATE TILE: at a table whose tile is already in the session, a tap re-captures (UPDATE TILE) and holding Left CTRL morphs it to a red REMOVE TILE that deletes just that tile. The destructive variant on every button now reads in red so the danger is obvious at a glanceCLEAR button now only appears in the idle / resume-review layouts (where there's no EXIT to fold it into)m_pinSizeLarge × doubleSize) instead of each pin's live on-screen rect. The live rect only exists for pins inside the current viewport (Valheim destroys off-screen pin markers) and mods like ZenMap rescale on-screen ones by zoom — so two identical pins came out different sizes depending on which happened to be on-screen when COMPILE ran. The new path is position- and zoom-independent, so same-kind pins are uniform0.25× icon multiplier + 4096-px font anchor baked in an implicit "~4 tiles across" assumption that shrank pins ~4× on a single-tile compile; pins/captions now render at their familiar live-map size for any tile countImage.preserveAspectAdjustPinColor for the hue it would have assigned, falling back to the vanilla white / shared-grey default only when ZenMap is absent or its pin coloring is off1.8.0REMOVE TILE button to the compile panel — wipes the tile belonging to the cartography table you're currently standing at, deleting its PNG and updating the session index. Mirrors the dedup-by-table-position rule the existing UPDATE TILE uses, so it always acts on the same tile UPDATE TILE would replace. Lets you undo a tile capture without wiping the whole session via CLEARUPDATE TILE); placed next to it in the panel so the trio at the current table — UPDATE TILE, REMOVE TILE, COMPILE — read together. Greyed out and labelled REMOVE (L-CTRL) until you hold Left CTRL, so a misclick on UPDATE TILE's neighbour can't silently wipe a hard-won tileOutput config section with three settings:
Output.Output Format — JPEG (default) or IndexedPNG. Drives the on-disk format for the compile result-panel SAVE button and the wire format for SEND TO DISCORD captures and compile sends. The file extension follows the format (.jpg / .png) so the on-disk filename matches the actual bytesOutput.JPEG Quality — 50-100, default 88. Quality for the JPEG path; 88 keeps pin captions readable, below ~80 noticeably softens label edgesOutput.Indexed PNG Colours — 16-256, default 64. Palette size for the indexed-PNG encoder. Maps quantize very well (~6 dominant biome colours) so 32-64 is usually indistinguishable from a full-colour PNG while being ~5× smaller; raise to 128-256 if Map Style is enabled and the gradient shading is bandingOutput.JPEG Quality controls both paths so a tuned value carries overSaved 7234×4521px JPEG q88 3.4 MB native resolution) so format A/B testing doesn't require opening the fileSending to Discord... foreverGeneral.Capture Method — texture capture is the only path now, and it now handles everything the screen-capture path used to. Compile tile capture follows the same simplification (texture-only)General.Capture Super Size — implicit; the texture capture path now sizes off the on-screen map rect and scales up to the longest-edge cap automaticallyControls.Copy Full Resolution Modifier — COPY MAP now always captures at full resolution (capped at 8192 px on the longest edge). The CTRL modifier's purpose was raising the cap above the Discord-safe one; that cap is gone, so the modifier has nothing to gateDiscord.Send Max Dimension — replaced by the Output Format encoder. SEND now sizes the capture at the longest-edge cap and relies on JPEG / indexed-PNG compression to stay under Discord's 10 MB attachment limit (a typical capture lands ~2-5 MB at JPEG q88)Map Compile.Max Output Dimension — preview/COPY/SEND use a hardcoded 4096 px cap (keeps recodes snappy at compose time); SAVE goes up to 8192 via the existing native path. The previous setting only ever clamped the preview, so its absence doesn't change SAVE behaviourControls.Screenshot Key → Controls.Send Key (BepInEx won't migrate the binding — players who rebound this will need to re-set it)Map Style.Style default flipped from Topographical back to None. The full styled pipeline (biome wash, contours, hillshade, fog smoothing) was rendering at the full 8192² capture size every send/copy, which froze the SEND button for 30+ seconds on a large explored map. Style rendering now runs at native screen resolution (the styled output is intrinsically low-frequency, so a 2K-class internal render is visually indistinguishable from 8K), and the default ships off so first-run captures stay snappyPinCaptureFilter runs for the duration of each SEND / COPY texture-capture frame:
Player and Death pins for the capture — these are session-scoped and the compile path already excludes them, so SEND/COPY now matches compile behaviour out of the box. Hold LEFT CTRL at SEND / COPY click time to opt out for one-off shares (deaths, party positions)<color=orange>THE ELDER</color> → The Elder) so localized styling doesn't leak into the captured imageUpdatePins hides captions past the m_showNamesZoom threshold, so a zoomed-out screenshot previously missed every pin name. Caption state is restored immediately after the captureShowLabel(IsCursorOver || IsLabelTogglePressed) postfix via a [HarmonyAfter("ZenDragon.ZenMap")] patch that re-activates the captions every frame between Apply and RestoreMinimap.m_pinNameRootLarge) in addition to the icon root — captions appear in texture-mode captures too, matching what the old screen-capture path got via the back bufferImage.sprite and Image.color (with pin.m_icon / Minimap.GetSprite(type) as fallbacks). Sprite swaps from mods, discovered-location pins, and boss head outlines now reflect in the composite — previously the compositor pulled the original asset (e.g. orange filled boss head) instead of what the player actually saw$enemy_gdking tokens render as The Elder (etc.) on the composite, with no leftover style tagsFontStyles from Minimap.m_pinNamePrefab so compile captions look identical to live-map captions (same absolute pixel size, same italic/smallcaps if vanilla uses them) instead of the previous hardcoded scaleGeneral.Normalize Capture Lighting now uses fixed neutral-noon values (Meadows-tuned ambient/sun/fog) instead of reading per-biome m_currentEnv day colours. The previous behaviour gave consecutive compile tiles different brightness depending on which biome the player was standing in when each tile was captured — fixed values give every tile the same lighting, which is what "normalize" is supposed to do1.7.8Map Style.Style (client-only) — optional stylized rendering for SEND / COPY captures, reconstructed from Valheim's own map data so explored areas show detail while unexplored stay fogged. Four modes:
GenerateOldMap pipeline that reads directly from Minimap instead of rescanning the world)None (or removing the entry) keeps the normal in-game map lookNoneMap Style.Style is non-None — each tile renders through the same pipeline at tile resolution and the composite stitches stylized terrain. Per-tile cap of 1536px on the longest internal render edge keeps ADD TILE responsive (~7× cheaper than rendering at the full 4K tile size); the GPU bilinear blit to tile resolution is visually indistinguishable for the intrinsically low-frequency styled outputTexture2D upload are on the main thread1920×1080. SEND/COPY on a 1440p/4K screen produces noticeably sharper PNGs without needing CTRL+COPY; CTRL+COPY still upsizes to the 4096px full-resolution cap. Falls back to 1920×1080 when the rect can't be measuredSENDING... / COPYING.... Restores hotkey labels and interactability when the capture finishes — useful since a styled or full-resolution capture can take noticeable wall time, and the previous silent button would let the player queue duplicate clicksCAPTURING TILE.... Re-entry guard at the click handler too, so a button event queued before the layout refresh can't kick off a parallel captureCapturing tile... or Rendering styled tile... when a Map Style is active) so there's an immediate response even before the button label updatesCapture Method config. Compile tiles use screen capture by default (matching SEND/COPY), with texture capture still available as the alternative. Brings compile in line with the rest of the mod's capture pipeline — one switch governs every captureNormalize Capture Lighting now applies to every capture path (texture and screen, SEND/COPY and compile). Previously it only affected the texture path; flipping it on now also keeps screen-capture SEND/COPY and compile tiles noon-lit so mixed-mode sessions stay visually consistent. Disable to have all captures reflect the live time of dayuvRect, so icons got stretched/shifted in the captured PNG. The blit now remaps icon positions and sizes through the raw→clamped uv mapping; identity when zoom stays inside [0,1] so framed captures are bit-for-bit unchanged1.7.6SynchronizationManager. Server-synced settings now sync through Jotunn's standard, well-tested path: the server's value is pushed to clients, the entry is locked client-side, and the client's local value is cached and restored on disconnect. No protocol version to keep in step anymoreValheimModding-Jotunn-2.29.0). ZenMap (already required) depends on Jotunn too, so most setups already have itDiscord.Lock Configuration expectations; locking is handled by Jotunn's admin-only mechanism insteadCLEAR button to the compile panel — wipes the whole session (in-memory tiles and the on-disk session folder) and returns to idle. Shown while compiling and when a saved session is resumable. Stays greyed out and labelled CLEAR (L-CTRL) unless Left CTRL is held, so a destructive wipe can't be hit by accident next to CANCELm_explored test only for vanilla walking explorationPin Label.Include Distance now defaults to false (was true). Existing configs are unaffected — BepInEx never overwrites a saved value1.7.4SAVE/COPY/SEND TO DISCORD/DONE — only DISCARD/CANCEL deletes a session. DONE returns to compile mode with all tiles intact; sessions persist across restart (RESUME COMPILE (N))SAVE now writes a full native-resolution PNG — no Discord-safe downsample, sharpest tile maps 1:1, hard-capped at 8192px on the longest axis. Filename includes pixel dimensions; the status line reports native vs. clamp. Preview/COPY/SEND payloads stay at the Discord-safe sizeFINISH (N) → COMPILE (N) — produces a result without ending the sessiontEXt chunk (still a normal viewable image). With a webhook, tiles post to Discord one attachment per message; copies are always written to compile-share/out/<world>/compile-share/incoming are scanned when the large map opens during a compile session, merged into the active session, then moved to incoming/processed or incoming/ignored. Tiles dedup by stable identity (world + rect + capturer), so re-sharing updates in place instead of stackingMap Compile.Enable Map Sharing config (default true, server-synced) — off hides SHARE/EXPORT and disables auto-importMap Compile.Share Message Template config (supports {player}/{tileCount}, server-synced)START/RESUME button. The session is now preserved across map close; reopening shows RESUME COMPILE (N) (re-COMPILE for a fresh result panel)Pin Label.Show on Compile Mode (default true, server-synced) — gates the "of Spawn" captions on the compiled map (still gated by Pin Label.Enabled) without affecting plain COPY/SENDPin Label.Enabled; the texture path now rasterizes their TMP glyphs from the font atlas (SDF-aware), matching the screen pathGeneral.Normalize Capture Lighting (default true, client-only) — texture capture renders the map as if at noon, eliminating the dark/light seams between tiles captured at different times of day; the environment's day palette is applied for the offscreen pass and globals restored immediately after{table} placeholder to Discord.Message Template. Like {spawnDir}, it's substituted in place when present and auto-appended for legacy templates saved before it existed, so existing configs pick up the table name without manual edits{pinName} — {dist}m {dir} (name, direction, or both — whichever is available), gated by the same Pin Label config1.7.3 — ≥1.7.3 self-heals the Graphics.CopyTexture called with mismatching texture sizes error on expanded worlds (broke fog reset/explore-all and degraded compile tiles on older versions); updating ZenMap is the fixgithub.com/codewithbjim/ValheimMods — updated website_url in the manifest and all README image links to the new hostSTART COMPILE / RESUME COMPILE (N) (idle), ADD TILE (N) / FINISH (N) / CANCEL (active)ADD TILE is enabled only when the map was opened at a cartography table; tiles within ~8m of an existing tile replace it in place (lets you re-shoot a table without ending up with duplicates)FINISH opens a result panel with a thumbnail and five actions: SAVE (writes PNG to disk; morphs into COPY DIR afterward to put the folder on the clipboard), COPY (clipboard), SEND TO DISCORD (uses webhook + compile message template), DISCARD, DONEMap Compile.Max Output Dimension config (default 2560, range 512–8192, server-synced) — caps the longest pixel dimension of the composed PNG; default keeps even dense compositions under Discord's 10MB free-tier attachment limitMap Compile.Compile Message Template config (default "{player} compiled a map from {tileCount} cartography tables.", server-synced) — supports {player} and {tileCount} placeholdersDiscord.Send Max Dimension config (default 2560, range 512–8192, server-synced) — caps every image sent to Discord or copied to the clipboard, keeping 4K / ultrawide captures under Discord's 10MB free-tier limitControls.Copy Full Resolution Modifier config (default LeftControl) — hold while clicking COPY MAP (or COPY in the compile result panel) to raise the cap to 4096 for high-fidelity edits in an image editorMapCaptureTexture.CaptureMap now accepts a custom output resolution; CTRL+COPY in texture-capture mode renders the shader at 4096×2304 fragments instead of upscaling a 1920×1080 captureShow Biome Text toggle and the SEND/COPY buttons now share a single uniform row height with the new compile panelDiscord.Send Max Dimension, Discord.Message Template, Map Compile.Max Output Dimension, Map Compile.Compile Message Template, Pin Label.Include Distance, Pin Label.Include Map Item Sources8 — older clients/servers will silently fall back to local config if versions don't matchCartography Table Labels → Pin LabelCapture Super Size and Capture Method from Discord to GeneralUI.Button Alignment config — capture buttons are now pinned bottom-right and the compile panel bottom-left, sharing one row at the bottom of the mapGeneral.Enable Logs config (default false) — silences info/warning messages from this mod in the BepInEx console and Player.log unless explicitly enabledModLog helper so the toggle catches every call siteControls.Copy Key config (default F11) — clipboard-copy hotkey while the large map is openSEND MAP (F10) / COPY MAP (F11) — auto-update when the keys are re-bound{distance}m {Direction} ({bearing}°) caption (e.g. 1240m NorthEast (45°)), baked into the captured imageCartography Table Labels.Enabled config (default true, server-synced) — master switch for the per-pin labelsSpawn Label → Cartography Table LabelsUse Full Direction Names config — directions are now always spelled out (NorthEast instead of NE)" of Spawn" suffix from labels (the bearing makes the reference implicit){spawnDir} now falls back to the player's current position when the map is opened via the M key (no cartography table or map item involved), so Discord captures always include a direction{spawnDir} is auto-appended to the Discord message when the placeholder is missing from a legacy Message Template value (BepInEx never overwrites existing config defaults)Discord.Show Biome In Capture config (default false): client-only, also writable via the in-map toggleUI.Button Alignment default from Center to RightDiscordButton to CaptureButtonUI.Button Alignment config (Left, Center, Right) to reposition the capture button container without restartingWebhook URL to clients in memory only — it is never written to client config filesButton UI hidden during capture for clean images