Library / SDK
SortableJS/Sortable avatar
SortableJS/Sortable

SortableJS packs three builds and a plugin system into one list library

Reorderable drag-and-drop lists for modern browsers and touch devices. No jQuery or framework required.

31,210 stars3,714 forksJavaScriptMIT

At a glance

What is it?
Sortable is a JavaScript library for reorderable drag and drop lists with no jQuery requirement. Its options are where the real design shows: a group handshake between lists, swap thresholds, and one delay that cannot work on IE.
Who is it for?
Sortable suits a page that needs a list reordering, including across lists, without pulling in a framework or jQuery, and its group options are specific enough to build board style interfaces on. Check the release timeline before adopting it: version 1.15.7 shipped on 2026-02-11, the previous two tags are from November 2024, and the last push to the repository was 2026-03-24 with 528 open issues, so plan to own the integration rather than expect upstream movement.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Activity is slowing. The repository last received commits 7 months ago.
What is it written in?
Mainly JavaScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 13, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • SortableJS/Sortable31,210 ★ · +27
Star history
Repository2026-09-132026-11-13
SortableJS/Sortable31.2k31.2k

27 Stars in the last 61 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

One package ships three builds and a mount call

The install is unremarkable, `npm install sortablejs --save`, and there is still a bower.json in the repository for the older route. What is not ordinary is the choice of build. The default import pulls in the library with its default plugins. A core build at `sortablejs/modular/sortable.core.esm.js` omits the default plugins entirely. A complete build at `sortablejs/modular/sortable.complete.esm.js` includes all of them.

Between those three sits a fourth path, selective mounting, which is where the plugin system is actually used:

js
import Sortable, { MultiDrag, Swap } from 'sortablejs';

Sortable.mount(new MultiDrag(), new Swap());

The same call works against the core build for default plugins such as AutoScroll. So bundle size is a choice made at import time rather than a single fixed cost, and the README treats Multi-drag as a headline feature rather than an add-on, which is a little misleading about what the default import actually contains.

The delay option is documented as impossible on IE and Edge

Three options govern when a touch becomes a drag. `delay` is a time in milliseconds that defines when sorting should start. `delayOnTouchOnly` applies that delay only when the user is using touch, and defaults to false, so by default a delay applies to mouse drags too. `touchStartThreshold` is a pixel count: how far the point must move before a delayed drag event is cancelled.

The documented limitation is specific. Because of browser restrictions, delaying is not possible on IE or Edge with native drag and drop. The project also lists browser support as modern browsers including IE9, which sits awkwardly next to that note: the library claims to run there while one of its timing options is documented as unavailable.

None of this is a dealbreaker for a mouse-first desktop interface, and `touchStartThreshold` exists precisely to keep a tap from being read as a drag on a phone. It does mean a build that targets old Edge has to find another way to separate a tap from a reorder.

group is a handshake between two lists, not a boolean

Dragging between lists needs both lists to carry the same `group` value. Within that name there are three more controls. `pull` is the ability to move out of this list, accepting true, false, an array of group names, the literal string `clone`, or a function. `put` is the mirror: whether elements can be added in, from true, false, an array of group names, or a function. `revertClone` is a boolean that returns a cloned element to its initial position after it has been moved to another list.

The `clone` value is the one that changes behaviour rather than permission, since it copies the item instead of moving it. Paired with `revertClone`, that gives a drag out of a list that looks like removal while the original stays where it was, which is how you build a picker without losing the source.

One demo link shows complex logic inside `pull` and `put`, and another is dedicated to `revertClone: true`. The presence of function forms on both sides means a list can decide per item, not only per list.

Swap behaviour is three thresholds and a direction callback

Where an item is allowed to land is not one setting but four. `swapThreshold` is the percentage of the target that the swap zone takes up, as a float between 0 and 1, so a small value makes swapping harder to trigger. `invertSwap`, set to true, moves the swap zone to the sides of the target, which produces the effect of sorting in between items rather than onto them. `invertedSwapThreshold` is the same kind of float for the inverted zone, and if it is not given it defaults to `swapThreshold` rather than to zero.

