
Vintage Story Mod DB · Vintage Story mod
Window Display Lib
Window Display Lib A complete overhaul of Window Storage Lib Free item placement, animation, lighting, particles, weather and block swapping Usable by modders for their own display blocks Required Mods Required Attribute Rendering Library 3.1.0+ You will
Quick answer
Which Window Display Lib release matches 1.22.4?
Window Display Lib 1.0.2 targets 1.22.0, 1.22.1, 1.22.2. It must be installed on the client. Installation on the dedicated server is optional. 1 required mod needs a matching file.
Where it goes
Is Window Display Lib required on the client, server, or both?
It must be installed on the client. Installation on the dedicated server is optional.
This release supports both sides, but the source does not require it on the server.
What else does Window Display Lib 1.0.2 need?
1.0.2 on 1.22.4. Every mod below is checked against that same setup.
Install Attribute Rendering Library first, but 1 required mod has no matching file for this setup. Do not mix loader builds to force a match.
We only count dependency files that match this setup. A file for another loader does not fill the gap.
Before you install it
Add Window Display Lib without breaking your instance.
Built for Window Display Lib 1.0.2 on 1.22.4. Pick another file and the loader, install side or required mods may change.
- 01
Stick to this file
Use 1.0.2. It targets 1.22.0, 1.22.1, 1.22.2; another release may have different loader, side or dependency requirements.
- 02
Bring the mods it needs
Install Attribute Rendering Library first, but 1 required mod has no matching file for this setup. Do not mix loader builds to force a match.
- 03
Put it on the correct side
It must be installed on the client. Installation on the dedicated server is optional.
- 04
Pick the file you checked
Use the “Get this file” button beside 1.0.2. It opens that exact file at the source.
About this project
What does Window Display Lib add?
Window Display Lib
A complete overhaul of Window Storage Lib
Free item placement, animation, lighting, particles, weather and block swapping
Usable by modders for their own display blocks
Required Mods
Required
You will also want
The Patches mod is what switches on particles and makes items work that have no display data of their own.
Features
Free Placement, Not Fixed Slots
- •Built on the psurface system vanilla introduced, taken a good deal further than vanilla takes it.
- •A surface is one shape element named
psurface0-w16-h16-d7-windowdisplay. Width, height, depth and category all read straight out of the name, and a shape can hold as many as you like. - •Items sit on a one-voxel grid, centred on the spot you click. On an ordinary window that is 112 places a single item can go.
- •Item facing comes from the geometry. A surface on the north face turns its items to face north with no JSON at all. Override per surface with
surfaceFacingDegif you need something unusual.
Seeing Where Things Will Land
- •Ghost preview. A see-through copy of whatever you are holding, drawn exactly where it will go and turned the way it will be turned. It goes red when it will not fit.
- •Both outline boxes can be switched off separately - the one showing where the item will land, and the one around an item you are aiming at.
- •Press
Bto bring them back for a moment when you want to line something up precisely. It is not saved, so you go back to your normal setup next time. - •With the boxes off there is no visible grid at all. It is still a grid underneath, but it stops feeling like one.
- •Transparency is configurable, and the whole thing has an off switch if you would rather not have it.
Rotating Things
- •Hold Sprint and scroll the mouse wheel. What it turns depends on what you are pointing at - a bare bit of sill turns the item you are about to place, an item already sitting there turns that one. No wrench needed for either.
- •Any angle, not just quarter turns. You set the step size in the config and it governs both held and placed items.
- •Turning a long item across the sill instead of along it is often the difference between fitting and not, and the ghost shows you that happen before you commit to it.
- •The turned shape is what actually gets used for fitting, stacking and clicking, not just the model you see.
- •If a turn would leave an item overlapping its neighbour or hanging off the edge it refuses and says so, rather than letting it happen.
- •Placed items get a slight random resting angle so a shelf looks natural rather than perfectly lined up. Turn it off in the config if you want everything square - and it applies to things already placed, not only new ones.
Stacking
- •Items stack where the item itself says they can, and every one in a pile keeps its own angle.
- •A new item copies the angle of the one you aimed at, so a pile stays consistent without setting it every time. Aim at a different item in the stack and the new one copies that instead.
- •That lets you build a stack a layer at a time and turn each one as you go. Stack an ingot, scroll to turn it, stack the next. Crossed and fanned piles all work.
Items Just Work
- •Anything already authored for a vanilla shelf displays at its correct size - bowls, crocks, clay pots, moulds, all of vanilla's clutter. No patch needed.
- •Resolution order is
displayable.windowdisplay→displayable.shelf→shelvable→windowdisplayable. You only need a patch for items nobody ever authored, or where the vanilla size is wrong for a sill. - •An item may name its own display shape, which is how clothing shows neatly folded rather than laid out flat.
- •Contained interaction: crocks, bowls and cooking pots can be used in place without picking them up first.
- •The info box tells you how fresh stored food is and its temperature, so you can see at a glance whether that meal is still worth eating.
- •Fine-tune any item live with the in-game transform editor, under
onWindowDisplayTransform. It reads and writes the same entry a patch uses, so you can tune by eye and copy the numbers straight out.
Light, Particles & Weather
- •Lighting: a lantern, candle or oil lamp on the sill lights the room at its own colour and level, and relights the moment the contents change.
- •Particles: candles, lamps and incense keep their flame or smoke while on display, spawned at the item's own position and turning with it. Vanilla shelves and display cases do not do this at all. Set per item with
particleOffset, so only items somebody has actually tuned will emit. - •Rain sound: rain on the glass, scaling with real rainfall and fading naturally. One shared sound across every window, so a whole wall of them costs no more than one.
- •Food: stored food follows vanilla's spoil rules and rots in place, and the rate responds to whether the window is open or shut.
- •Room sealing: an open window stops sealing the room, so windows have to be shut in winter. Turn it off with
RoomSafeOpeningif you would rather not think about it.
Animation & Opening
- •Animations can be called anything. Static geometry, animations and surface markers all live in one shape file, split automatically at tesselation by
animatedElements. - •Only the elements you name go to the animator. Everything else stays batched into the chunk mesh, which keeps its per-vertex lighting and ambient occlusion and costs nothing per frame. The old mod ran panes through the animator that never moved, which is exactly the wrong way round.
- •Any number of independent panes per block, each with its own open and closed boxes.
- •
canOpenmakes a style that stays shut.isWindow: falseanimates a pane without touching the open/closed state, for interior doors and display flaps. - •Toggling is resolved server-side and broadcast, so
linkedOpenmoves a stacked window as one piece instead of each segment starting a moment apart. - •A swoosh on every toggle, and breaking an open window still drops the normal closed item.
Frame & Collision Groups
- •frameBoxGroups tie an animation to the boxes you click, with
animOpen/animCloseandopenFrameBox/closedFrameBox, plus arrayedstaticFrameBoxesfor parts that never move. - •collisionBoxGroups mirror it exactly, with open, closed and static variants, also arrayed. The two are independent, so a block can declare no frame box at all and still collide properly.
- •Selection boxes for the item grid are built from the surface marker, so they always match what is actually there.
- •The block-breaking crack overlay rotates to match how the block was placed.
Chaining & Swapping
- •Stack a window on another and the buried surfaces hide themselves. Opt individual ones back in with
showSurfacesWhenStacked. - •
placeWithandpairedWith: "below"build multi-block windows from a single item. 2-high and 3-high go down together, break together and drop one item. If the space above is blocked it refuses to place rather than half-building. - •Block swapping:
wrenchSwapToconverts a placed window into another style or its edge-mounted version with Sprint and a wrench. It understands{variant}placeholders and works across a whole tall stack at once. - •Rings longer than two blocks work fine, so you can build a proper cycle. Window Display uses one to mirror left and right windows: left, left edge, right, right edge, back to left.
- •It refuses while anything is stored, so nothing is ever lost to a swap.
Controls
You can do all of this with something in your hand. Placing, taking and opening never fight each other.
- •
Right Clickthe frame or pane to open and close the window - •
Right Clickanywhere on the sill to place the held item there - •
Right Clicka placed item to take it back - •
Sprint + Mouse Wheelon the sill turns the item you are about to place - •
Sprint + Mouse Wheelon a placed item turns that item, either way - •
Sprint + Wrench + Right Clickthe frame swaps the window to its next style or edge version - •
Bshows the outline boxes temporarily, whatever your config says. Rebindable
Rotation steps by whatever you set as Slot Rotation Degrees, starting from the item's own resting angle rather than snapping to zero. A pending turn clears once you place the item, or if you switch to something else in your hotbar.
Config File Options
Settings live in Window Display Lib. I highly recommend installing Config Lib and Auto Config Lib so you can change them in game.
- •Rain Sound Volume: 0 (off) to 10 (loud) – default 5
- •Rain Sound Range: 1 to 64 blocks – default 12
- •Animation Speed: 1 (very slow) to 5 (very fast) – default 3
- •Slot Rotation Degrees: 5 to 90 – default 15. Governs held and placed items alike
- •Placement Jitter: true by default. The slight random resting angle on placed items. False makes everything sit perfectly square
- •Placement Ghost: true by default. The see-through preview of the held item
- •Placement Ghost Opacity: 1 (barely there) to 10 (solid) – default 5
- •Show Placement Box: true by default. The outline showing where the held item will land
- •Show Placed Item Box: true by default. The outline around an item you are aiming at
- •Room Safe Opening: false by default. Set true and rooms stay insulated whether windows are open or shut – close every window before switching it on
Known Issues
- •A bright light flickers for an instant when the window changes. Placing, taking or turning an item, or opening a pane, makes a lantern on that sill dim for a fraction of a second. This is the game's own lighting rather than the mod - any block change makes it work the light out again from scratch, and how long that takes depends on how bright the source is. A candle does not show it at all. Turning shadows off does not help and there is nothing a mod can reach here.
- •The ghost shows containers without their liquid. A bucket or bowl with something in it previews as the empty vessel. The game cannot upload a filled liquid container's model on its own - it is built for a different rendering path - so the vessel is all there is to draw. The liquid comes back the moment you place it, and the ghost still shows the right position, size and rotation. Food in a bowl is built differently and does show its contents.
- •Turning placement jitter off does not change items already placed until that window redraws. Take or place something on it, toggle a pane, or reload the world to apply it everywhere. The angle is worked out live; it is the model that is cached.
- •Rebinding Sprint needs a world reload before it takes effect. Until then the old key still works and the tooltip may name the wrong one. This is vanilla - the game copies the mouse click modifiers from your Sneak and Sprint keys once when settings load and does not redo it on a rebind. Vanilla's own cabinet behaves the same way.
- •Large items only fit edge windows. Anything deeper than 6 voxels has nowhere valid to sit on an ordinary sill, since items are centred where you click and have to fit entirely inside. Edge windows are twice as deep and take them fine.
Screenshots & Videos
The ghost preview - the item shown where it will land, red when it will not fit.
Sprint and scroll to turn an item, before or after placing it.
Free placement with the outline boxes turned off.
Sprint and a wrench cycles a window through its styles and edge versions.
For modders – giving an item a display size and transform
Most items need nothing: anything with a vanilla displayable.shelf entry is inherited as is. Patch only when an item has no display data at all, or is too big for a sill. An override replaces vanilla's entry wholesale, so restate behavior if you want stacking.
"displayable": {
"windowdisplay": {
"size": { "width": 3, "height": 4, "length": 3 },
"behavior": "Stacking",
"randYRotAngle": 0,
"particleOffset": { "x": 0, "y": 0, "z": 0 },
"transform": {
"translation": { "x": 0, "y": 0, "z": 0 },
"rotation": { "x": 0, "y": 0, "z": 0 },
"origin": { "x": 0.5, "y": 0, "z": 0.5 },
"scale": 1
}
}
}
size is the footprint in voxels – bounds, collision, selection box and stack pitch. transform is visuals only, and nothing keeps the two in step. Any key here also takes a ByType suffix for per-variant values.
Width and length, and why 6 is the number to remember. An item is centred on the spot you click, so it reaches half its width to each side and half its length front and back, and it has to fit entirely inside the surface. Positions are whole voxels. A main window sill is 16 wide by 7 deep, so a 7-deep item would need to sit at 3.5 and there is nowhere to put it – keep length at 6 or under. Going over is a perfectly good way to make something edge-window only, if that is what you are after.
Height is the stack pitch, so it decides clipping. It is not just how tall the item is allowed to be – it is how far up the next one sits when you stack them. Declare it shorter than the item really renders and copies sink into each other; declare it taller and they float with a gap. If you scale an item down with transform you have to scale size with it or you get exactly that – a clay bowl at scale 0.85 with its original height left a visible gap under every bowl in the pile.
Height is also checked against the surface: anything over 7 is refused outright on the shallower surfaces like the display unit and the pane shelf. That is occasionally worth taking on purpose – the vanilla hammer is declared at 6 against a taller model, which lets it go on those surfaces at the cost of stacked hammers overlapping slightly.
behavior is what allows stacking at all. Set it to "Stacking" and items of that type can be piled on each other. Leave it out and it defaults to no stacking, which catches people out when they override an item that vanilla had already set – the override replaces the whole entry, so if you do not restate it you have quietly turned stacking off.
randYRotAngle is how crooked an item is allowed to sit. It is the full spread of the random resting angle, so the item lands within half of it either way – the default of 30 means anything up to 15 degrees off square in either direction. Set it to 0 and the item always sits perfectly straight, which is what you want for something that is meant to look deliberately placed. A small value like 7 is useful when an item has a front, or when its particleOffset is measured against a particular side – the vanilla oil lamp uses that, so its flame stays on the wick instead of swinging away from it. This is per item and sits underneath the player's config switch, so somebody who has turned jitter off gets square items regardless.
particleOffset is optional and switches on flame or smoke particles for that item, in voxels from the top of its box.
Easiest way to get the numbers: place the item, open the in-game transform editor on the Window tab, nudge it until it looks right, and copy the values out.
For modders – block attribute reference
- •
canOpen– whether panes can be toggled at all - •
frameBoxGroups[]– one per pane:animOpen,animClose,openFrameBox,closedFrameBox,staticFrameBoxes,isWindow - •
collisionBoxGroups[]– the same, for collision. Independent of the frame boxes - •
animatedElements[]– shape elements the animator drives; everything else stays chunk-batched - •
wrenchSwapTo– string or array, with{variant}placeholders. Build cycles across blocks, each pointing at the next - •
placeWith/pairedWith– multi-block stacks - •
linkedOpen– stacked windows toggle as one - •
showSurfacesWhenStacked[]– surfaces that stay usable when stacked. Absent means all hidden - •
surfaceFacingDeg– override the derived item facing, keyed by surface index - •
noPlacementJitter– kills the random resting angle for that block, for surfaces holding something the player lined up by hand - •
disableRainSound– silence the rain for one style - •
dropsAs– name the block this one drops, with{variant}substitution
A block with no frame boxes at all still works. Sprint and a wrench will use any box except a placed item, so something fully chiselled or otherwise frameless can still be swapped.
Recommended Mods
Made with the help of Claude Code.
Project description from Vintage Story Mod DB.
Pick your setup
Window Display Lib releases for each Vintage Story version.
Choose the version and loader you play, then open the matching release.
1.22.6
1 loader build1.22.5
1 loader build1.22.4
1 loader build1.22.3
1 loader build1.22.2
1 loader build1.22.1
1 loader build1.22.0
1 loader buildCheck the dependencies, then try the file in a copied instance before changing a world you care about.
Recent files
Window Display Lib versions and loaders
1.0.2
windowdisplaylib_1.0.2.zip
1 Aug 2026
1.0.1
windowdisplaylib_1.0.1.zip
31 Jul 2026
1.0.0
windowdisplaylib_1.0.0.zip
26 Jul 2026
Looking for an older file? The official Vintage Story Mod DB project page is in Resources.