Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Make the game shout when something matters

By the end you’ll have a bounty line that turns gold and chimes, a web that lights an on-screen indicator, and the ambient noise you’re tired of reading gone from the feed.

What you’ll build

Three rules, each one a different kind of “tell me”:

  1. Color + soundYou have completed your task prints in gold and plays a chime, so a bounty finishing lands even when you’re reading something else.
  2. A status light — being webbed switches on a custom status id, and an indicator window wired to that id lights up. This is the one worth learning: any line of game text can drive a visual, without the game ever sending a status update for it.
  3. Squelch — the ambient weather chatter never reaches your main window again.

You’ll prove all three with .testline, which feeds a fake game line through the live highlight pipeline, so nothing here depends on finding a mob first.

📷 screenshot pending
The main window with a gold bounty line, a lit WEBBED indicator beside the vitals, and no weather chatter in the feed.

Before you start

  • For the sound rule only: an audio file in ~/.vellum-fe/global/sounds/. VellumFE creates that folder and seeds it on first run. Drop a .wav or .mp3 in and it appears in the editor’s Sound dropdown. The examples below use chime.wav — substitute the name of a file you actually have.

  • Coming from Wrayth or StormFront? Convert your existing rules first instead of retyping them:

    vellum-fe import-highlights 70682.xml
    

    This runs and exits without connecting. It writes 70682-highlights.toml beside the source file; add --dry-run to see what it would produce, or --out <FILE> to choose the destination.

Steps

Rule 1 — a bounty that shows and chimes

  1. Click Editors in the top toolbar, then Highlights. The hub stays open, so you can keep working alongside it. (Or type .highlights in the command input.)
  2. Click Add highlight.
  3. Fill in the form:
    • Namebounty-done
    • PatternYou have completed your task
    • Foregroundgold
    • Sound — pick chime.wav from the dropdown
    • Tick Entire line so the whole line colors, not the matched words
  4. Click Save.
📷 screenshot pending
The highlight form with Name, Pattern, Foreground and Sound filled in for the bounty rule.

Rule 2 — webbed lights an indicator

  1. You need somewhere for the light to live. Type .addwindow webbed indicator 60 2 12 1 to place a one-row indicator window — an indicator window’s name is its status id, so this one answers to webbed.
  2. Back in the highlights editor, click Add highlight again:
    • Namewebbed-on
    • PatternYou are entangled in a web
    • Set statusWEBBED
    • Status duration — leave empty so it stays lit until cleared
  3. Save, then add the matching off-switch:
    • Namewebbed-off
    • PatternYou tear through the last of the webbing
    • Clear statusWEBBED
  4. Save.

Rule 3 — hide the weather

  1. Add highlight once more:
    • Namequiet-weather
    • PatternA gentle breeze blows through
    • Tick Squelch
  2. Save.

Prove all three without waiting for a mob

  1. Type each of these into the command input:

    .testline You have completed your task
    .testline You are entangled in a web
    .testline A gentle breeze blows through
    

Expected result: the first line prints in gold and the chime plays. The second lights your WEBBED indicator. The third produces nothing at all — the feed does not move, which is the squelch working.

Make it yours

Send lines somewhere else instead of hiding them. Squelch is absolute — the line is gone. If you’d rather keep it but move it out of the way, set Redirect to to another window’s name. The mode selector decides what happens to the original: redirect only removes it from the main feed, redirect copies leaves it in place and duplicates it. A rule with pattern asks you to and Redirect to thoughts puts merchant chatter in your thoughts window while your hunting feed stays clean.

Make a status clear itself. The webbed rule above stays lit until the matching Clear status rule fires — right if you have a reliable “you’re free” line, wrong if you don’t and it sticks on forever. Put 30 in Status duration instead and the status switches itself off after thirty seconds whether or not a clear rule ever matches. The two approaches combine: whichever happens first wins.

Rewrite noisy text rather than removing it. Replace rewrites the matched text in place and understands $1-style capture groups. A rule with pattern (\w+) just bit you! and Replace >>> $1 BIT YOU <<< keeps the information and makes it impossible to skim past. Set Window to scope the rewrite to one window while the colors still apply everywhere.

Buzz the controller. If you play with a gamepad, the Rumble dropdown fires a named rumble pattern on match — a low-health rule you feel rather than read. Patterns come from the Controller editor’s Rumble tab.

When it doesn’t work

The rule never fires. Confirm with .testline before blaming the rule: .testline injects your text verbatim into the live pipeline, so if the rule doesn’t fire there, the pattern is wrong. The most common cause is a regex metacharacter taken literally — (, ), [, ], ., ?, * and + all have meaning. To match a literal (2/3) you need \(2/3\). If your pattern is plain text with no regex in it at all, tick Fast parse — it uses literal matching, which is both faster and immune to this problem.

Colors don’t apply but the sound plays (or the reverse). The [highlights] section has four independent global switches, all on by default: sounds_enabled, replace_enabled, redirect_enabled and coloring_enabled. One being off disables that entire category across every rule while the others keep working. Check them in Settings before rewriting a rule that was fine all along.

No sound at all. Three things in order: the file must be in ~/.vellum-fe/global/sounds/; [sound] enabled must be true; and the master [sound] volume (default 0.7) multiplies against each rule’s Sound volume, so a low master value quietly mutes everything. On the phone, also check the sheet’s own Sound alerts toggle.

One sound machine-guns, or a repeated line only chimes once. Both are cooldown_ms (default 500). It’s a minimum gap between repeats of the same sound — a pattern that matches ten lines in a burst plays once, not ten times. The cooldown is tracked per sound, so two different rules with two different files never suppress each other. Raise it if a spammy pattern still chatters; lower it if you’re genuinely missing fast repeats.

The indicator doesn’t light. The id in Set status must match the indicator window’s id — matching ignores case, so webbed and WEBBED are the same id, but web is not. Confirm the window is actually on screen; a status firing at a hidden window looks identical to a rule that never matched.

A dashboard adds unknown ids for you. If your Set status id doesn’t exist yet, a dashboard widget appends it and lights it. An indicator window does not — it only flips an id it already has. So a dashboard is the faster way to see a new status working before you commit to placing a dedicated indicator for it.

Your rules vanished when you switched characters. Rules save per-profile by default. Tick Global (all characters) in the GUI form, or use the (global) list on the phone, for rules that should follow you everywhere.

See also