TypeScript/JS lib for dashboard layout and creation, responsive, mobile support, no external dependencies, with many wrappers (React, Angular, Vue, Ember, knockout...)
Last release 9 days ago
20 Aug 2026
Release timing varies
gaps range from 2 weeks to 4 months
Nearly every release is documented
notes for 58 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
11 years old
139 releases · first in 2015
Release timeline
139 releases since 2015One column per quarter.
Releases
- 13.2.020 Aug 2026
Release notes3 sources agree
Open source →- feat: #701 removed
printModeas we support much better printing now that doesn't compromise. - feat: #3362 added
PrintOptions.modefor app custom settings - fix: #3357 (react): drop type assertions on useGridStack add/remove helpers - thank you YOUNGHO8762
- fix: #3358 (react): use wrapper widget types in registry callbacks - thank you YOUNGHO8762
- fix: #3360 better north and west resize handles - thank you Ryan Peterson
- feat: #701 removed
- 13.1.226 Jul 2026
Release notes3 sources agree
Open source →- reg: #3340 regression: strict mode (v13.0.0) fails columnWidth without .breakpoints - thank you Daniel Cohen Gindi
- 13.1.126 Jul 2026
Release notes3 sources agree
Open source →- feat: #3336 printMode?: 'flow' | 'exact' to support 2 very differenrt options due to browser bug. uddated demos to showcase one vs the other (and mode toggle)
- 13.1.023 Jul 2026
- 13.0.226 Jul 2026
Release notes2 sources agree
Open source →- reg: #3340 regression: strict mode (v13.0.0) fails columnWidth without .breakpoints - thank you Daniel Cohen Gindi
- 13.0.122 Jul 2026
Release notes3 sources agree
Open source → - 13.0.019 Jul 2026
Release notes3 sources agree
Open source →- NEW: React wrapper: re-did to follow the Angular pattern (drag&Drop between grid doesn't destroy content), events, lazyLoad support, fix memory leak, empty content, etc...
- NEW: Vue wrapper: brand new wrapper follow same pattern as well
- break: #3310 Angular wrapper using component+props (instead of selector+input)
- feat: #662 added grid-lines.html demo (just CSS)
- fix: #3154 Esc key doesn't restore subgrid
- fix: #3231 drag broken in Firefox 147.0.4+ and Chrome 144+ due to
navigator.maxTouchPoints > 0now returning true on desktop (macOS trackpad) - fix: #3291 flicker nested grid demo when dragging between sub-grids
- fix: #3085 Changing rows after init relays out if smaller
- fix: #2823 Scrollbar appears prevents onChange being called
- fix: #2948 dynamically created nested grid disappeared when dragging out
- fix: #3269 cleanup old rtl residue - thank you Daniel Cohen Gindi
- fix: #3270 dragging item from outside doesn't allow swap (weird change is layout especially when you move out as it doesn't restore)
- fix: #2950 Angular: now support signal inputs (ng14.1+) like
name = input<string>()
- 12.6.08 Apr 2026
Release notes3 sources agree
Open source →- feat: #3250 full RTL support - thank you Daniel Cohen Gindi
- fix: #3261 prepareDragDrop() returns for disable after deletion
- fix: #3262 DDDraggable fix to querySelectorAll(handle) for nested grid
- 12.5.05 Apr 2026
- 12.4.226 Dec 2025
Release notes3 sources agree
Open source → - 12.4.113 Dec 2025
Release notes3 sources agree
Open source →- feat: #3104 Custom resize div element target - thank you Marvin Heilemann
- fix: #3181 re-initing from DOM missing x:0, y:0 messing layout
- fix: #3191 touch issue on Linux
- fix: #3194
updateOption()update lazyLoad - fix: #3201 updating higher column layout can cause negative values in
layoutsNodesChange()
DO NOT USE 12.4.0 as missing some export like 12.3.3, which was fixed in this release
- 12.4.012 Dec 2025
Nothing published for this version
- 12.3.314 Aug 2025
- 12.3.212 Aug 2025
- 12.3.111 Aug 2025
Release notes2 sources agree
Open source →- fix: #2493 added save(columnCount) option. Nested grid now use container saved column count.
- 12.3.010 Aug 2025
Release notes2 sources agree
Open source →-
feat: #3047 added .grid-stack-dragging to grid when child is being dragged so we can set cursor:grabbing . Updated demo.
-
feat: now using typedoc to generate doc (HTML and markup) from code. improved code examples and comments.
-
fix: #3099 scroll take into account ScrollContainer position
-
fix: #3102 React demo now support multiple grids
-
fix: #3021 correctly reset widget back (to last known position) when released outside
-
- 12.2.27 Jul 2025
Release notes2 sources agree
Open source →-
fix: #3070 incorrect property name 'sizeToContent' when cleaning up invalid attributes
-
fix: #3077 incorrect node._id check
-
fix: #3054 Avoid reflows via explicitly setting minRow
-
fix: #3085 opts.minRow being updated
-
- 12.2.128 May 2025
- 12.2.027 May 2025
Release notes2 sources agree
Open source →- feat: #3061 added GridStack.updateCB(w) that gets called after a widget has been updated (eg: load() after initial layout) instead of created
- 12.1.27 May 2025
Release notes2 sources agree
Open source →-
fix #3043 fix opts.animate again
-
fix #3048 nested grid resizeToContentCBCheck() fix
-
- 12.1.128 Apr 2025
Release notes2 sources agree
Open source →- fix #3038 updateOptions() fix opts.minRow being undefined
- 12.1.024 Apr 2025
Release notes2 sources agree
Open source →-
feat #2671 subgrid now propagate events to topmost grid. Use el.gridstackNode.grid to know which (sub) grid.
-
fix #3028 updateOptions() no longer modifies passed in struct. only field we check are being handled too.
-
fix #3029 resizeToContent() fix for nested grid with content above
-
fix #3030 resizeToContentCheck() wasn't blocking _ignoreLayoutsNodeChange at end of the loop
-
rem #3022 removed ES5 support (IE doesn't support CSS vars needed now)
-
rem #3027 remove legacy code support for disableOneColumnMode, oneColumnSize, oneColumnModeDomSort
-
- 12.0.013 Apr 2025
Release notes2 sources agree
Open source →-
feat: #2854 Removed dynamic stylesheet and migrated to CSS vars. Thank you lmartorella
-
feat: #3013 columns no longer require custom classes nor gridstack-extra.css as we now use CSS vars.
-
fix: #2978 Very slow operation in 11.2.0 and higher with large blocks
-
fix: #2947 loading responsive layout:'list' into smaller screen doesn't layout correctly.
-
- 11.5.124 Mar 2025
Release notes2 sources agree
Open source →- revert: #2981 Locked was incorrectly changed. fixed doc instead
- 11.5.017 Mar 2025
Release notes2 sources agree
Open source →-
feat: #2975 prepareDragDrop(el, force) option to force re-creation of the drag&drop event binding
-
feat: #2989 new updateOptions(o: GridStackOptions) to update PARTIAL list of options after grid as been created
-
fix: #2980 dd-touch circular dependency
-
fix: #2667 sidebar items not honoring gs-w (enter-leave-re-enter)
-
fix: #2987 gs-size-to-content to support numbers
-
fix: #2981 Locked not working as expected
-
- 11.4.027 Feb 2025
Release notes2 sources agree
Open source →-
fix: #2921 replace initMouseEvent with MouseEvent constructor and added composed: true
-
fix: #2939 custom drag handle not working with LazyLoad
-
fix: #2955 angular circular dependency
-
fix: #2951 shadow DOM dragging re-appending fix
-
fix: #2964 minW larger than column fix
-
feat: #2965 internal _prepareDragDropByNode(n) is now public as prepareDragDrop(el) so Angular, React, and others can call once the DOM content elements have been added (the outside grid item divs are always created before content)
-
break: #2959 Util.createWidgetDivs() has moved to GridStack.createWidgetDivs() to remove circular dependencies
-
- 11.3.017 Jan 2025
Release notes2 sources agree
Open source →-
feat: added isIgnoreChangeCB() if changeCB should be ignored due to column change, sizeToContent, loading, etc...
-
feat: added responsive_none.html demo and fixed layout:'none' to bound check the layout (no-op unless it must change)
-
- 11.2.030 Dec 2024
Release notes2 sources agree
Open source →-
feat: #2695 'Esc' to cancel now works on sidebar external items, also works dragging over trash.
-
feat: #2852 better React example. Thank you CNine
-
fix: #2852 grid in tabs correctly handles CSS. Thank you Luciano Martorella
-
fix: #2900 use attr data-gs-widget instead of gridstacknode (supported as well for backward compatibility)
-
- 11.1.29 Dec 2024
Release notes2 sources agree
Open source →-
fix: #2877 angular wrapper uses standalone, while now being compatible down to ng14. thanks to andre-steudel
-
fix: #2886 added gs-size-to-content support
-
fix: #2887 mobile nested grid TypeError: e.currentTarget is null
-
- 11.1.126 Nov 2024
Release notes2 sources agree
Open source →-
fix: #2878 make sure sub-grid inherit parent opts by default, with subgrid defaults.
-
fix: #2879 sub-grid item sizeToContent:true now handle content above/below sub grid.
-
- 11.1.018 Nov 2024
Release notes2 sources agree
Open source →-
feat: #2864 added GridStackOptions.layout for nested grid reflow during resize. default to 'list'.
-
fix: #2859 re-enabled tests and fix numerous issues found (see CL). Also thank you Luciano Martorella for getting me going and starting it.
-
fix: #2851 added support for custom max layout saving - Thank you Luciano Martorella
-
fix: #2492 loading same layout with overlapping widget fix. v10.3.0 regression.
-
- 11.0.121 Oct 2024
Release notes2 sources agree
Open source →-
fix: #2834 v11 angular missing package.json
-
fix: #2835 make sure we have unique USER id
-
- 11.0.020 Oct 2024
Release notes2 sources agree
Open source →-
feat: #2826 Lazy loading of widget content until visible ( GridStackOptions.lazyLoad and GridStackWidget.lazyLoad )
-
feat: #2818 support for Angular Component hosting true sub-grids (that size according to parent) without requring them to be only child of grid-item-content.
-
fix: #2231 , #1840 , #2354 big overall to how we do sidepanel drag&drop helper. see release notes.
-
fix: #2736 safe practices around GridStackWidget.content no longer setting innerHTML
-
- 10.3.121 Jul 2024
Release notes2 sources agree
Open source →-
fix: #2734 rotate() JS error
-
fix: #2741 resizeToContent JS error with nested grid
-
fix: #2740 nested grid drag fix
-
fix: #2730 resizing left from right most item works
-
fix: #2327 remove dataTransfer mention as not supported
-
- 10.3.026 Jun 2024
Release notes2 sources agree
Open source →- fix: #2720 load() now creates widgets in order (used to be reverse due to old collision code)
- 10.2.124 Jun 2024
Release notes2 sources agree
Open source →-
fix: #2683 check for fixed grid maxRow during resize
-
fix: #2694 prevent 'r' rotation to items that can't resize (locked, noResize, fixed sizes)
-
fix: #2709 support for multiple drag targets - Thank you nickfulcher
-
fix: #2669 load() sometimes restore incorrectly
-
- 10.2.02 Jun 2024
Release notes2 sources agree
Open source →-
feat: #2682 You can now press 'Esc' to cancel a move|resize, 'r' to rotate during a drag. added GridStack.rotate() as well - Thank you John B. for this feature sponsor.
-
fix: #2672 dropping into full grid JS error
-
fix: #2676 handle minW resizing when column count is less
-
fix: #2677 allow button as handle dragging
-
- 10.1.231 Mar 2024
Release notes2 sources agree
Open source →-
fix: #2628 removeAll() does not trigger Angular's ngOnDestroy
-
fix: #2503 Drag and drop a widget on top of a locked widget - Thank you JakubEleniuk
-
fix: #2584 wrong sort order during 1 column resize - Thank you JakubEleniuk again.
-
fix: #2639 load() with mix of new item without coordinates
-
fix: #2633 Drop into full grid causes crash
-
fix: #2559 changed angular demos (support 1 column)
-
fix: #2453 recreated grid trash issue
-
- 10.1.13 Mar 2024
Release notes2 sources agree
Open source →- fix: #2620 allow resizing with sizeToContent:NUMBER is uses
- 10.1.04 Feb 2024
Release notes2 sources agree
Open source →-
feat: #2574 Allow cell height in cm and mm units
-
feat: #2578 allow different scaling between drag toolbar and grid
-
fix: #2577 ui-resizable-s/-n style fix
-
fix: #2576 column('none') now ignores layouts
-
fix: #2560 nested grid fix (enter can call leave which can call enter again) - Thank you v1talii-dev
-
fix: #2596 prevent SSR crash
-
fix: #2610 using passive:true for mousemove events
-
fix: #2612 restrict vertical resize if sizeToContent:true
-
demo: nested.htm now has nested create and drag&drop example - Thank you fredericrous
-
- 10.0.110 Dec 2023
Release notes2 sources agree
Open source →-
fix: #2552 DOM init doesn't sizeToContent
-
fix: #2561 issues with sizeToContent animation, cleanup, etc...
-
fix: #2427 sizeToContent supports rem/em cell height
-
fix: #2558 remove style node in shadow root
-
fix: #2556 make sure 'new GridStack(el)' set el.gridstack=this right away
-
cleanup: #2550 Optimize resize arrow (~88% lighter from 1.82 KB to 225B)
-
- 10.0.021 Nov 2023
Release notes2 sources agree
Open source →-
feat #2542 we now support much richer responsive behavior with GridStackOptions.columnOpts including any breakpoint width:column pairs, or automatic column sizing.
-
disableOneColumnMode , oneColumnSize , oneColumnModeDomSort have been removed (see v10 migration doc)
-
- 9.5.111 Nov 2023
Release notes2 sources agree
Open source →-
fix #2525 Fixed unhandled exception happening in _mouseMove handler
-
fix potential crash in resizeToContentCheck() if grid gets deleted by the time the delay happens
-
fix #2527 Incorrect layout on grid load in one column mode
-
fix #2496 animation on init, introduced in 8.1.1
-
- 9.5.026 Oct 2023
Release notes2 sources agree
Open source →-
feat #1275 div scale support - Thank you elmehdiamlou for implementing this teh right way (add scale to current code)
-
fix #2489 moved the dropped event handler to after doing everything (no more setTimeout) - Thanks arnoudb for suggesting a fix.
-
fix #2497 Utils.parseHeight() fix
-
fix column(1) to not restore if disableOneColumnMode on size change
-
- 9.4.015 Oct 2023
Release notes2 sources agree
Open source →-
revert #2263 div scale support - causing too many issues for now (#2498 #2491)
-
fix #2492 calling load() allows overlapping widgets
-
- 9.3.030 Sept 2023
Release notes2 sources agree
Open source →- fix #1275 div scale support - Thank you VincentMolinie for implementing this
- 9.2.227 Sept 2023
Release notes2 sources agree
Open source →-
fix - sub-grid styles now look for immediate correct parent, not any depth above.
-
fix #2469 "Invalid height" error CSS minHeight
-
fix #2394 nested grid size issue when sub-items moved up/down
-
- 9.2.121 Sept 2023
Release notes2 sources agree
Open source →- fix _updateContainerHeight() to use height rather than min-height again (apart for nested grids which need it) and partial getComputedStyle CSS minHeight support
- 9.2.010 Sept 2023
Release notes2 sources agree
Open source →-
feat: nested grids now support sizeToContent to size themselves to how many sub items they contain - Thank you @Helix for sponsoring this!
-
fix #2449 full grid maxRow fix
-
- 9.1.16 Sept 2023
Release notes2 sources agree
Open source →-
fix #2435 directionCollideCoverage() tweaks
-
fix resizeToContent() to handle node.h (using when cellHeight changes or we resize) vs DOM sizing (rest of the time)
-
- 9.1.04 Sept 2023
Release notes2 sources agree
Open source →-
renamed fitToContent to sizeToContent (API BREAK)
-
feat: sizeToContent now supports being boolean|number to limit the height but user can resize past that, unlike maxH.
-
feat: resizeToContentParent now on GridStackWidget for those widgets that need to resize differently.
-
- 9.0.230 Aug 2023
Release notes2 sources agree
Open source →-
fix 'resizecontent' event fix not called.
-
partial fix #2427 sizeToContent when calling cellHeight()/addWidget()/MakeWidget()
-
- 9.0.127 Aug 2023
Release notes2 sources agree
Open source →-
fix #2413 support touchscreen+mouse devices. Thank you @Ruslan207
-
tweak to sizeToContent from #2412 . Thank you @JonSohn
-
- 9.0.023 Aug 2023
Release notes2 sources agree
Open source →-
feat #404 added GridStackOptions.sizeToContent and GridStackWidget.sizeToContent to make gridItems size themselves to their content (no scroll bar), calling GridStack.resizeToContent(el) whenever the grid or item is resized.
-
also added new 'resizecontent' event, and resizeToContentCB and resizeToContentParent vars.
-
fix #2406 inf loop when autoPosition after loading into 1 column, then 2.
-
- 8.4.020 Jul 2023
Release notes2 sources agree
Open source →-
feat #2378 attribute DDRemoveOpt.decline to deny the removal of a specific class.
-
fix: dragging onto trash now calls removeWidget() and therefore GridStack.addRemoveCB (for component cleanup)
-
feat: load() support re-order loading without explicit coordinates ( autoPosition or missing x,y ) uses passed order.
-
- 8.3.013 Jun 2023
Release notes2 sources agree
Open source →- feat #2358 column(N, 'list'|'compact'|...) resizing now support reflowing content as list
- 8.2.312 Jun 2023
Release notes2 sources agree
Open source →-
fix #2349 grid NoMove vs item NoMove support
-
fix #2352 .ui-draggable-dragging z-index for modal dialogs
-
fix #2357 NaN inf loop when using cellHeight rem/em
-
fix #2354 max-w cloning issue fix
-
- 8.2.212 Jun 2023
Nothing published for this version
- 8.2.126 May 2023
Release notes2 sources agree
Open source →-
fix: make sure removeNode() uses internal _id (unique) and not node itself (since we clone those often)
-
fix: after calling addRemoveCB make sure we don't makeWidget() (incorrectly) a second time
-
break: GridStackWidget.id is now string only (used to be numberOrString) as it causes usage to have to check and cast
-
- 8.2.024 May 2023
Release notes2 sources agree
Open source →-
feat: makeWidget() now take optional GridStackWidget for sizing
-
fix: make sure GridStack.saveCB is call in removeWidget()
-
feat: angular wrapper: serialize custom data support, and making sure destroy() is called on ng components
-