Skip to main content
An island is declared in JavaScript and mounted by a data-island attribute. When state changes, only the selectors you name are re-rendered.

Optimistic updates

Update the UI immediately, then reconcile with the server. The first callback runs at once. If the second fails, the first is rolled back.
Use ApiUtility from api.js rather than raw fetch. It handles CSRF tokens and retries, and raw fetch is a feather check error.

Drag and drop

Available through the draggable config, documented in full in the CLAUDE.md that ships with every project. Pair it with OrderingMixin on the model so positions persist.

Generating an island

This writes the island file and wires it into the build. feather check reports an island no template mounts (orphan-island), and a template mounting an island that does not exist (missing-island).