# Islands: the element and its mount — Mercury LMS > LM0. An island is one server-rendered element with `phx-update="ignore"` and a `phx-hook`, into which a Mercury hyperscript component mounts. Two hosts: `LiveMercury.mercury/1` (hook `MercuryHook`, component by name) and `EchoEduWeb.Island.island/1` (hook `CourseIsland`, component by bundle URL). ## Read this when You render an island from HEEx, register its component on the client, or debug an island that does not mount. ## The contract - `<.mercury name="X" ...>` (`import LiveMercury`). Reserved assigns: `name` (required), `id` (default `"X-"`, per-process counter), `class`, `ssr` (default `config :live_mercury, :ssr`, `false`), `diff` (default `:enable_props_diff`, `true`), `socket` (only decides the first render is dead). Every other assign is a prop; a `%Phoenix.LiveView.LiveStream{}` assign is a stream; the default `:inner_block` slot becomes `children`. Props encode via the `LiveMercury.Encoder` protocol. - Element attributes: `data-name`, `data-props` (compact JSON), `data-props-diff`, `data-use-diff`, `data-streams-diff`, `data-slots` (base64 default slot), `data-ssr`, `phx-update="ignore"`, `phx-hook="MercuryHook"`. - Client: `getHooks(components)` → `{ MercuryHook }`; `createMercuryHook(resolve)` takes `el => Component | Promise`. The component gets `{...props, ...streams, pushEvent, pushEventTo, handleEvent, removeHandleEvent, upload, uploadTo}` and the slot as a child, inside `LiveMercuryProvider`. With `data-ssr`, the first paint clears the server markup (no hydration). - EDU: `<.island id bundle props>`; `id` and `bundle` required, `props` a map (default `%{}`), slot = the server render, kept until mount and restored at `destroyed`. Props go in a `