Skip to main content
An island is declared in JavaScript and mounted by a data-island attribute. State changes re-render only the selectors you name.

Optimistic updates

Update the UI instantly, then reconcile with the server. The first callback runs immediately; if the second fails, the first is rolled back.
Use ApiUtility (api.js) rather than raw fetch — it handles CSRF tokens and retries, and raw fetch is a feather check error.

Drag and drop

Built in via the draggable config. The full API is documented 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).