headless window manager · 0 dependencies

WINDOWS in your web app

Drag, resize, snap, minimize, undo — a real desktop inside the page. Every window you see is the library doing its job. Grab one.

Read the docs

drag a titlebar to a screen edge to snap · ⌘⌥← / → snap · ⌘Z undo · F6 cycle · ? help

01 — build a window

Your markup, our engine

A full editor: markup, CSS and placement on the left, a live window on the right. Drag it, restyle it, then copy the code or send it to the desktop above.

02 — capabilities

Everything a desktop has

The core keeps state, the DOM layer moves pixels, your framework renders content. Each piece is replaceable.

01

Headless core

A pure state machine with events. Render it with anything — or nothing, and test it in Node.

02

Snap and magnetism

Halves, quarters, thirds and maximize on edge drop, plus 8px edge magnetism against neighbours.

03

Undo and redo

Every interaction is one history entry. A drag is a single undo, not sixty move events.

04

Workspaces

Park windows on virtual desktops. Focus follows the window across workspaces.

05

Persistence

Serialize to JSON, hydrate back, or drop in the persist plugin with versioned migrations.

06

Accessibility

Roles, labels, a focus trap for modals, keyboard control and a live region that narrates the desktop.

07

Touch ready

Pointer events throughout, adaptive hit areas on coarse pointers, long-press context menu.

08

Themeable

Sixteen CSS themes ship with it — every value is a custom property, and a per-window variant overrides them for one window.

03 — adapters

One core, six ways to hold it

Window content always lives in your own component tree — no innerHTML, no portals into the void. Adapters are thin sugar over the same state machine.

vanillaattachDesktop + attachWindow
reactuseWindowManager, useDesktop
vueuseDesktop with template refs
svelteuse:desktop actions
solidsignals and ref callbacks
angularsignals and DestroyRef

04 — landscape

Honest comparison

The floating-window niche went quiet years ago. That is exactly why wmkit exists.

Honest comparisonwmkitreact-rnddockviewwinbox.js
Framework agnosticyesreact onlycore + React·Vue·Angularyes
Headless coreyesnonono
Snap zoneshalves, quarters, thirdsnonedock gridnone
Undo / redobuilt innonenonenone
Workspacesbuilt innonenonenone
Tab groupsdrag to groupnonecore featurenone
Serialize / restorecore + pluginroll your ownyesnone
Keyboard controlmove, resize, snap, cyclenonepartialnone
Live region for ATyesnonono
Content ownershipyour treeyour treeyour treeinnerHTML
Bundle (brotli)~18 kB~15 kB~60 kB~10 kB

Checked on July 26, 2026: last commits, npm downloads, open feature requests.

Give your app windows

pnpm add @surdeddd/wmkit