Luggage changelog
// release notes

Changelog

Everything notable that's changed in Luggage Desktop, newest first.

Unreleased

Added
  • The map now follows you through the terrains. Discworld reports where you are out there — room.info carries a terrain flag and a pair of coordinates — and the client was reading the room identifier and throwing the rest away. So journey southeast moved the marker, because a journey hop lands on a road waypoint Quow recorded, while walking east did not, because the square between waypoints isn't in the database. The map now reads those coordinates and places you on the Whole Disc map, correcting itself against any recorded room it passes. The area name reads "terrain" while it is doing so. Where it genuinely cannot tell how far you moved — a journey, a portal, up or down — it holds position and says the area is approximate rather than inventing a step, and alt-clicking the map puts you where you actually are.
  • Dark maps. The map's gear has a Map style dropdown: Original, Dark, or Dark Nocturne. All 66 Quow maps come in each. Nocturne is the darker cut — water deeper than the land it runs through, with colour saved for the things worth picking out. Your choice is remembered.
  • Shops that sell by name now list their stock. Discworld has two kinds of shop and Luggage only understood one of them. The other answers list with "You find on offer:" and plain sentences — Five lightable torches., A large selection of parasols. — and the panel showed nothing at all for it. It now lists like any other shop, with how many of each thing the shop admits to having, and with prices where the shop gives them. These shops have no letter to buy by, so the buttons go by name: the counter sends buy 3 lightable torches, and Buy's tooltip shows exactly what it will send, because the singular has to be worked back out of the plural the shop printed.
  • Publish shows what it is about to upload. Choosing a plugin in the publish form now lists the files that will go into the zip, with their sizes, and the ones being left out with the reason. The list and the zip are built from the same place, so the preview cannot drift from what is sent. Anything named like storage.json is now left out — a stray storage.json.bak-1780961960 would previously have been published, putting somebody's own plugin data online under a name nobody would think to look for.
Fixed
  • Ghostrunner only understood single-letter directions. Typing n drew the trail; typing north, northeast, or journey north did nothing at all. The map database stores its exits abbreviated, and the typed word was being spelled out rather than shortened, so the two could never meet. Every spelling works now, along with journey, walk, climb and the rest. Those cross many rooms in one command, and the trail now runs the whole way and drains as you travel instead of flashing amber at the first step of every journey.
  • The shop panel could swallow shop output it did not recognise. While reading a shop's reply it hid every line until it met one it did not understand — so at an unfamiliar shop the top of the listing simply vanished, with no way to get it back. It now hides only the lines it is actually showing you in the panel. Anything else — a tell, a fight starting, the shop refusing you — reaches the screen as normal. The same applied to reading an item's description, where a tell arriving while the shop answered was lost, and to opening a category in a player shop.
Security
  • Session logs no longer record your password. Logging wrote the login exchange out verbatim, so a log file contained the password in plain text next to the character name — the screen hid it, the log did not. Anything typed at a password prompt is now written as [redacted], covering logging in, changing your password, and creating or deleting a character. The character name answering the login menu is redacted too. On by default, and it can be turned off in Settings > Logging.
  • The up arrow could put your password back on screen. Every line typed went into the command history, the password included, and the input box is only masked while the game has echo switched off — by the time you pressed up it was an ordinary text field again. Nothing typed at a password prompt is remembered now, and "keep last command" leaves the box empty there too.
  • Logs written before this change still contain your password in plain text. If you have shared one, or keep them somewhere synced or backed up, change your password in the game with the password command.

v1.17.0

2026-09-10Latest release
Fixed
  • A plugin's titlebar button stopped working after the plugin was reloaded. Unloading left the old button in place, so the reloaded plugin's button was skipped as a duplicate and the dead one stayed on screen — it looked fine and did nothing. Most visible when a panel was sent to its own window and brought back, but it applied to any plugin reload.
  • Variables — three silent failures. A name containing anything but letters, numbers and underscores could be stored but never expanded, and is now refused. A value containing @other was stored unresolved and reached the game as literal text; values are resolved when stored. A name with stray spaces stopped working after a restart.
  • Runaway triggers are stopped. A trigger that sends more than 8 times in 5 seconds — usually one answering a prompt with something the game won't accept, so the game keeps asking — is switched off for the session and named on screen. Triggers that only hide, highlight or note a line are never limited.
  • Import — MUSHclient "Execute" commands that called a missing alias now arrive switched off, with a note saying what they would have sent. Those aliases lived in MUSHclient plugins, so the command means nothing to the game and could set off the loop above.
  • Chat — the game's shortinlong option broke capture. With the room's short name prefixed to every line, channel messages were lost entirely and tells were filed under tabs named after the room. Chat lines are now recognised with or without the prefix, and a room name can't become a channel.
  • Chat — channels whose name is lowercase or starts with a digit were dropped entirely: (cwc) and (1000needles) produced no tab, no history and no notification. The same bug was fixed for bracketed group names in 1.10.6; the parenthesised side was missed.
  • Chat — replies to players with multi-word names showed only the first word: a reply to the ghost of Alice was filed as "You -> the".
