SotA's inventory finished its move to UI Toolkit this month: a sortable five-column table, category tabs, a search box, one window per container with working z-order, and an account-wide item search. That is a strong skeleton. This document surveys what the rest of the genre learned about inventories, measures our window against it, and proposes sixteen improvements, most of them zero-server-cost, each grounded in the actual classes that would carry them.
Ultima Online shipped the most beloved freeform inventory ever made, and then spent twenty-five years retrofitting structure onto it: the official Enhanced Client added grid container views, ClassicUO added auto-sorting grids with item pinning and per-container search, UO Outlands made grid loot the PvP standard, and players ran Razor "Organizer agents" for two decades to do what the UI would not. The lesson is not that freeform was wrong; it is that 95% of inventory interactions are retrieval, not placement, and retrieval wants query power, protective flags, and routing automation.
SotA's list/table inventory is already on the right side of that history. EVE Online, the only major MMO with a pure table inventory, shows the end state: sortable, customizable columns plus saved named filters. Measured against that bar and the modern QoL canon (PoE's search, WoW's absorbed addon features, ESO's junk system, FFXIV's cross-silo item search, Terraria's quick-stack), our gaps cluster in three places:
Sixteen proposals follow. Thirteen are pure client work with zero server traffic (filters, search, sorting and columns all run on data the client already holds). Exactly three need server-side persistence, and each is flagged with its data-migration cost. Ten of the sixteen are small enough to ship one at a time as quality-of-life patch notes.
| # | Proposal | Tier | Size | Server | One-line pitch |
|---|---|---|---|---|---|
| S1 | Attribute search tokens | 1 | M | none | wt<5, val>100, is:locked in the one search box |
| S2 | Dim, don't hide | 1 | S | none | search dims non-matches instead of removing rows |
| S3 | One-row tabs + More | 1 | S | none | 5 pinned tabs + overflow; kills the 4-row tab wrap |
| S4 | Column picker | 1 | L | none | show/hide columns; add Type, Rating, Crafted By, Looted |
| S5 | All Bags view | 1 | M | none | flatten grows a Container column + open-containing-bag |
| S6 | Capacity meters | 1 | S | none | fill bars for item count and weight |
| S7 | Favorites surfaced | 1 | S | none | lock becomes a star column + bulk-action shield |
| S8 | Recent loot done right | 1 | S | none | Reset button, recency sort, NEW badge, stamp fixes |
| S9 | State that remembers | 1 | M | none | per-container rects and sort; category survives relog |
| S10 | Tooltips + compare | 1 | M | none | hover tooltips return; equipped-item comparison |
| S11 | Saved searches | 2 | M | none | save query+tab+sort as your own pinned tab |
| S12 | Quick Deposit | 2 | L | none | one click pushes stacks into containers that already hold them |
| S13 | Grid virtualization | 2 | L | none | row pooling; the enabler for bank-scale everything |
| S14 | Junk + Sell All Junk | 3 | XL | ItemFlags bit | mark junk, liquidate at any merchant |
| S15 | Container colour tags | 3 | M | item property | 8 colours; renames already exist, finish the identity kit |
| S16 | Sort to Bags | 3 | XL | container property | assign categories to containers, route in one click |
The UI Toolkit inventory family is complete on the migration branch: backpack, per-container windows, bank, lot storage, rewards, merchant and vendor windows, the crafting station, the deco palette, and an account-wide Search All My Stuff window (/findmystuff) that spans inventory, bank, lots, mail and vendor listings. Multiple container windows open simultaneously and stack correctly. That is more than many shipped MMOs have, and this document deliberately builds on it rather than re-proposing any of it.
| Item Name ▲ | Qty | Weight | Durability | Value |
|---|---|---|---|---|
| Belt Pouch (6/20) | 1 | 4.2 | 12 | |
| Reagent Sack (38) | 1 | 5.1 | 8 | |
| Zentu's Breastplate | 1 | 12.0 | 55/55 | 3,500 |
| Bandage | 55 | 5.5 | 55 | |
| Black Iron Longsword of Fire | 1 | 6.4 | 43/61 | 920 |
| Bone Armor Chestpiece | 1 | 9.1 | 12/50 | 240 |
| Garlic | 120 | 1.2 | 120 | |
| Recipe: Obsidian Potion | 1 | 0.1 | 150 | |
| Solania's Censer | 1 | 0.0 |
Item Name / Quantity / Weight / Durability / Value, hard-coded. Sorting works and persists, but there is a hidden sixth comparator (Last Used) no header can reach. Proposals S4, S8.One pipeline serves both the old NGUI list and the new UITK grid. Category sets live in InventoryTabFilter; the show/hide options and category predicate run in InventoryListUI.ItemShouldBeVisible; the view applies its search text; and one shared helper, InventoryItemListHelper, owns every column's text, colour and sort comparison, including the fixed pre-chain that floats containers to the top and pins quest items where each window wants them. Every proposal below extends one of these nodes. None forks the pipeline, which is how the two UIs have stayed in agreement through the migration.
flowchart LR A["Container contents\nGetAllItems / GetAllItemsRecursive"] --> B["InventoryTabFilter\ncategory ItemType sets"] B --> C["ItemShouldBeVisible\nlocked / quest / equipped options"] C --> D["View search\nFilterItems (name substring today)"] D --> E["InventoryItemListHelper\nsort pre-chain + column comparison"] E --> F["SotAUitkInventoryGrid\nrows, colours, selection, drag"] style D stroke:#c9a55a,stroke-width:2px style E stroke:#c9a55a,stroke-width:2px
UO's freeform backpack was a real pixel-coordinate space: every item sat at an (x,y) inside its container, could overlap anything, and could hide anything. Players loved it for expression — potion rows, the rune book always top-left, valuables buried under other items so thieves had to dig. And they hated it for retrieval: vendor restocks dumped indistinguishable heaps on one corner, nothing counted your 124-of-125 items, and organizing was pure manual labor. Every surviving UO client eventually bolted structure on top, and the most popular third-party tools ever built for UO are inventory automation.
Path of Exile: one Ctrl+F box searches an item's entire text; matches glow, everything else greys out but stays clickable. Affinities route deposited items to their assigned tab from anywhere. WoW: nearly every beloved bag-addon behavior (search-dim, sort button, junk coin icon and sell-all, reagent auto-deposit, new-item glow) was eventually absorbed into the default UI, which is the strongest possible evidence these are low-controversy features. ESO: mark-as-junk moves clutter to a Junk tab and one button liquidates it at any merchant. FFXIV: /isearch finds an item across every silo you own, which is the only reason players tolerate the silos. Terraria: Quick Stack pushes every stack into whichever nearby chest already holds that item, zero configuration; favorites are exempt from every sweep. Tarkov: custom name + colour tags on identical containers. EVE Online: the only pure-table MMO inventory, and it converged on exactly customizable columns + saved named filters.
| Capability | UO classic | UO modern* | PoE | WoW | ESO | FFXIV | Terraria | SotA today | SotA proposed |
|---|---|---|---|---|---|---|---|---|---|
| Attribute search (beyond name) | ○ | ◐ vendor | ● | ◐ addon | ○ | ○ | ○ | ○ | ● S1 |
| Dim-don't-hide search | ○ | ○ | ● | ● | ○ | ○ | ○ | ○ | ● S2 |
| Sort by column | ○ | ● | ○ | ◐ | ● | ◐ | ○ | ● | ● +S8 |
| Customizable columns | ○ | ○ | ○ | ◐ addon | ○ | ○ | ○ | ○ | ● S4 |
| Saved filters / smart tabs | ○ | ○ | ◐ | ● | ◐ addon | ○ | ○ | ○ | ● S11 |
| Favorites / lock | ○ | ● pin | ○ | ◐ addon | ◐ addon | ◐ | ● | ◐ buried | ● S7 |
| Junk + sell-all | ○ | ○ | ○ | ● | ● | ○ | ◐ | ○ | ● S14 |
| Quick-stack / deposit-to-matching | ◐ scripts | ◐ | ● | ● | ◐ | ○ | ● | ○ | ● S12/S16 |
| Merged all-bags view | ○ | ○ | ○ | ● addon | ○ | ○ | ○ | ◐ flatten | ● S5 |
| Per-container identity | ◐ dye | ◐ | ● | ○ | ○ | ○ | ● | ◐ rename | ● S15 |
| Capacity meters | ○ hidden | ◐ | ● | ● | ● | ● | ● | ◐ text | ● S6 |
| Cross-silo owned-item search | ○ | ○ | ◐ | ◐ addon | ○ | ● | ○ | ● built | ● +S1 grammar |
| Multiple container windows | ● | ● | ○ | ◐ | ○ | ○ | ○ | ● built | ● +S9/S15 |
● native · ◐ partial or third-party · ○ absent. *UO modern = Enhanced Client, ClassicUO, Outlands. "SotA today" = the UITK windows on the migration branch, 2026-07.
The one search box learns tokens, mixed freely with plain text: type:reagent, wt<5, val>100, dur<25%, qty>=50, quality>3, crafted:Anna, is:locked, is:artifact, is:broken, is:renamed, is:quest, is:container, and a - prefix to negate. "iron wt<2" finds light iron things. A small (?) beside the box opens a syntax card whose examples insert themselves on click, so nobody has to memorize anything.
Seen in: PoE (one box searches full item text), UO Pub 85 vendor search (type + property + value criteria), EVE named filters.
| Item Name ▲ | Qty | Weight | Value |
|---|---|---|---|
| Belt Pouch (6/20) | 1 | 4.2 | 12 |
| Zentu's Breastplate | 1 | 12.0 | 3,500 |
| Bandage | 55 | 5.5 | 55 |
| Garlic | 120 | 1.2 | 120 |
| Healing Potion | 12 | 3.6 | 300 |
| Nightshade | 140 | 1.4 | 420 |
New shared pure class (working name InventoryQuery) beside InventoryItemListHelper: parse once per query change into a predicate list, evaluate per item inside SotAUitkBackpackWindow.FilterItems after ItemShouldBeVisiblePublic. Every field is already client-resident: Weight, GetItemValue(), Durability/GetMaxDurability, ItemQuality, ItemRating, CraftedBy, Archetype.ItemType, plus the state flags. type: accepts the category filter keys by reusing the InventoryTabFilter sets, so the query language and the tabs can never disagree. The same parser drops into Search All My Stuff verbatim: one query grammar account-wide.
Ships with three free parity fixes: diacritic folding (hoist the NGUI list's text cleaner into the shared helper), matching renamed items' original names (the helper already computes them; the UITK search just never asks), and the dead-wired gold readout (its build condition requires a delegate that the owning window always assigns; one-line gate fix).
Perf: predicates are plain field reads, same cost class as today's substring test; cache cleaned strings per item, never derive per keystroke. Avoid archetype-loading predicates (the Pet & Mount category's known trap). Token keywords stay English in v1, like PoE. Parser is a pure-logic EditMode test target.
While you type, non-matching rows grey to about a third opacity instead of vanishing; matches get a thin gold accent bar. Your eyes keep their place, the list never jumps, and a Dim | Hide switch on the chip row (see the S1 mockup above) restores today's behavior for anyone who prefers it.
Seen in: PoE Ctrl+F, WoW's native bag search, Minecraft JEI. The pattern every grid UI converged on.
Dim mode is secretly a performance fix: it restyles existing rows in place (a USS class toggle on the row map) instead of triggering the full clear-and-rebuild the search path causes today, so scroll position survives every keystroke. Selection semantics: select-all applies to matches only; dimmed rows stay individually clickable. Hide mode keeps the current rebuild path. On very large lists (bank) dim renders all rows; until S13 lands, hide remains the default there.
Five pinned tabs plus a More menu replace the nineteen wrapping buttons. Picking an overflow category swaps it into the last tab slot as the active tab. The More menu shows live counts per category, hosts the Recently Looted Reset button, and lets players pin their own five. The tab strip never wraps again, returning roughly 84 vertical pixels, three item rows, at minimum window size.
Seen in: every browser's tab overflow; ESO's two-level filter tabs.
The category data is already a clean ordered list (19 player / 17 container entries); this only changes how the strip renders it. Counts are computed once when the menu opens, one pass over the current list; the Pet & Mount count computes last because its predicate is the expensive one. Pinned set persists per window type. Default pins: All Items, Equipment, Consumable, Material, Reagent.
A gear at the right edge of the header row opens a Display Options card: check the columns you want, per window. Beyond today's five, the item data already carries everything needed for Type, Rating, Quality, Crafted By, Looted (relative age), and Container (with S5). Your bank can be Name + Type + Value; your repair pass can be Name + Durability. The name column is not hideable, and a soft cap of eight visible columns keeps rows fast and readable.
Seen in: EVE Online, the one MMO that already lives where our table is heading.
The grid already has a programmatic column seam (the jukebox list uses it); the hard-coded five are only the default. Work: persist an ordered column list per window key; add text/colour/comparison cases for each new column to the shared helper so the old UI could render them too; make the width/alignment tables id-keyed; rebuild the header from the dynamic set (the header-scroller width sync already handles change). The Rows section absorbs the three legacy visibility toggles that currently hide behind an NGUI-only right-click menu, plus the containers checkbox, decluttering the main window. Every new column id needs a localized header string up front; an unknown id logs a missing-translation warning per row per frame, so no column ships before its string.
Perf: each visible column is one more label per row per rebuild. The picker is itself the mitigation: players trade columns rather than stacking them, and the soft cap of eight bounds the worst case. Minimum window width derives from the visible set.
"Show Objects in Containers" already flattens nested bags into one list; what it lacks is attribution. An All Bags toggle promotes it: a Container column says which bag every row lives in (with S15's colour swatch), right-click gains "Open Containing Container", searching works across all of it with an in:belt pouch token, and search reaches inside closed bags even when the toggle is off, annotating hits with their source bag. The "which bag is it in" question dies.
Seen in: WoW Bagnon (the merged-window addon), FFXIV /isearch location results.
| Item Name ▲ | Qty | Weight | Container |
|---|---|---|---|
| Belt Pouch (6/20) | 1 | 4.2 | Backpack |
| Reagent Sack (38) | 1 | 5.1 | Backpack |
| Bandage | 55 | 5.5 | Belt Pouch |
| Garlic | 120 | 1.2 | Reagent Sack |
| Mandrake Root | 86 | 0.9 | Reagent Sack |
| Nightshade | 140 | 1.4 | Reagent Sack |
The flatten machinery exists (recursive enumeration; containers still float to the top; drag and context actions already work on nested rows in that mode). New parts: the Container column (one parent-name lookup per row, cached on the row info), the context action (gated on the item not sitting at the root, invoking the exact window-open path double-click uses), and search-time recursive enumeration at the view level so the global option is not flipped as a side effect. Bag contents are client-resident, so this is all zero-RPC. Durability and Value auto-hide in this view at minimum width; the picker remembers a separate column set for it. Cross-silo merging (bank + backpack in one window) stays rejected; Search All My Stuff owns that question.
Container windows get a thin fill bar for item count (and the backpack for weight): gold normally, amber at 80%, red at the limit. UO taught this lesson for twenty-five years with an invisible 125-item cap; players should never discover "container full" one deposit too late. The numbers already render as footer text; this makes them legible at a glance.
Seen in: effectively everything since UO; the absence is the anomaly.
Reuses the exact counts the footer text already computes each refresh (no second recursive count). One new visual element per window; fixed rows keep flexShrink:0 per the layout trap. Mockup under S15 below.
SotA already has a favorites system: Lock To Inventory protects an item, floats it to the top, and has its own category. It is just invisible until you right-click. Proposal: a slim padlock/star cell on every row, click to toggle, filled gold when locked. And one codified contract: every bulk action, present and future (Take All, Quick Deposit, Sort to Bags, Sell All Junk), skips locked items. That contract is what makes the automation proposals below safe to ship.
Seen in: Terraria favorites (exempt from every sweep), D4 favorites, ESO ItemSaver marks.
State, toggle transaction, context actions and sort behavior all exist; this adds a narrow icon column (default-on via S4's column set) and a single shared predicate, something like IsProtectedFromBulkActions (locked, quest, no-trade, packaged-for-trade), that S12, S14 and S16 are required to call. One toggle is one existing transaction, user-initiated.
The Recently Looted tab exists but wobbles. Four fixes: (1) the Reset button returns (the old UI had it; the new one lost it, see the S3 More menu); (2) the tab sorts newest-first while active, using the recency comparator that already exists but that no column header can reach; (3) rows added since you last opened the window get a soft NEW tint that clears once seen; (4) the timestamp coverage gets honest — today single-item drags and merchant purchases never mark items as recent, while shuffling things between your own bags wrongly does.
Seen in: WoW's new-item glow; SotA's own NGUI window for the Reset button.
The timestamp is client-side, already maintained. Stamp fixes are one line each in the single-transfer and purchase paths, and dropping the stamp when source and destination share the same root inventory. The recency comparator currently returns early and skips the shared containers-first chain; wiring it into a header (or the Recently Looted tab) means fixing that inline copy, with a sort-chain test. NEW tint = one long comparison per row against a per-window last-opened pref; background tint, not an animation, because rebuilds would restart animations.
Three memory upgrades, all local prefs: (1) the selected category tab survives relog (today it resets; sort already persists); (2) owned containers remember their own window rect, sort and category, keyed by bag identity with a small LRU cap, so the reagent chest opens tall-and-thin by the crafting table and the deed box opens small, instead of every chest sharing one setting; (3) a click on a second column header keeps the first as tie-break, so Value-then-Weight ordering behaves like a spreadsheet.
Seen in: UO Enhanced Client per-container view options; every desktop app ever.
Per-container keys ride the existing prefs-key mechanism (sort persistence derives from the key automatically). Transient world/loot containers keep today's shared behavior, gated on inventory context, so corpse windows do not pollute the store. The window-reuse trap applies: rects must reload when the window is re-pointed at a different container, not only on first build. Secondary sort composes inside the per-column slot of the shared comparison; the containers-first pre-chain stays outermost.
Hovering a row shows the item tooltip again — the UITK grid lost them in the port, and the Show Tooltips option currently does nothing there. Once tooltips exist, equipment rows gain the modern half: the equipped counterpart appears alongside with stat deltas (rating, durability, value, effect counts), so upgrade decisions happen in the bag.
Seen in: compare-on-hover is the WoW/ESO/FFXIV/D4 baseline; its absence reads as a bug to new players.
Hover via the project's reliable mouse events with a short delay; content from the same builder the NGUI rows use, extracted so both views share one truth; rendered in the established tooltip layer band. Rebuilds can destroy a hovered row (the quarter-second change poll), so the tooltip keys to the item and re-anchors via the row map; suppressed while dragging. Compare pass starts with rating/durability/value/effect-count deltas; per-effect diffing is the iterative tail. Slot lookup and all stats are client-side. No equip-requirement data exists, so the compare stays honestly stat-only.
A star beside the search box saves the current combination — query, category, sort, view mode — under a name you choose. Saved views appear as your own chips ahead of the built-in tabs: "Repair run" (dur<25%), "Sellables" (val>50 -is:locked), "Regs". This is the long-term answer to nineteen fixed categories: the taxonomy becomes yours.
Seen in: EVE named filters, WoW BetterBags custom categories, PoE's community regex libraries (externalized because the game lacks this).
One local JSON pref: name, query, category key, sort, chips. Applying one is just setting the states and refreshing. V1 is save / apply / delete with a cap of about twelve; no editor UI. Names are player text, no localization. Without S1 this is only saved tabs, so it sequences after.
One button on any container you can deposit into: every unlocked stackable in your backpack that already has a matching stack in this container jumps in, batched as a single move. Open the reagent chest, click Quick Deposit, done. Zero configuration — the container's contents are the configuration. A toast reports the result and offers one-click Undo while it lingers. Locked, quest, no-trade and packaged items are never touched (the S7 contract).
Seen in: Terraria Quick Stack, the most-copied inventory feature of the last decade; WoW's reagent deposit; twenty years of UO Razor Organizer scripts.
Client-side scan (stackable + matching stack exists in target, respecting capacity and bank caps), then one batched move transaction per target container, which the transaction layer already supports. Stack matching must reuse the exact predicate the stack-combine path uses, or crafted-item moves would bounce. Failures surface through the existing pending/bugged feedback colours plus a per-batch toast. Undo is the reverse batch, offered while the toast lives. Coordinate naming with the in-flight crafting-pull epic, which is this feature's retrieval-direction mirror.
Today every keystroke, tab click and refresh rebuilds every row in the window. A pooled grid binds only the visible range while scrolling, which makes an 800-item bank search feel like a 20-item pouch, preserves scroll position for free, and removes the perf asterisk from half this document: dim-by-default everywhere, extra columns, All Bags at bank scale. Zero visible change on day one, which is exactly the point.
Seen in: every performant list UI; WoW addon AdiBags' documented slowdown on huge inventories is the cautionary tale.
Custom row pooling over the existing scroll view rather than the stock list control, because the project's constraints are unusual: mouse-event-only input, per-row drop targets that re-register on bind, selection restyling via the row map becoming bind-time state. The public grid API and test hooks stay unchanged so the existing thirteen inventory test files keep passing; land it behind a fallback switch. The quarter-second change signature stays as the rebuild trigger. Sequence before the grouped-list view and before making dim the bank default.
Right-click, Mark as Junk: the item turns grey with a coin mark and moves out of the default view into a Junk category. At any merchant, one Sell All Junk button liquidates the pile behind a plain confirmation. Locked beats junk, always. This is the inverse of the lock flag and the best-loved tidy-up loop in three different games.
Seen in: ESO (junk tab + sell all), WoW (native since Dragonflight), D4 (junk/salvage-all).
Server cost, called out plainly: one new bit on the persisted item-flags enum, following the account across machines. That means a database-migrations ledger entry, shared-code mirror sync, and a tester-verify pass — the standing process for any persisted item change. The toggle rides the same generic item-update delta the lock toggle uses. Client: two context actions, a Junk pseudo-category, grey-plus-coin row treatment slotted into the existing colour priority list, exclusion from the default All Items view, and the merchant button honoring no-sale and no-value flags. A client-only prototype flag is possible behind an option but is not the shipping shape (it would not follow the account).
Containers can already be renamed. Add the other half of the identity kit: a colour tag from a fixed palette of eight, set from the container's menu. The swatch shows on the bag's row, tints its window title bar, and colours the Container column in All Bags view. Ten identical Ornate Chests in a basement become instantly tellable-apart.
Seen in: Tarkov container tags (name + colour, the community standard), PoE tab colours, Terraria chest names.
| Item Name ▲ | Qty | Value |
|---|---|---|
| Cracked Shortbow | 1 | 14 |
| Rusty Dagger | 2 | 10 |
Server cost: one small persisted per-item value (colour index) in the item property state, riding the same generic update transaction as rename and lock; ledger entry and shared-mirror sync apply. Client render is a swatch in the name cell for container rows and a title tint. Fixed palette, no picker UI, one new menu label. A client-side-only variant would be nearly free but per-machine; recommend the property.
Tag a bag or chest with the categories it collects ("this chest wants: Reagents, Seeds"). A Sort to Bags button routes every unlocked matching item into its assigned container in one click, with a destination-by-destination toast and Undo. This is Quick Deposit with a memory, and the native version of what UO players ran Razor Organizer agents to do for two decades. Deliberately button-initiated only — never automatic on pickup — because surprise routing is the one documented downside of PoE's affinities.
Seen in: PoE affinities, Tarkov filtered cases, WoW reagent bank, Razor Organizer agents.
Server cost: a persisted per-container category set (property-state key on the container item; ledger; mirror sync). Assignment UI reuses the existing category taxonomy as a checklist — no new taxonomy. Routing resolves item to category through the same tab-filter sets, batches one move per target, and obeys the S7 protection contract and capacity checks. Conflict rules: an existing matching stack (S12 logic) beats category assignment; among multiple assigned containers, the fullest wins. Sequenced last: it stands on S12's batching and toast machinery, S7's contract, and S15's identity so players can tell destinations apart.
The danger with sixteen proposals is a window with sixteen widgets. The composition rule: one query surface (the search box, S1), one options surface (the Display Options card, S4), one row of tabs (S3), and everything else is either a column, a row style, or a footer button. Here is the whole Tier 1+2 set living together at the default backpack size, with nothing wrapped and three more item rows visible than today:
| ★ | Item Name ▲ | Qty | Weight | Durability | Value | ⚙ |
|---|---|---|---|---|---|---|
| ★ | Belt Pouch (6/20) | 1 | 4.2 | 12 | ||
| ☆ | Reagent Sack (38) | 1 | 5.1 | 8 | ||
| ★ | Zentu's Breastplate | 1 | 12.0 | 55/55 | 3,500 | |
| Crown of the Obsidians | 250 | |||||
| ☆ | Bandage | 55 | 5.5 | 55 | NEW | |
| ☆ | Black Iron Longsword of Fire | 1 | 6.4 | 43/61 | 920 | |
| ☆ | Bone Armor Chestpiece | 1 | 9.1 | 12/50 | 240 | |
| ☆ | Garlic | 120 | 1.2 | 120 | ||
| ☆ | Recipe: Obsidian Potion | 1 | 0.1 | 150 | ||
| ☆ | Solania's Censer | 1 | 0.0 |
| Phase | Ships | Server | Depends on | Why this order |
|---|---|---|---|---|
| 1 | S2, S3, S6, S7, S8 + S1's free fixes | none | — | Each is a standalone patch-note item; S7's protection contract unblocks all automation later. |
| 2 | S1, S4, S5, S9, S10 | none | S1 before S5 (the in: token); S4 before S5 (Container column) | The query-power wave; the S1 parser also lands in Search All My Stuff. |
| 3 | S11, S12 | none | S1 (queries to save), S7 (sweep safety) | Automation with zero server surface. |
| 4 | S14, S15, S16 | flags + properties, one ledger row each | S7 contract; S12 machinery; S15 before S16 (identify destinations) | One server change per commit, ledger in the same commit, tester task each. |
| 5 | S13 | none | — | Schedule before bank-scale All Bags, grouped views, or dim-by-default on the bank. Can float earlier if a perf complaint arrives first. |
flowchart TD S7["S7 lock contract"] --> S12["S12 Quick Deposit"] S7 --> S14["S14 Junk + Sell All"] S12 --> S16["S16 Sort to Bags"] S7 --> S16 S15["S15 colour tags"] --> S16 S1["S1 search tokens"] --> S11["S11 saved searches"] S1 --> S5["S5 All Bags"] S4["S4 column picker"] --> S5 S4 --> S8b["S8 Last Used column"] S10["S10 tooltips"] --> S10b["S10 compare"] S13["S13 virtualization"] -.enables at bank scale.-> S5 S13 -.-> S2b["S2 dim as default"]
| Token | Data source (client-resident) |
|---|---|
plain text | display name + renamed items' original names, diacritic-folded |
type: | archetype item type; category keys resolve through the shared tab-filter sets |
wt / val / qty | weight, value, stack count on the item instance |
dur, is:broken | current/max durability + the equipment status thresholds that already colour the column |
quality / rating | item quality and the summed item-score rating |
crafted: | maker's mark character name |
is:locked/quest/artifact/renamed/container/notrade/new | the same flags that drive the name colours and category predicates |
in: | parent container display name (All Bags / search-into-bags modes) |
Filters, search, sorting and columns therefore cost zero server traffic. Only actions (moves, sells, flag toggles) transact, through the same paths the UI uses today.
Pure-logic pieces (the S1 parser, S12/S16 matching and routing rules, S7's protection predicate, S9's sort composition) are EditMode-testable with zero Unity scene objects, extending the existing inventory test suite: grid/window/selection/sort/flatten/stack-split/category tests, thirteen files, which S13 is explicitly required to keep green.
UO: Enhanced Client container views, ClassicUO grid containers, UOGuide (container, backpack, organizer agent, insurance), UO Outlands wiki, uo.com vendor search, Raph Koster's UO anecdotes. PoE: stash tab and highlight guides, community regex libraries. WoW: Bagnon/AdiBags/BetterBags docs, reagent bank, the Dragonflight sell-junk patch. ESO: official inventory guide, AdvancedFilters, FCO ItemSaver. FFXIV: Lodestone /itemsearch and armoury chest UI guides. Also: Maxroll Last Epoch loot-filter guide, Grim Dawn auto-sort threads, Tarkov container-labeling threads, Terraria wiki (Quick Stack, favorites), Diablo 4 stash guides, JEI/Where-Is-It Minecraft conventions. Full URL list in the research notes accompanying this proposal.
Prepared 2026-07-26 against the unity-6.5 migration branch. Companion markdown: docs/plans/2026-07-26-inventory-improvements-proposal.md. Sixteen proposals: thirteen client-only, three server-backed, each grounded in the classes that would carry it.
No account needed. Every proposal above also has its own Discussion box for talking about that one alone; this thread is for the plan as a whole. Comments are plain text, held to basic decency, and may be trimmed.