# X_ISLAND_PROPS_INVALID

## Means

an island was handed props it may not receive

## Typical cause

a key not listed in `props: [...]`, a value that is not JSON (a function, `Date`, class instance, `bigint`, `symbol`, `undefined`, or a cycle), or a payload over `ISLAND_PROPS_MAX_BYTES` (16,384 bytes `As of 2026-09-05`; it was 4,096). A spread such as `<Modal {...row} />` fails and the cause **names every undeclared key**, which is how a password hash is caught before it crosses to the client. Over the cap, the cause names the **heaviest props with their bytes**. A declared 500 — the author's fault, never the caller's — so `problem+json` carries the cause in prod; on a budgeted route the `budgets` step reports it at verify time under this code

## Fix

declare the prop in `island({ props: [...] })`, or pass a JSON value; over the cap, pass `<prop>: []` and an endpoint (`queryPath('<query>')`, from `@ultimat3/core`) and fetch the rows inside the island after mount — a list that is the same on every request is a dataset, not a prop

[Routes, render and budgets](/error-codes#routes-render-and-budgets)
