A simple data fetch
Add a single useSuspense() call where you need its data.
Rest Hooks automatically optimizes performance by caching the results, deduplicating fetches, efficient component render bindings and more.
import { TodoResource } from './api';function TodoDetail({ id }: { id: number }) {const todo = useSuspense(TodoResource.get, { id });return <div>{todo.title}</div>;}render(<TodoDetail id={1} />);
Stateful mutations
Use Controller.fetch() to update the store.
This updates all usages atomically and immediately with zero additional fetches. Rest Hooks automatically ensures data consistency and integrity globally.
import { TodoResource } from './api';function TodoDetail({ id }: { id: number }) {const todo = useSuspense(TodoResource.get, { id });const controller = useController();const updateWith = title => () =>controller.fetch(TodoResource.partialUpdate,{ id },{ title });return (<div><div>{todo.title}</div><button onClick={updateWith('🥑')}>🥑</button><button onClick={updateWith('💖')}>💖</button></div>);}render(<TodoDetail id={1} />);
An application
Data can be consumed and controlled in many contexts, speeding up development.
Rest Hooks uses data normalization to maintain consistency no matter how and where the data is consumed.
Every piece of data maintains referential stability unless it changes. This ensures the most optimized render performance, as well as predictable equality checks.
Rest easy with the help of debugging, unit testing, and storybook integration.
import { TodoResource, type Todo } from './api';export default function TodoItem({ todo }: { todo: Todo }) {const controller = useController();return (<div><label><inputtype="checkbox"checked={todo.completed}onChange={e =>controller.fetch(TodoResource.partialUpdate,{ id: todo.id },{ completed: e.currentTarget.checked },)}/>{todo.completed ? <strike>{todo.title}</strike> : todo.title}</label><CancelButtononClick={() =>controller.fetch(TodoResource.delete, {id: todo.id,})}/></div>);}
Data Integrity
Strong inferred types; single source of truth that is referentially stable ensures consistency; asynchronous invariants make it easy to avoid race conditions
Performance
Normalized cache means data is often ready before it is even needed. Automatic request deduplication means less data to send over the network.
Composition over configuration
Declare what you need where you need it. Share data definitions across platforms, components, protocols, and behaviors.
Incremental Adoption
Get started fast with one line data definition and one line data binding. Then add TypeScript, normalized cache with Schemas, optimistic updates and more.