Added
  • Ghostrunner — the map draws a glowing trail to where your typed movement will put you, before the game has answered. Type four directions in a row and the trail runs ahead of your marker, shrinking back as the game catches up. It only appears when you are genuinely ahead of it, so it stays out of the way otherwise. A speedwalk draws its whole remaining route the same way. Connections Quow inferred rather than observed are drawn fainter, so the trail is honest about its own confidence, and a wrong guess flashes amber before correcting rather than silently changing under you. Under the map's gear: colour, thickness, whether to keep the trail on screen (it follows the whole trail and widens the view if it runs off the edge, then gives your zoom back), and whether to follow exits the map doesn't know about — off by default, because guessing where an unrecorded exit went is worse than stopping. Nothing is ever sent to the game: it predicts only what you have already typed.
  • A panel in its own window still talks to the rest of the client. Plugins share a message bus and can rewrite or cancel commands you type; both used to work only within one window, so a popped-out map quietly stopped responding to "go here" from chat or search, stopped telling the combat tracker where you were, and stopped catching its own commands. Both now cross windows. If a window ever fails to answer, the command is sent anyway rather than leaving you waiting.
  • Chat can open in its own window too, from its gear — handy on a second screen while you play.
  • The map can open in its own window. Under the map's gear, Open in its own window moves it into a separate window you can put on another screen; the same control there says Return to the panel and puts it back where it was. It moves rather than being copied — two live copies of one plugin share its storage, and the map keeps the map itself there, so a mirrored one would overwrite your rooms. Closing the window by any means brings the panel back. Plugins can offer the same thing with client.panels.popOut(), returnToPanel() and isDetached().
  • Import aliases and triggers from MUSHclient (Settings → Import): point Luggage at a world file and bring your setup across. Wildcards become regular expressions and %1 becomes $1, with every conversion shown before you commit to it. Sounds can be ignored, matched against a folder of your own, or replaced with notifications. Imports land in a new profile by default, or merge into the current one with a choice of what happens to name clashes.
  • Alias tokens can be combined. A range inside a conditional — ${if5:remove ${1-2} from ${3-4}:#echo Usage: …} — used to expand to the literal text ${1-2 and send it to the game, because the closing brace of the inner token ended the outer one. Both were documented and nothing said they wouldn't work together.
  • #set <name> <value> — a command that stores a variable without sending anything, usable anywhere a command can go. Aliases could not remember anything before this, so a MUSHclient alias whose whole job was setting a variable imported as nothing.
  • Copying a report actually copies. Where the browser clipboard is unavailable — which it is in some webviews — the app used to write the text to the developer console, which is no help to the person who pressed the button. It now falls back to an older copy method, and failing that shows the text already selected so it is one keystroke away.
  • Import: a Copy diagnostics button, on the import screen and on the failure screen — the state where there was previously nothing to send. It reports what the file contained and what went wrong, including a list of the parts Luggage doesn't read yet, so an import that goes wrong can be acted on rather than guessed at. Structure only: element and attribute names, counts, script function names — never alias text, trigger patterns, passwords or character names.
  • Import handles files unlike the one it was built against. A world file saved as UTF-16 — what Windows Notepad calls "Unicode" — used to read as valid-but-empty and import nothing at all, silently; it now reads correctly, as do exported fragments with no <muclient> wrapper and files with an unhelpful extension. When a file genuinely contains nothing importable it says so, and why, instead of showing an empty screen that reads as a broken importer.
  • Import brings your MUSHclient variables and the simpler Lua across too. Stored variables come over as Luggage variables. A Lua body made only of calls Luggage has an equivalent for — printing a line, setting a variable, sending a command, starting a timer, playing a sound — is converted; anything with arithmetic, logic, a clock or another plugin in it is refused whole rather than half-converted, and listed with its code so you can rebuild what mattered. Each refusal says what actually stopped it — the subsystem it used, or the function by name if Luggage has never heard of it — so the list is useful on a file nothing here was written against. On one real world file that's 241 of 410 scripts, and 78 aliases instead of 55.
  • Variables: named values you can use in any command by writing @name. A new Set a Variable trigger action fills them in from what the game says — capture part of a line with $1, then kill @target. Listed under Settings → Variables and saved with the profile. An @name that isn't defined is left exactly as typed, and @@ writes a literal @.
  • Triggers can hide a line: a new Hide the line (gag) action, in both the trigger editor and the wizard. Hidden is not deleted — the line still reaches your session log (switchable under Logging) and still reaches plugins, so a mapper or combat tracker doesn't go blind.
  • Import keybinds too: the Keybinds plugin can take the key shortcuts out of a MUSHclient world file, leaving out the ones MUSHclient ships with. Keybinds can also now use a bare function key, and there's a new Type into the input box action for macros that fill the command line rather than sending it.
  • Chat — tabs can be closed: an × appears on hover, or on the active tab. Closing hides the tab without deleting history or stopping capture, so a channel that speaks again comes back. Reopen from the gear menu. Survives a restart.
  • Chat — teach it a channel it doesn't recognise: right-click a chat line and choose "This is chat" to capture that channel from then on. Names are stored verbatim, so symbols work without anyone writing a regular expression. Learned channels can be forgotten again from the gear.
  • Chat — "Unmatched lines" diagnostic under the gear: chat-shaped lines that no pattern captured, with non-ASCII shown as escape codes rather than glyphs. Click one to teach it, or Copy report to send the list on.
  • Chat — the Group tab now shows which group you're in, rather than staying generically labelled.
  • The Guide covers the new ground: Helpers → Guide adds sections on variables, hiding lines and coming from another client, plus the two traps that catch people out most — runaway triggers, and anchoring a pattern with ^ when the game prefixes queued replies with > .

v1.16.1

2026-09-06
Fixed
  • Chat — channel messages without a speech verb were silently dropped: Discworld sends channel lines in two shapes, (Channel) Player says: text and (Channel) Player: text. The capture pattern required a verb between the name and the colon, so the second shape matched nothing and those messages never reached the panel — no tab, no history, no notification. The bracketed group form ([group] Player: text) never required a verb, which is why the same conversation could appear half-captured: bracketed lines landed while parenthesised ones vanished. Both shapes are now captured, into the same tab.
  • Trigger wizard — "Variable text" triggers never matched anything: the wizard offers as a wildcard ("use as a wildcard for any text") and saves the result as a regular expression, but it wasn't converting the . It went out untouched, where a regular expression reads it as "zero or more of the previous character" — so a pattern like You sense that your will depart shortly. quietly meant "your" followed by any number of spaces, and matched nothing at all. No error was shown; the trigger simply never fired. Every trigger made with the Variable-text option was affected. They now build correctly, with each becoming a real wildcard. Existing ones are not rewritten — reopen them in the wizard, or replace the bare in the pattern with .+ by hand.

v1.16.0

2026-08-29
Added
  • Split a docked panel's space in two: a slot in a row of docked panels can now hold more than one panel. Drag a panel onto the middle of another one and it drops into that slot, the two sharing the space with a divider you can drag — handy when a couple of small panels don't each need a full slot. The outer edges of a panel keep their old meaning (drop beside it), and while you drag, the half you're about to land in is highlighted so it's clear which you'll get. Splits survive a restart, and a slot too small to divide sensibly won't offer to.
  • …or stack them as tabs: panels sharing a slot can show one at a time instead of side by side. Hover the group and a small button appears to switch between side-by-side and tabs; in tab mode a single row of tabs replaces the individual panel title bars, so the panel you're looking at gets the whole slot. Which tab you had open is remembered between sessions.
  • Chat — overhauled: the panel now keeps its history between sessions, so what was said while you were away is still there when you come back (500 lines, clearable from the settings gear). The old filter buttons are proper tabs — All, Tells, Group, then one per channel with the most recent speaker first — each showing a dot when it holds something you haven't read. Reading a tab clears its dot, and your own messages never raise one. Luggage works out which channel is your group by watching the join, leave and rename notices, so the Group tab follows you from group to group without any setup. Every channel also gets four switches under the gear: listen to capture it at all, gag to hide it from the main output while still capturing it, and sound and notify for a chime or a desktop notification when someone else speaks. Alerts are off until you turn them on, never fire for your own messages, and a busy channel raises one rather than a stream. Replayed history no longer masquerades as live chat: htell scrollback and anything replayed at login stay out of the panel and set nothing off.
  • Community — more screenshots and a readable README: publishing a plugin now takes up to three screenshots instead of one (shown as a thumbnail strip you can click to enlarge), and if the plugin ships a README.md it's uploaded too and surfaced behind a Read me button on the plugin's community page — the same write-up the "More" pill shows in Settings → Plugins. Plugins published before this still show their single screenshot and simply have no Read me button.
  • Plugins — observe all commands: plugins can now subscribe to a command event that fires for every command sent to the MUD, whatever the source — typed, a clicked exit, an MXP menu, a speedwalk, or another plugin. (The existing outgoing interceptor only saw the command bar.) Enables plugins like the community mapper to track movement no matter how you navigate.
  • Plugins — a teardown hook: plugins can now register client.onUnload(fn) to be told just before they are unloaded, reloaded or disabled. Until now teardown happened without warning — timers, handlers and panel DOM were simply cleared — so a plugin had no chance to save work in progress or tidy up anything it had attached outside its own panel (a hot reload or a disable fires no window event, so beforeunload was no help). The callback runs while the plugin's timers, DOM and client API are all still usable, one plugin's failing teardown can't stop the reload, and a teardown never fires twice for the same load.
  • Clickable suggested commands: when the game tells you the exact command to type — "Use 'follow accept lyna'.", 'Type "learn steal from kordane" to learn the command.', the "Use \"stop\"" prompt when you try to quit mid-fight, and item-inspection offers — that command is now a clickable link in the output. Click it to send it, hover to see it first. The wording is anchored tightly so another player can't manufacture a clickable command by quoting it at you.
  • Minimap data (room.map): Luggage now subscribes to the game's local-map GMCP feed, so plugins can render the little map of the rooms around you. Arrives independently of the in-game text map, so you can keep that switched off.
  • Plugin details: plugins can now come with proper documentation. Where one does, a More pill appears beside its name in Settings → Plugins and opens a readable write-up of what it does, how it behaves, and anything worth knowing before you rely on it — rather than leaving you to work it out from a one-line summary. Plugins without documentation simply don't show the pill. Chat is the first to carry one.
  • Settings → Danger Zone → Reset panel layout: puts every panel back where a fresh install would put it — docked positions, floating window positions and sizes, column splits, and the list of panels you've closed. Nothing else is touched: settings, profiles, plugins and all plugin data are left alone. For when panels end up off-screen, stacked wrongly, or missing, and you don't want the full "delete all local data" hammer.
  • Triggers, timers & vitals — desktop notification action: "Desktop Notification" is now an action you can attach to any trigger, timer, or vitals trigger — in the full action editor and in the guided trigger wizard — alongside send-command, highlight, play-sound, speak, and the rest. Give it a message and an optional title; a trigger's capture groups ($1, $2…) work in both, so a trigger on a name can pop "$1 has arrived" even when Luggage is in the background. Uses the same system notifications as chat — enable Luggage in System Settings → Notifications if they don't appear.
Fixed
  • Faster connect: connecting could hang for up to a minute before the login screen appeared, on networks where the MUD's IPv6 address is unreachable (some phone hotspots) — the connection sat waiting for the dead IPv6 address to time out before trying the working one. Luggage now tries all of the server's addresses at once and uses whichever answers first, so connecting is near-instant on any network.
  • Settings could quietly overwrite each other: every setting is saved by writing the whole settings file back, so two changes made at the same moment raced — the second wrote back its own stale copy of the first, and that first change vanished. The layout autosave overlapping a layout-preset save was the case that actually cost data, but nothing was immune: changing a font, a theme, a keybinding or a player colour while a layout autosave was in flight could lose either one. All settings writes now go through a single queue, so each change sees the one before it.
  • Chat: outgoing tells were recorded against only the first letter of the recipient's name — "You -> D" instead of "You -> Dilbo".
  • Chat: the floating overlay fell silent whenever the panel was narrowed to a single channel, and repeated its whole contents whenever the panel re-rendered. It now mirrors all chat regardless of which tab the panel is showing.

v1.15.0

2026-07-04
Added
  • Announcements: Luggage can now surface event banners — Discworld happenings and Luggage news — managed centrally and served live, so nothing shows when there's nothing on. Current events ride a small banner docked in a corner; scroll through several with a "N of M" indicator. Events flagged as featured open a full splash once per session that you can page through and dismiss with "don't show this again" (per event). Clicking a banner can open a link, send a command, or walk you to the event. It stays out of the way: there's no panel to manage (its settings live under Settings → Announcements), and closing the corner banner keeps it hidden until a genuinely new event arrives.
  • Shop — thief tools: the Shop panel gains optional shoplifting support, off until you tick Enable shoplifting under the panel's settings gear. Each item in an NPC shop gets a Steal button, and a quota bar reads your Thieves' Guild quota on demand and tracks how much headroom is left (Ankh-Morpork only — elsewhere the quota simply doesn't apply). Stolen goods can go straight into a loot bag of your choosing, and prices are normalized so the panel reads the same in any currency.
Fixed
  • Idle-out disconnect: when the MUD idles you out ("You idled out, sorry."), Luggage now registers the disconnect and resets to a ready-to-connect state, instead of appearing still connected and forcing you to click Disconnect before you could reconnect.

v1.14.1

2026-07-02
Fixed
  • Community — author attribution: published plugins no longer show the author's email in the "by" field. Signup now saves the display name without a race, and publishing resolves a real display name (prompting if needed) instead of silently falling back to the email.

v1.14.0

2026-06-29
Added
  • Aliases — arguments: client-side aliases now take parameters, so one alias can drop the words you type anywhere in the command. Positional $1$ $2$ …, $$ for everything, $0 for the keyword; defaults ${1:me}, ranges ${1-2} / ${3-}, conditionals ${if1:then:else}, and $$ for a literal $. The canonical Discworld $1$/$$ spelling is accepted (optional trailing $), so aliases copied from the in-game alias command paste in unchanged. Fully backward compatible — an alias with no parameter token still just appends whatever you type after the keyword.
  • Aliases nest: an alias can call other aliases by name — Luggage keeps expanding until everything is a real command (arguments flow through the chain). Depth and fan-out guards stop runaway loops and print a one-line notice.
  • Alias Wizard: a guided 3-step builder (Helpers → Aliases → Wizard) — pick a keyword, add commands one per row with insert-parameter buttons (no manual ; or escaping), then a live test that shows exactly what will be sent. The test runs through the real alias engine, so it can't drift from what actually happens at runtime.
  • Aliases — Guide tab: a new Guide tab with a reference for the alias syntax and a Cookbook of ready-made aliases you can add in one click.
Changed
  • Helpers: the panel formerly called Automation (triggers, aliases, timers, vitals) is now named Helpers.
Fixed
  • Modals: typing in a modal text field no longer leaks keystrokes into the game command bar behind it. The "start typing to focus the command bar" shortcut now stands down whenever a modal is open, so fields like the alias wizard's test box capture every keystroke even when focus arrived via a button.

v1.13.0

2026-06-14
Added
  • Custom MXP: Luggage now speaks the MUD's MXP and builds its own interactive layer on top. Objects, NPCs, and exits in the game output become clickable, each opening a menu that pairs the game's own commands — look/get for objects, consider/kill/greet and soul commands for creatures, walk an exit — with Luggage's own actions like Search the wiki and Search Quow. Inventory and shop items are clickable too. Plugins can contribute their own menu actions through the new client.contextActions API.

v1.12.0

2026-06-14
Added
  • Settings → Game Setup: an Apply Luggage's recommended options button that sets your in-game Discworld options to what Luggage's panels expect (prompt, combat verbosity, in-game map off…). Handy when you also play in another client. Leaves your combat-affecting options and MXP alone.

v1.11.0

2026-06-07
Added
  • Layout: a fifth dock zone that sits above the command bar (between the game output and the input line), complementing the existing top / bottom / left / right zones. Drag a panel to the strip just above the input to dock it there; it resizes, splits into columns, and persists like any other zone. Plugins can target it with dock: 'input-top', and there's a "Toggle Above-Command Dock" command in the palette.
  • Chat: optional Auto-hide titlebar (fade on hover) toggle in the gear menu. When enabled, the panel's title bar blends away and only fades in on hover (dock or floating). The title bar is taken out of layout so the chat messages reclaim that space instead of leaving an empty strip. Off by default; existing layouts are unchanged.
  • Map: when the floating overlay is active, the "Walk to" affordance now attaches to the top edge of the overlay. Click a room to get a green "▶ Walk to: <room>" button glued above the overlay (the in-panel exit bar isn't visible at overlay size); during a walk it shows live progress, then hides on arrival. It tracks the overlay as you drag/resize it.
  • Map: new minimap where (alias mm where) command — type it in the command bar and it reports the current room name, its area/city, the street (when one can be parsed from the room name), and a shareable luggage:// link. The command is handled locally and never sent to the MUD.
  • Theme: new dwmud.fyi theme (Settings → Theme) — light warm-parchment surfaces, dark-brown text, and a gold accent, based on the palette from dwmud.fyi.
  • Theme: new dwmud.fyi Dark (Settings → Theme) — a dark companion to dwmud.fyi: deep rich umber/sepia surfaces with golden-cream text and a saturated gold accent, keeping the light theme's warm parchment/gold identity inverted for night. WCAG AA throughout. Together with the light dwmud.fyi theme this gives a matched light/dark set.
  • Developer docs (Settings → Community → Developers): the "Using CSS Theme Variables" guide now lists the full set of theme variables (added --accent-hover, --connected, --disconnected, --danger, --danger-hover, --ui-font-family) and a style guide so third-party plugins match whatever theme the user picks — style by role, never hardcode chrome colors, use the exact variable names.
  • Theming: every built-in plugin panel now draws its UI colors (backgrounds, borders, text, headers, buttons, hover states) from the active theme's variables instead of hardcoded values. Several panels (notably Shop and the Jobs writ overlay) had broken variable names that silently fell back to dark defaults, so they looked wrong on light themes like dwmud.fyi — fixed. Genuine game-data colors (chat channel hues, vital bars, map markers, status greens/reds) are preserved.
  • Settings: Echo sent commands toggle (Settings → Command Input) — prints each command you send back into the game output, with a color picker to set the echo color. Off by default. (Matches the mobile client's command-echo option.) Respects telnet ECHO: while the server owns echo (password prompts), command echo is suppressed and the input field is masked, so passwords never appear.
  • Shop: new Show shop output in game toggle in the gear menu (Output section). The shop panel gags the captured listing into the panel by default; turn this on to also let the raw shop output pass through to the game screen. Off by default; the pager-control lines stay gagged either way since the panel auto-continues them.
  • Triggers: the Trigger Wizard can now build color triggers. Hold Alt/Option and hover any game line to get a + trigger button that opens the wizard seeded with that line's text and its colors; click a colored phrase in the captured line to match just that part. A new "Only match when the text is this color" option makes the trigger fire only when the matched text actually arrives in that color (e.g. a tell or channel in a specific hue) — the match engine now receives each line's color runs and checks the matched span's color. Existing triggers are unaffected (no color constraint by default). Pairs with the Show ANSI Codes debug toggle for discovering exact colors.
Fixed
  • Connection: losing the connection unexpectedly — server hang-up, idle-out, or a wifi/network drop — now resets the Connect/Disconnect buttons and prints "Connection to the MUD was lost." in the game output. Previously only a manual quit/disconnect did this; an unexpected drop left the buttons stuck and gave no notice. A clean server close is detected immediately (and the server's goodbye line, e.g. "Thanks for playing.", is shown first); a dead or half-open link with no prompt close is now caught by tightened TCP keepalive in ~40s instead of the OS default (~2 min).
  • Jobs: delivery Walk targeting now constrains the room/NPC search to Ankh-Morpork (the city plus its in-city sub-areas — Docks, Shades, Guilds, UU, etc.). Quow's search is global, so a same-named shop or NPC in another city could win and send you the wrong way; results are now filtered to AM map ids before a target is chosen. If nothing in Ankh-Morpork matches across the whole lookup, it still falls back to the closest match found and echoes a heads-up that it may be off-city. Applies to both the delivery targets and the writ's report-back location.
  • Jobs: the floating writ-checklist overlay was still a dark box on light themes like dwmud.fyi. Its frame colors (background, title bar, resize grip) are set inline in JavaScript, so the panel-CSS theme-variable refactor never reached them. The overlay now draws those from theme variables and follows the active theme — and the Customize editor's color pickers. The writ text, checkboxes, action buttons, and report line were bumped up a point for legibility, and the title bar / resize grip now scale with UI scale.
  • Settings: the Panel drop shadows toggle now persists across sessions. The setting had no field in the backend settings struct, so it was silently dropped on save and reverted to on at every launch.

v1.10.9

2026-05-31
Added
  • Profiles: each profile can now link a default layout preset. Open the profile editor and pick from the new "Default layout" dropdown, or use "Update selected" / "Save as new" to capture the current arrangement. The linked preset loads automatically after connecting with that profile. Missing presets are a soft fail — current layout is preserved and a one-line notice is echoed.
  • Inventory: typed i / inv / inventory now refreshes the panel automatically. Each trigger has its own enable toggle and its own "gag command output" toggle in the gear dropdown (defaults preserve current behavior: typed commands stay visible, the Refresh button stays gagged).
  • Inventory: floating overlay (drag, resize, opacity, text/bg colors, transparent-bg, compact ↔ verbose mode). Per-category visibility toggles (Holding / Wearing / Carrying / Purse) — (under) rides along with Wearing.
  • Inventory: "X ago" stamp in the toolbar header so you can see at a glance whether what you're looking at is stale.
  • Plugin API: two new host exports for plugins that programmatically reposition or resize their own floating panel. window.__luggageAutoSaveLayout() persists the current layout state (use after setting style.width / style.left directly). window.__luggageFloatPanel(pluginId, opts?) re-creates a closed/never-opened panel as a floating window so a plugin can self-summon. Both used by the wiki-cache 1.3.0 update.
Fixed
  • Chat: group-chat tabs now include lowercase / digit-leading / underscored group names ([chat], [plover], [3am], [my_group]). The original group-chat capture from 1.10.6 only matched capital-initial names, so common Discworld channels were silently dropped.
  • Logging: "Failed to create log folder: Operation not supported" on macOS — the folder picker was returning a file:///… URL that create_dir_all couldn't use. The picker now resolves to a real path, and a startup-time conversion handles folders already saved in the old format. The error message now also includes the offending path.
  • Inventory parser: now recognizes the You are unburdened (X%) by: header line (and other You are … by: variants) as the start of an inventory block, in addition to the existing You are carrying form.
  • Version reporting: Cargo.toml was out of sync with package.json / tauri.conf.json, so get_app_version (and the diagnostics panel) reported the previous version. Bumped Cargo.toml to match so minClientVersion checks in plugin manifests work against the right number.

v1.10.8

2026-05-30
Added
  • Skills v2.0 — titlebar gear with layout toggles, in-game-output-mode buttons (options output skills=list / =branched), gag toggle for capture output, and a floating pinned-skills overlay (pin individual skills from their detail view to keep their level/bonus visible).
  • Skills: discworldskills.com submission — new 🏆 toolbar button posts your skills + rating to the leaderboard. API key + dry-run + last-submitted timestamp live in the gear dropdown.
  • http_post_form Tauri command for plugins — form-encoded POST that runs server-side so requests dodge the WebView's CORS layer.

v1.10.7

2026-05-27
Fixed
  • Modals (Settings, profile editor, trigger editor, etc.) now sit above floating panel overlays. Previously a Map / Chat / Vitals / Shield overlay could obscure the open modal.

v1.10.6

2026-05-27
Added
  • Chat: group chats ([GroupName] Player: text) are now captured as their own tabs alongside parenthesised channels.
  • Map: UU Library + Shades / Medina / Skund / L-Space now switch the map image and track the player marker. Inside the Library, cardinal commands (n/e/s/w) auto-translate to the right relative command, a facing arrow shows direction, the toolbar reads out Row/Col/thaums, and the marker auto-resyncs when you pass authoritative landmarks (south door, gap).
  • Map: dropped-item recovery pins — subscribes to shield.eff.dropped from the shield-timer plugin and draws a cyan ▼ at the room an EFF got knocked off in, so you can walk back to recover it.

v1.10.5

2026-05-26
Added
  • Settings → Danger Zone: Delete all local data — factory-reset button that wipes plugins, settings, layouts, profiles, caches, and WebView storage (localStorage/IndexedDB), then auto-restarts the app. Confirmation requires typing DELETE.
  • First-launch coaching marks — four anchored onboarding bubbles (Settings, Move panels, Dock panels, Split docks) shown once on fresh installs.
Changed
  • First-launch layout docks only Map, Vitals, Chat, and Search; Favorites, Inventory, Jobs, Missions, Shop, Skills, and Timers stay installed but hidden until the user opens them from Settings → Plugins.
  • Display Size is no longer included in the bundle (the source remains in the repo for dev use).

v1.10.4

2026-05-25
Added
  • Chat: luggage:// deep links and http(s):// URLs are now clickable in the chat panel and floating overlay.
  • Jobs: delivery override table for routes where Quow's NPC search picks the wrong room.
  • Jobs: "Log delivery lookup" debug toggle in the gear dropdown.
Fixed
  • Jobs writ parser now captures location after at | in | on | near | by | inside (was: only at).

v1.10.3

2026-05-25
Added
  • client.panels.addTitlebarButton(opts) plugin API — community plugins can now add a button to their host dock-window or floating-window titlebar. The button is automatically re-injected if the panel is undocked or re-docked. Returns a {remove} handle for cleanup.
  • client.panels.registerLayoutSnapshot({ get, apply }) plugin API — lets panels round-trip their internal UI state (overlay visibility/position, toolbar toggles, etc.) through named layout presets. Built-in panels (Jobs, Map, Shop, Favorites, Missions, Inventory) participate.
  • Vitals v2.0 — gear icon in the titlebar opens a settings dropdown with toggles for HP/GP/XP/XP-HR/Alignment/Burden rows, a button to open the existing regen settings, and a customizable floating vitals overlay (opacity, text/background colors, transparent background).
  • Chat v2.0 — gear icon in the titlebar opens a settings dropdown with a toggle for the channel-tabs row and a customizable floating chat overlay (opacity, text/background colors, draggable and resizable).
  • Map v2.0 — gear icon moved to the host titlebar; settings dropdown now also includes toggles for the toolbar row (room name, maps dropdown, zoom/share/clear buttons) and the exits row. A new "Floating map overlay" toggle pops the map canvas out into a draggable, resizable overlay so you can keep the map visible while the panel itself stays minimal. Hold Shift while dragging on the overlay canvas to move the window (mouse alone still pans the map).
  • Favorites v2.0 — gear icon in the host titlebar opens a settings dropdown with a toggle to hide the header row (Favorites title + Add button) for a cleaner look.
  • Inventory v2.0 — gear icon in the host titlebar opens a settings dropdown with a toggle to hide the toolbar row (Inventory title, item count, filter input, refresh button).
  • Jobs v2.0 — gear icon in the host titlebar opens a settings dropdown with toggles to hide the toolbar row and to pop the writ checklist (deliveries, report location, advert picker) into a draggable, resizable floating overlay. The writ text and header stay in the panel. Drag the overlay by its title bar; corner ◢ resizes it.
  • Jobs: smarter delivery-target resolution — specific NPC names (e.g. Cynthia Potts, Mr Founder) resolve via direct NPC lookup first; generic names (shopkeeper, barkeeper) skip NPC search and use location + connectivity instead. splitLocationPair + findRoomByContext parse "X on/at/in Y" and verify a structural connection so the actual shop wins over similarly-named nearby rooms.
  • Missions v2.0 — gear icon in the host titlebar opens a settings dropdown with a toggle to hide the toolbar row (Missions title, summary, sort dropdown, clear button).
  • Shop v2.0 — gear icon in the host titlebar opens a settings dropdown with toggles to hide the toolbar row (Shop title, name, currency selector, refresh) and the status row (item count / hints).
  • Floating-window collapse button — collapses the window to just its titlebar and back. State persists across reloads.
  • "Update available" badge on community plugin cards — outdated plugins now show an orange badge with the target version and a matching card outline, so you can see which one needs the update without clicking into each card. Hover the badge for the full installed-vs-available diff.
Changed
  • Floating-window minimum height reduced from 150px to 60px so collapsed windows fit cleanly.
  • Panel drop-shadow toggle (added in 1.10.1) now uses a body class so plugins can opt out of shadow without specificity wars.
Fixed
  • Skills panel "Learn / Advance" tab — the Learn from Player and Self-Teach buttons were sending malformed learn N levels of <skill> from <player> (which the MUD doesn't accept). They now send the correct request commands — teach me N levels of <skill> from <player> and teach N levels of <skill> to me — and are relabeled Request Teach / Request Self-Teach to make it clear the user still types learn <skill> from <player> to confirm once the teacher's autoteach offer fires.
  • Speak Text trigger action — wakes Bluetooth speakers via the same helper PlaySound uses so the first phonemes aren't clipped; cancels any stuck queue; waits up to 1s for voiceschanged on the first call (WKWebView quirk where getVoices() returns [] until then); sets lang/rate/volume explicitly; logs on error instead of swallowing.
  • Layout presetsloadPreset now calls addMissingPlugins so built-in presets (which only list a few panels) no longer orphan community or newly-added plugins in document.body.
  • Plugin update detection now uses a proper semver compare instead of string inequality. Previously, any version mismatch (including an installed version newer than the community listing) falsely showed "update available" on the launch banner and the plugin detail page.

v1.10.1

2026-05-21
Added
  • Free-position panels — hold Alt (Option on Mac) while dragging to disable docking and snapping. Panel stays exactly where you drop it.
  • Snap-only positioning — hold Shift while dragging to snap to edges of other panels and docks without actually docking. Panel keeps its original size.
  • Trigger Catalog — browse 170+ curated triggers across 17 categories with individual selection and inline colored previews. Replaces the old pack system. Triggers adapted from Quow, Frazyl, and Umiven.
  • Trigger Wizard — guided step-by-step trigger builder with 5 match types including word lists with exclude words. No regex knowledge needed.
  • Line height slider in Settings > Appearance for adjusting game output spacing. Useful for ASCII art alignment.
  • Delete All buttons on Triggers, Aliases, Timers, and Vitals tabs.
  • Speak Text trigger action now functional.
Fixed
  • Discworld weekday order corrected (Monday through Octeday, not Sunday-first).

v1.10.0

2026-05-17
Fixed
  • Terminal type now reports as xterm-256color instead of Luggage, fixing "Unknown terminal type" on Discworld's term network.
  • Auto-login no longer times out on successful login — added "inventory regeneration complete" as a completion signal.

v1.9.6

2026-05-13
Fixed
  • Telnet parser: fixed GMCP subnegotiation handling across split TCP segments.
Improved
  • Confirmation dialog when disabling plugins; disabled plugins now visible in diagnostics.

v1.9.5

2026-05-12
Fixed
  • GMCP negotiation on Linux: improved handshake timing and reliability.
Improved
  • Diagnostics v2.0: expanded report with GMCP module counts, registered modules, module tracking, and detailed plugin system info.

v1.9.4

2026-05-01
Improved
  • Community marketplace: additional admin moderation tools.

v1.9.3

2026-05-01
Improved
  • Item search results now list shops before NPCs, still sorted by closest distance within each group.

v1.9.2

2026-04-30
Fixed
  • Jobs panel: delivery lookups for generic NPCs (shopkeeper, receptionist, old lady, etc.) now use the location from the writ to find the correct one, checking both the room name and neighboring exits.
  • Jobs panel: NPC name searches now handle Mr./Mrs./etc. punctuation variations.
  • Jobs panel: NPC lookups now use player proximity for better default results.

v1.9.1

2026-04-29
Improved
  • Destination marker on the map now pulses with an animated ring and glow, making shared locations and click targets much easier to spot. Default color changed from green to bright pink.

v1.9.0

2026-04-29
Added
  • Drag-to-reorder panels within dock zones — drag a panel titlebar to rearrange its position among siblings. Dragging outside the zone undocks it to a floating window as before.

v1.8.0

2026-04-27
Added
  • Location sharing — click the 📍 button on the map toolbar to copy a luggage:// link to your clipboard. Paste it in a tell or channel; other Luggage users see it as a clickable blue link that jumps their map to that location. Click a room on the map first to share that room; otherwise shares your current location.

v1.7.0

2026-04-24
Added
  • Community plugin update notifications — on startup, the app checks installed plugin versions against the community repository and shows a banner if updates are available. Click "Open Community" to go directly to the browse page.

v1.6.1

2026-04-20
Fixed
  • Chat plugin: multi-line messages are now captured in full. Previously only the first line was captured when the MUD wrapped long messages across multiple lines.
  • Command input bar now scoped to the game output area instead of spanning the full window width. On ultrawide or multi-monitor layouts with side-docked panels, the input sits under the game output where it belongs.

v1.6.0

2026-04-20
Added
  • Jobs plugin: deliver button on each unchecked delivery item — pre-fills the deliver command in the input, press Enter to send.
  • Jobs plugin: countdown timer in the toolbar showing time remaining before the current job expires. Turns red under 10 minutes. Persists across sessions. Requires options output temporal_reality set to Roundworld.
  • Settings export/import — export your settings, profiles, and plugin data to a zip file for easy transfer between PCs. Import on another machine and restart. Passwords are not included.

v1.5.0

2026-04-18
Added
  • Jobs plugin: search button on each delivery item — click to search the item in the Search plugin. Strips articles, quantities, and singularizes automatically. Works for both checklist and single-item delivery writs.
  • Search plugin: other plugins can now trigger item searches via the search.items bus event.
  • Jobs plugin: deliver button on each unchecked delivery item — pre-fills the deliver command in the input, press Enter to send.
  • Jobs plugin: countdown timer in the toolbar showing time remaining before the current job expires. Turns red under 10 minutes. Persists across sessions.
Fixed
  • Shop plugin: Lancre Sovereign prices (LSov) were not recognized for currency conversion. The parser now handles the full LSov prefix alongside the short LS form.
  • Jobs plugin: Walk/Map buttons for delivery targets now search by NPC name first instead of the parsed location text, which was often truncated by MUD line wrapping and matched the wrong room.

v1.4.1

2026-04-16
Fixed
  • Vitals triggers now fire during simulated regen, not just on GMCP updates. Previously, triggers like "play sound when GP reaches 100%" would never fire while idle because the MUD only sends vitals data on user input.

v1.4.0

2026-04-16
Added
  • "See Changes" link in the update notification banner — opens the changelog for the new version in your browser. URL is server-controlled, no client update needed for future changes.

v1.3.1

2026-04-15
Fixed
  • Skills plugin: stats (Constitution, Dexterity, etc.) were not captured on refresh because the MUD outputs them in a multi-column table format. The parser now extracts all stats per line.

v1.3.0

2026-04-14
Added
  • Display Size plugin — shows the current game output window dimensions in columns × rows. Click "Set cols to match" or "Set rows to match" to pre-fill the matching command; press Enter to send. Updates live as you resize.
  • Setting: "Keep last command after sending" (Settings > Command Input) — when on, the sent command stays selected in the input. Press Enter to send again, or start typing to replace it.
  • Tab auto-complete dictionary now persists across sessions.
Fixed
  • ANSI escape sequence fragments (e.g. 0m, ;49, [39) occasionally leaking as visible text when the connection paused mid-sequence.
Changed
  • Command history no longer records back-to-back duplicates.

v1.2.4

2026-04-13
Added
  • Tab auto-complete in the command input — press Tab to complete a partial word based on MUD output. Shift+Tab cycles backwards. Most recently seen words are suggested first.
  • Font selection in Settings > Appearance — independently choose fonts for game output (monospace), UI, and chat. Lists all installed system fonts.
  • Clickable URLs in game output — http/https links are underlined and open in your browser on click.
  • Output search (Ctrl+F) — find text in the game output with highlighted matches, match count, and prev/next navigation.

v1.2.3

2026-04-11
Changed
  • Inventory plugin no longer auto-refreshes after drop/give/put actions — click the refresh button to update the panel.

v1.2.2

2026-04-11
Fixed
  • Community sign-in on Linux and macOS release builds.

v1.2.1

2026-04-10
Added
  • Session History plugin — browse, search, and read saved session logs from Settings. HTML logs render with full color, plain text and ANSI display in a scrollable reader. Includes file filtering, in-log search with highlighting, and log deletion.
  • Inventory plugin: "Give to..." right-click submenu for held and carried items — lists players detected in the room (bold cyan) with title stripping for accurate MUD commands
Fixed
  • Commands hanging intermittently — AppState mutex was held across async network writes, causing all operations to queue behind slow TCP flushes. Mutex is now released before awaiting sends in all command, speedwalk, and GMCP registration paths.

v1.2.0

2026-04-10
Added
  • Session logging — save game sessions to file as HTML (preserving ANSI colors), plain text, or raw ANSI. Configurable in Settings > Logging with options for timestamps, sent command logging, auto-start on connect, and auto-stop on disconnect. HTML logs open in any browser with a dark theme matching the game output.

v1.1.3

2026-04-08
Fixed
  • Chat plugin: channel detection rewritten — no longer invents phantom channels from parenthesised text in room descriptions, and now correctly captures real Discworld channels including emote-form messages (e.g. "(One) Name wisps that ...") and messages with mixed-case or stylised talker/verb names
  • Chat plugin: removed dead GMCP comm.channel code path (Discworld does not emit it)
Added
  • Chat plugin: channel tag in the panel now inherits the ANSI color the MUD sent for the channel, matching in-game channel coloring

v1.1.2

2026-04-07
Fixed
  • Shop plugin: long category headers and wrapped empty-category messages no longer leak into MUD output or cause categories/items to be missed when listing player shops
  • Shop plugin: category item capture now correctly handles shop preambles (buying messages, URLs) before the first item line

v1.1.1

2026-04-06
Fixed
  • Plugin minClientVersion field now correctly passed through to community publish flow
  • Re-publishing a plugin at the same version no longer blocked (allows metadata updates)

v1.1.0

2026-04-06
Added
  • Nearby community plugin — shows NPCs and players in surrounding rooms parsed from MDT data, with filtering, filter presets, entity alerts (with configurable actions and highlighting), and click-to-speedwalk
  • Plugin minClientVersion field — plugins can now declare a minimum Luggage version in their manifest; incompatible plugins are blocked from loading with a warning in the plugin manager
  • Developer documentation updated with minClientVersion usage
Changed
  • Community plugin publish flow now includes minClientVersion in Firestore metadata
  • All existing community plugins updated with minClientVersion for consistency

v1.0.1

2026-04-05
Fixed
  • Closed panels no longer reopen as floating windows on restart
  • Divine Hand and Mindspace community plugins now work correctly as standalone plugins
  • Mindspace Refresh button now also reloads skill data for the current character
  • Cycle history popup now displays as a proper modal overlay
  • Whisper context menu command now uses correct syntax
  • Command palette shortcut corrected in changelog
Added
  • Feedback link in sidebar, Plugins, Community, Help, and About sections
Changed
  • Streamlined built-in timer features
  • Updated help documentation for Timers section

v1.0.0

2026-04-05
Initial Release
  • Full telnet connection with GMCP support
  • Rich ANSI color rendering (256-color and truecolor)
  • Connection profiles with auto-connect and auto-login
  • Command history with arrow key navigation
  • Clickable exits parsed from room descriptions
  • Clickable player names with context menus (look, finger, tell, whisper)
  • Player title stripping for accurate name detection
  • Speedwalk engine with compact notation, progress tracking, and step delay
  • Encrypted credential storage (AES-256-GCM)
  • Flexible docking system with left, right, and bottom zones
  • Tab-based panel switching within dock zones
  • Floating windows with drag, resize, and snap-to-grid
  • Layout presets (save, load, delete)
  • 18 built-in themes plus a custom theme editor
  • UI scale and game text size controls
  • Vitals — HP, GP, XP, and burden bars with GP regen estimates
  • Map — Visual room mapper powered by Quow's Discworld database with pathfinding, speedwalk integration, area browsing, and room search
  • Chat — Channel message capture with tell and channel filtering
  • Skills — Full skill tree browser with bonus calculator and TM tracking
  • Shop — Interactive shop panel with multi-currency conversion and Quow item lookup
  • Inventory — Tree view with containers, equipment, purse display, and item actions
  • Jobs — Job Market browser with writ tracking, delivery checklists, and map integration
  • Missions — Cooldown tracker for 24 mission types with live countdowns
  • Favorites — Bookmark locations and speedwalk back to them
  • Souls — 659 soul commands across 16 categories with adverb support and favourites
  • Room lookup, area maps, exit connections, and room type coloring
  • Search items, NPCs, and rooms with click-to-walk results
  • Map image overlays from Quow PNG files
  • Browse, install, update, and rate community-created plugins
  • Publish your own plugins with description and screenshots
  • Community guidelines, developer documentation, and moderation tools
  • Command palette (Ctrl+Shift+P) with search and keyboard navigation
  • Customizable keybindings with chord support
  • Plugin system with developer hot-reload