The fourth is `direction`, which accepts `vertical`, `horizontal`, or a function. The function form is called whenever a target is dragged over and must return one of those two strings, which is what lets a single instance handle a grid where column and half-column elements need different behaviour.

The wiki article Swap Thresholds and Direction, from December 2018, carries the detail here.

Drag handles and text selection work together, which the native API does not give

One stated differentiator is handle and text-selection support. It is built using the native HTML5 drag and drop API, but it supports drag handles and selectable text at the same time, and the project claims that as better than voidberg's html5sortable.

Around that sit the parts that make it usable in a real page: CSS animation when moving items, smooth animations, smart auto-scrolling, advanced swap detection, and support for CSS transforms. The list element itself is not constrained either, since any element can be used for the list and its children rather than only `ul` and `li`.

It also has no jQuery requirement, though a separate jquery-sortablejs wrapper exists for projects that want one. TypeScript definitions are published separately at `@types/sortablejs`, so the types are not part of the package itself.

Framework support lives in eight separate wrapper repositories

Sortable itself is framework free, and the integrations are maintained elsewhere. There is meteor-sortablejs, angular-sortablejs for Angular 2.0 and up alongside angular-legacy-sortablejs for 1.x, react-sortablejs for ES2015 and up alongside react-mixin-sortablejs for the mixin style, knockout-sortablejs, polymer-sortablejs, Vue.Draggable, and ember-sortablejs.

That is nine repositories to track, and the split is by major version rather than by capability, so an Angular 1 project and an Angular 2 project depend on different code. The project states it supports any CSS library, giving Bootstrap as the example.

The repository layout matches the build story. `src/` holds the source, `modular/` holds the core and complete builds the imports point at, `plugins/` holds MultiDrag and the rest, `tests/` holds the tests, and `Sortable.js` plus `Sortable.min.js` sit at the root as the prebuilt files a script tag would use. The package name is sortablejs with the export named Sortable, at version 1.15.7.

The newest tag is from February 2026 and the last push was in March

The release history is lumpy rather than absent. Version 1.15.7 was published on 2026-02-11. Before it, 1.15.6 and 1.15.5 were both published in late November 2024, on the 28th and the 27th, two patch releases a day apart. Nothing has been tagged in the nearly nine months since 1.15.7, and the last push to the repository was 2026-03-24, on the master branch.

The open issue count is 528 against 31187 stars and 3716 forks, which reads as a widely used library that is not being triaged quickly. The licence is MIT and the project is not archived, so nothing here has been declared finished. What it means for an adopter is that the version you pin is likely to be the version you keep, and that the wiki articles backing the trickier options are older still, one from December 2018 and the v1.0 announcement from December 2014.

Editorial conclusion

Sortable suits a page that needs a list reordering, including across lists, without pulling in a framework or jQuery, and its group options are specific enough to build board style interfaces on. Check the release timeline before adopting it: version 1.15.7 shipped on 2026-02-11, the previous two tags are from November 2024, and the last push to the repository was 2026-03-24 with 528 open issues, so plan to own the integration rather than expect upstream movement. Also check whether your browsers include IE or Edge native drag, because the delay option is documented as impossible there.

Frequently asked questions

what is sortable js

A JavaScript library for reorderable drag-and-drop lists, built using the native HTML5 drag and drop API. It needs no jQuery and no framework, works on touch devices and modern browsers, and can reorder within a list or drag items from one list to another. The npm package is sortablejs and the export is named Sortable.

how to use sortable.js

Create the list element in your markup, then pass it to Sortable.create. Grab the element with `document.getElementById('items')` and call `Sortable.create(el)`. You can use any element for the list and its children, not just `ul` and `li`. Options such as `group`, `sort`, `delay` and `animation` are passed as a second argument.

Does Sortable need jQuery?

No. The project states that no jQuery is required, and separate wrapper repositories exist for framework integrations. There is a jquery-sortablejs repository for projects that want a jQuery plugin anyway, but it is an option rather than a dependency. TypeScript definitions live at `@types/sortablejs`, outside the package.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. SortableJS/Sortable on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/sortablejs-sortable.svg)](https://hysenlabs.com/projects/sortablejs-sortable)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/sortablejs-sortable.svg)](https://hysenlabs.com/projects/sortablejs-sortable)

Was this useful?