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.
SignStyler
Sign editor: formatting toolbar, color picker and live preview.
| Date uploaded | a week ago |
| Version | 1.1.0 |
| Download link | Ydalis-SignStyler-1.1.0.zip |
| Downloads | 319 |
| Dependency string | Ydalis-SignStyler-1.1.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.2351README
Sign Styler
A rebuilt sign-writing interface for Valheim: a formatting toolbar, a colour picker and a live preview, in place of a text box that fights you.
Client-side only. Sign text is stored in the sign's own text field, exactly as vanilla stores it. Other players see your styled signs without installing anything, the server needs nothing, and uninstalling leaves every sign exactly as it was.
What it fixes
| Vanilla | With the mod |
|---|---|
The field renders tags as you type: <color=red> vanishes the moment you type the > |
Rendering is off inside the field — tags stay visible and editable |
| 50 characters, tags included | 400 by default, configurable up to 2000 |
| No idea what it will look like until you commit | Live preview under the field, plus a character counter |
| Tags typed by hand, from memory | A toolbar for every tag, with sliders for the numeric ones |
| Icons only reachable by pasting from a web page | A grid of every glyph the sign's font can actually draw |
What's in the toolbar
Character styles — B, I, U, S and no parse. They light up for whatever is in force
under the caret, read back from the text rather than remembered from your clicks, so they stay
honest when you edit the tags by hand. Shortcuts: Ctrl+B, Ctrl+I, Ctrl+U.
Colour — one entry for text colour, one for highlight, each showing the colour that target
currently holds and opening the picker already pointed at it. The picker is a side panel with a
saturation/value square, a hue strip, a hex field with copy and paste, an alpha slider, a palette
you build up (+ save, right-click a swatch to remove it) and the session history. Clicking a
swatch loads the colour — it doesn't apply it, so looking is not the same as writing.
With nothing selected, applying a colour colours the word under the caret rather than refusing.
There's also Insert empty tag at caret, for colouring text you haven't typed yet.
Colour vision — a button cycling the picker through normal vision, protanopia, deuteranopia, tritanopia and achromatopsia. The square, the hue strip and every palette chip are redrawn as a player with that deficiency sees them, so two colours that collapse into one muddy tone show up before the sign is written rather than after. Only the display changes: the hex field and the tag keep the real colour. A sign is read by everyone who walks past it, and roughly one man in twelve sees red and green differently from its author.
Icons — a grid of the characters your keyboard has no key for: crossed swords over an
armoury, a hammer over a workbench. Read from the sign's own font at runtime, so every glyph
offered is one the sign can genuinely draw — nothing comes out as an empty box. Search by
Unicode name (sword finds ⚔, skull finds ☠) or by codepoint, and cycle the categories to
browse. An icon costs one character, same as a letter.
And yes, emoji. Valheim's signs fall back through fourteen fonts, one of which is an emoji face, so 😀 💀 🔨 go on a plank like any other character — no font to install, no sprite tag, one character each. They're on the grid because the font can draw them, same rule as everything else.
Numeric tags — size, voffset, line-height, cspace, rotate and alpha, each with a
slider and a typed value. Dragging rewrites the tag already in your text instead of stacking a
new one on top, and the preview follows in real time — which is what makes offsets usable, since
those values are found by eye.
Installation
Through a mod manager (Thunderstore Mod Manager, r2modman, Gale): install, and BepInEx comes
along as a dependency. Manually: BepInEx for Valheim, then drop SignStyler.dll into
Valheim/BepInEx/plugins/SignStyler/.
Launch once and the config file appears at BepInEx/config/fr.anthony.signstyler.cfg. It holds
a single setting — CharacterLimit, 400 by default, bounded 50 to 2000. It's re-read every time
a sign is opened, so Configuration Manager changes take effect without a restart.
Tag cheat sheet
<b> <i> <u> <s> bold / italic / underline / strikethrough
<b> shows nothing on a sign — the Norse font has no bold face
<color=#FF0> short hex form, cheapest in characters
<size=150%> <size=24> percentage of the current size, or a fixed point size — the
fixed form is what switches the sign's auto-scaling off
<voffset=1em> vertical shift, what lets text float off the sign
<line-height=80%> compensates the shift voffset introduces
<cspace=0.2em> character spacing
<rotate=15> rotation in degrees, counter-clockwise when positive
<alpha=#80> opacity, no closing tag
<align=left> alignment
\n line break (2 characters, cheaper than <br>)
Quotes around values can be omitted, and so can closing tags — technically invalid, tolerated by the engine, and it saves characters on a tight budget.
For emphasis that actually shows on a plank: size, colour and character spacing. A
<size=140%> in a lighter tone reads far better than a bold that never renders.
A sign is drawn twice
The plank and the hover label are two different renderers reading the same string, so a tag can apply to one and not the other. This is vanilla behaviour, not something the mod can reconcile — the two previews under the field show both results side by side.
| plank | hover label | |
|---|---|---|
<color> |
applied | ignored, always white |
<mark> |
applied, behind the glyphs | ignored |
<i> <u> <s> |
applied | ignored |
<b> |
ignored (no bold face in the font) | ignored |
<size>, layout tags |
applied | applied — and they push the piece name and use prompt out of shape |
On offsets
Sign text is auto-centred and auto-scaled, so a voffset on its own barely moves anything —
the engine just reframes around it. The combination that works is a fixed size, which disables
scaling, plus an offset or line breaks. voffset also stretches line height, so compensate with
line-height for a clean move. rotate disturbs character spacing; cspace pulls it back.
Other sign mods
Don't run alongside: RunicSigns, BetterSigns, ComfySigns. They replace or patch the same sign editor — the last one loaded wins.
Fine together: AdvancedSigns, Glowing Signs, and anything that renders signs rather than editing them. They act on the sign, this mod acts on the text prompt, and they read the same vanilla tags this toolbar writes.
Unrelated: mods that display dynamic data on signs (chest contents, world stats). No shared surface.
Reporting a problem
GitLab Issues — pick the Bug
template and keep its headings. It asks for the BepInEx log (Valheim/BepInEx/LogOutput.log, or
the same path inside your profile folder under r2modman or Gale); without it a report is mostly
guesswork.
Valheim 1.0 shipped on 9 September 2026, and a major release usually breaks Harmony patches. If things look wrong, first check that BepInEx and your other mods have caught up with it.
Credits
The code was written by Claude (Anthropic) from my specification, through several rounds of
review. Scope, design decisions, review, testing and maintenance are mine. Flagged AI Generated
per Thunderstore's rule.
MIT licensed.
CHANGELOG
Changelog
This project follows Keep a Changelog and Semantic Versioning.
[Unreleased]
[1.1.0] — 2026-10-05
Added
- Colour-vision simulation in the picker: a button cycling through normal vision, protanopia, deuteranopia, tritanopia and achromatopsia. The square, the hue strip, the working swatch and every palette chip are drawn as a player with that deficiency sees them (Machado et al. 2009 matrices, applied in linear RGB). Only the display changes — the hex field and the tag written into the sign keep the real colour. The mode lasts for the session.
- Emoji on the icon board. Valheim's signs fall back through fourteen font assets and one of
them is
NotoEmoji-Light, so a sign has always been able to draw them; the board simply could not see them. 1337 glyphs from that face, 832 more fromNotoSansJP-Thin.
Fixed
- The icon board was reading the font atlas instead of the font. Valheim's font assets are in
TextMeshPro's
Dynamicmode, wherecharacterTableholds what has already been rendered rather than what the font contains — so the grid reported the session's history. Observed in game: twenty glyphs, every one an icon the HUD happened to be drawing, on an asset whose table held two entries. The board now asks the font face throughFontEngine, which rasterises nothing and leaves the atlas untouched. 2452 glyphs on a vanilla install. - Asking the face for coverage was not enough:
Font.HasCharacteranswers from the character map, which maps codepoints onto glyph 0 —.notdef, the empty box. That filled the grid with 9481 entries, most of them boxes. The board asks for the glyph index and rejects 0. - The category label kept naming a block the grid was no longer filtered on, after a sign opened with a different font reset the filter without resetting the caption.
Known
- The game's own icons, in the private use area, are not found by the font scan — it yields one codepoint there. They still appear through the character-table walk once something has rendered them, which means they come and go with the session. Not chased down yet.
[1.0.0] — 2026-09-28
First release.
Added
- Plain-text editing in the input field: tags stay visible and deletable instead of being rendered as you type.
- Character limit raised from 50 to 400, configurable between 50 and 2000.
- Formatting toolbar: bold, italic, underline, strikethrough, line break,
noparse, and a strip-all-tags button. The style buttons light up for whatever is in force under the caret, read back from the tags rather than tracked from clicks, so they stay honest when the string is edited by hand. - One direct entry per color target — text color and highlight — each showing the color that target currently holds and opening the picker already pointed at it. Both are read back from the sign's own text every time a panel opens.
- HSV color picker as a side panel: hex field with clipboard copy and paste, an alpha
slider with a percentage readout, a saved palette (
+ save, right-click a swatch to remove it), the session history, an apply button that states what it is about to do, andInsert empty tag at caretfor coloring text that is not typed yet. Clicking a swatch loads the color rather than applying it. - Live sliders for
size,voffset,line-height,cspace,rotateandalpha: the existing tag's value is rewritten in place rather than a new tag stacked on top. Each one also takes a typed value, with a clamp to the tag's range and a fallback to the bound value when the input cannot be read. sizeaccepts both of the forms TextMeshPro understands:150%scales the current size, a bare500sets a fixed point size and switches the board's auto-scaling off. The row reads the form from what you type, and binds to the form already written on a sign rather than converting it.- Icon board: a grid of every glyph the sign's font can draw that a keyboard cannot type — symbols, arrows, shapes, and whatever the game keeps in the private use area. Built by reading the font asset at runtime rather than from a hardcoded list, so a glyph is only offered when the sign can actually draw it. One click inserts it at the caret, and each icon costs a single character against the limit.
- Icon board search: a box that filters the grid as you type, matching Unicode's own
character names —
swordfor ⚔,skullfor ☠ — or a codepoint, with or without theU+a player copies along with it. The names ship as an embedded table generated fromUnicodeData.txtand the CLDR short names, 5675 of them; it labels the glyphs without having any say in which ones exist, so the grid is still exactly what the font can draw. - Icon board categories: a filter cycling through the Unicode blocks the font actually holds — arrows, geometric shapes, dingbats, the game's own icons — built from the discovered glyphs, so it can never land on an empty page. The caption line now names the last glyph inserted alongside its codepoint.
- Icon board: the glyph cap that stops the font scan was raised from 1024 to 4096, and hitting it is now logged. At 1024 a font holding more icons than that silently lost whichever ones its character table listed last — the emoji planes, on a font walking in codepoint order. The console also reports the glyph and block count on every open.
- Rendered preview under the field, plus a visible/total character counter. The board preview paints the color the sign's renderer actually produces — the component's color multiplied by the material's face color — rather than the property alone.
- Text-editor behaviour: word under the caret when nothing is selected, and style buttons that toggle off when the selection is already wrapped.
- Trailing resets appended on the way into the sign, so an effect left open does not bleed onto the piece name and use prompt under the hover label.