Tech Products intermediate 3 min read May 23, 2026
Public Preview Sign in free for the full digest →

Fate 1.0: A React Data Client for TypeScript Stacks

“The engineer who built Jest, Yarn, and Metro ports Relay's cache architecture to plain TypeScript — 900 stars, no GraphQL required, v1.0 nine days old.”

Fate 1.0: A React Data Client for TypeScript Stacks
1 Views
0 Likes
0 Bookmarks
Source · fate.technology

“"when your data client is an abstraction over `fetch`, keeping client state consistent gets hard quickly." — Christoph Nakazawa, fate.technology/posts/introducing-fate”

You know that feeling when you update a user's profile on one panel and three other panels on the same screen still show the old name? That happens when your data library caches by query name instead of object identity — React Query and SWR both work this way. After every mutation you write manual cache invalidation calls to patch every query that might be stale. As the data model grows, this logic compounds: one mutation touches a Post, a User, and two Comment lists, and you have to know every cache key to invalidate. When you miss one, users get a stale screen and a support ticket.

reacttypescriptdata-fetchingnormalized-cacheopen-sourcedevtoolstrpc

Each React component attaches a typed view — a checklist of the fields it needs from a given data type. These views nest: a PostCard view includes a UserView for the author, a CommentView for replies, and so on. Fate walks the component tree, merges all declared views, and sends one batched request to your server. The server response populates a cache keyed by object ID and type name, for example Post:7 or User:3. Each component receives only the fields it declared via data masking — accessing anything else is a TypeScript type error. When a mutation changes Post:7, the cache entry updates and every component holding a reference to that post re-renders automatically, with no invalidation code.

01
View composition — your component tree's data requirements merge into one server request at the root, eliminating request waterfalls and N+1 fetch patterns without any coordination code
02
Normalized cache by object ID — mutations to Post:7 propagate to every component holding that reference automatically; you write the mutation once and cross-screen state consistency is handled
03
Data masking — a component only receives the fields it declared in its view; accessing undeclared fields is a TypeScript type error, preventing unintended coupling between components as the codebase grows
04
Live views via Server-Sent Events — replace useView with useLiveView and the component receives real-time server updates with no polling or WebSocket configuration
05
Optimistic updates with auto-rollback — useActionState applies mutations immediately to the cached object and reverts automatically if the server returns an error, with no manual undo logic
06
Native HTTP transport in v1.0 — tRPC is no longer a hard dependency; the library ships a plain HTTP protocol with tRPC and GraphQL as optional adapters, widening the compatible backend surface
07
create-fate scaffolding — one command generates a working project from three templates (Drizzle+tRPC, Drizzle+HTTP, Prisma+tRPC) including the required server-side protocol structure
Who it’s for

If you are a React developer building a TypeScript full-stack app where shared entities such as users, posts, or orders appear across multiple views and you have already burned hours writing cache invalidation logic — Fate is worth evaluating on a new greenfield project. You need control over both the React client and the server, because Fate's server protocol (byId/list per entity type) is non-negotiable. Not suited for teams with existing REST APIs they cannot modify, for production deployments needing battle-tested community support, or for anyone who needs multi-framework compatibility be...

Worth exploring

Worth a hands-on spike for teams starting a greenfield TypeScript full-stack project where you control the backend — the architecture is proven at Facebook via Relay, and the creator's track record across Jest, Metro, and Yarn sets a high floor for design quality. Two blockers for production adoption as of May 2026: the GitHub README still says 'not production ready' nine days after the v1.0 announcement, and no public production deployments are documented. Treat this as beta-quality architecture exploration, not a drop-in replacement for TanStack Query in existing apps.

Developer playbook
Tech stack, code snippet, sentiment, alternatives.
PM playbook
Adoption angles, user fit, positioning.
CEO playbook
Traction signals, ROI, build vs buy.
Deep-dive insight
Full long-form analysis, no fluff.
Easy mode
Core idea, fast — when you need the gist.
Pro mode
Technical nuance, edge cases, tradeoffs.
Read the full digest
Go beyond the preview

Deep-dive insight, Easy and Pro modes, plus action playbooks — the full breakdown is one tap away.

Underrated tools. Unfiltered takes.

Read the full digest in the Snaplyze app for deep-dive insight, Easy and Pro modes, and the playbooks you can actually use.

Install Snaplyze →