Every data table, search page, and filtered list has the same problem: the user applies a filter, the results update, they share the URL — and the recipient lands on an empty page because the filter lived in useState and died with the component.

nuqs solves this with a useState-compatible API where the URL is the state container.

What nuqs Does

// Regular state — lost on reload, not shareable

const [search, setSearch] = useState('')