<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>React - Integrations | Electric</title>
    <meta name="description" content="How to use Electric with React.">
    <meta name="generator" content="VitePress v1.5.0">
    <link rel="preload stylesheet" href="/assets/style.BpjTiyP4.css" as="style">
    <link rel="preload stylesheet" href="/vp-icons.css" as="style">
    
    <script type="module" src="/assets/app._mT7m_nw.js"></script>
    <link rel="modulepreload" href="/assets/src_partials_home-features-after.md.CQ_a_cfZ.js">
    <link rel="modulepreload" href="/assets/chunks/framework.DjYoZdHD.js">
    <link rel="modulepreload" href="/assets/docs_integrations_react.md.Cx2sxq67.lean.js">
    <link rel="icon" type="image/png" href="/img/brand/favicon.png">
    <link rel="icon" type="image/svg+xml" href="/img/brand/favicon.svg">
    <link rel="prerender" href="https://airtable.com/embed/appDitPIpjlAxK7CL/pagrWjq3qw5Fp68Wa/form">
    <script defer data-domain="electric-sql.com" src="https://plausible.io/js/script.js"></script>
    <script id="check-dark-mode">document.documentElement.classList.add("dark");</script>
    <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:site" content="@ElectricSQL">
    <meta name="twitter:title" content="React - Integrations | ElectricSQL">
    <meta name="twitter:description" content="How to use Electric with React.">
    <meta name="twitter:image" content="https://electric-sql.com/.netlify/images?url=https%3A%2F%2Felectric-sql.com%2Fimg%2Fintegrations%2Felectric-react.jpg&amp;w=1200&amp;h=630&amp;fit=cover&amp;fm=jpg&amp;q=80">
    <meta property="og:title" content="React - Integrations | ElectricSQL">
    <meta property="og:description" content="How to use Electric with React.">
    <meta property="og:image" content="https://electric-sql.com/.netlify/images?url=https%3A%2F%2Felectric-sql.com%2Fimg%2Fintegrations%2Felectric-react.jpg&amp;w=1200&amp;h=630&amp;fit=cover&amp;fm=jpg&amp;q=80">
  </head>
  <body>
    <div id="app"><div class="Layout" data-v-a29e6ba2><!--[--><!--]--><!--[--><span tabindex="-1" data-v-c3906ed2></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-c3906ed2> Skip to content </a><!--]--><!----><header class="VPNav" data-v-a29e6ba2 data-v-388babf5><div class="VPNavBar" data-v-388babf5 data-v-5d557444><div class="wrapper" data-v-5d557444><div class="container" data-v-5d557444><div class="title" data-v-5d557444><div class="VPNavBarTitle has-sidebar" data-v-5d557444 data-v-ac766fc0><a class="title" href="/" data-v-ac766fc0><!--[--><!--]--><!--[--><img class="VPImage logo" src="/img/brand/logo.svg" alt data-v-2d46c176><!--]--><!----><!--[--><!--]--></a></div></div><div class="content" data-v-5d557444><div class="content-body" data-v-5d557444><!--[--><!--]--><div class="VPNavBarSearch search" data-v-5d557444><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-5d557444 data-v-e138a194><span id="main-nav-aria-label" class="visually-hidden" data-v-e138a194> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/sync" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Sync</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/primitives" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Primitives</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/cloud" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Cloud</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/pricing" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Pricing</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/docs/intro" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Docs</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/demos" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Demos</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/blog" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Blog</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/about/community" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>About</span><!--]--></a><!--]--><!--[--><div class="nav-item VPNavBarMenuLink VPNavBarCTA" data-v-e138a194 data-v-f78c127b><div class="cta-lg" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Go to Cloud</a></div><div class="cta-md" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Cloud</a></div><div class="cta-sm" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Go to Cloud</a></div></div><!--]--><!--]--></nav><!----><!----><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-5d557444 data-v-c62242fd data-v-e5810ca3><!--[--><a class="VPSocialLink no-icon" href="https://durablestreams.com" aria-label="durable-streams" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-durable-streams"></span></a><a class="VPSocialLink no-icon" href="https://tanstack.com/db" aria-label="tanstack" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-tanstack"></span></a><a class="VPSocialLink no-icon" href="https://pglite.dev" aria-label="pglite" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-pglite"></span></a><a class="VPSocialLink no-icon" href="https://x.com/ElectricSQL" aria-label="x" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-x"></span></a><a class="VPSocialLink no-icon" href="https://discord.electric-sql.com" aria-label="discord" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-discord"></span></a><a class="VPSocialLink no-icon" href="https://github.com/electric-sql/electric" aria-label="github" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-5d557444 data-v-73029a02 data-v-8015fcbb><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-8015fcbb><span class="vpi-more-horizontal icon" data-v-8015fcbb></span></button><div class="menu" data-v-8015fcbb><div class="VPMenu" data-v-8015fcbb data-v-cbddf0cc><!----><!--[--><!--[--><!----><!----><div class="group" data-v-73029a02><div class="item social-links" data-v-73029a02><div class="VPSocialLinks social-links-list" data-v-73029a02 data-v-e5810ca3><!--[--><a class="VPSocialLink no-icon" href="https://durablestreams.com" aria-label="durable-streams" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-durable-streams"></span></a><a class="VPSocialLink no-icon" href="https://tanstack.com/db" aria-label="tanstack" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-tanstack"></span></a><a class="VPSocialLink no-icon" href="https://pglite.dev" aria-label="pglite" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-pglite"></span></a><a class="VPSocialLink no-icon" href="https://x.com/ElectricSQL" aria-label="x" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-x"></span></a><a class="VPSocialLink no-icon" href="https://discord.electric-sql.com" aria-label="discord" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-discord"></span></a><a class="VPSocialLink no-icon" href="https://github.com/electric-sql/electric" aria-label="github" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--[--><!--[--><div class="nav-item VPNavBarMenuLink VPNavBarCTA" data-v-f78c127b><div class="cta-lg" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Go to Cloud</a></div><div class="cta-md" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Cloud</a></div><div class="cta-sm" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Go to Cloud</a></div></div><!--]--><!--]--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-5d557444 data-v-998521f3><span class="container" data-v-998521f3><span class="top" data-v-998521f3></span><span class="middle" data-v-998521f3></span><span class="bottom" data-v-998521f3></span></span></button></div></div></div></div><div class="divider" data-v-5d557444><div class="divider-line" data-v-5d557444></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-a29e6ba2 data-v-c84339ae><div class="container" data-v-c84339ae><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-c84339ae><span class="vpi-align-left menu-icon" data-v-c84339ae></span><span class="menu-text" data-v-c84339ae>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-c84339ae data-v-91cce16e><button data-v-91cce16e>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-a29e6ba2 data-v-0a014151><div class="curtain" data-v-0a014151></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-0a014151><span class="visually-hidden" id="sidebar-aria-label" data-v-0a014151> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-665c6ffe><section class="VPSidebarItem level-0 collapsible" data-v-665c6ffe data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h2 class="text" data-v-f65b8172>Docs</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/intro" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Intro</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/quickstart" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Quickstart</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/stacks" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Stacks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/agents" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>AGENTS.md</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-665c6ffe><section class="VPSidebarItem level-0 collapsible" data-v-665c6ffe data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h2 class="text" data-v-f65b8172>Guides</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/auth" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Auth</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/shapes" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Shapes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/writes" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Writes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/installation" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Installation</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/postgres-permissions" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>PostgreSQL Permissions</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/deployment" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Deployment</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/sharding" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Sharding</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/security" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Security</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/troubleshooting" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Troubleshooting</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/client-development" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Client development</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-665c6ffe><section class="VPSidebarItem level-0 collapsible" data-v-665c6ffe data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h2 class="text" data-v-f65b8172>API</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/api/http" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>HTTP</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-1 collapsible" data-v-f65b8172 data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h3 class="text" data-v-f65b8172>Clients</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/api/clients/typescript" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>TypeScript</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/api/clients/elixir" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Elixir</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/api/config" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Config</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-665c6ffe><section class="VPSidebarItem level-0 collapsible has-active" data-v-665c6ffe data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h2 class="text" data-v-f65b8172>Integrations</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><section class="VPSidebarItem level-1 has-active" data-v-f65b8172 data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h3 class="text" data-v-f65b8172>Frameworks</h3><!----></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/livestore" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>LiveStore</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/mobx" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>MobX</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/next" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Next.js</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/phoenix" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Phoenix</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/react" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>React</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/redis" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Redis</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/tanstack" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>TanStack</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/yjs" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Yjs</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1" data-v-f65b8172 data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h3 class="text" data-v-f65b8172>Platforms</h3><!----></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/aws" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>AWS</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/cloudflare" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Cloudflare</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/crunchy" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Crunchy</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/digital-ocean" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Digital Ocean</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/expo" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Expo</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/fly" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Fly.io</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/gcp" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>GCP</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/neon" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Neon</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/netlify" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Netlify</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/planetscale" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>PlanetScale</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/render" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Render</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/supabase" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Supabase</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="no-transition group" data-v-665c6ffe><section class="VPSidebarItem level-0 collapsible" data-v-665c6ffe data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h2 class="text" data-v-f65b8172>Reference</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/reference/alternatives" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Alternatives</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/reference/benchmarks" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Benchmarks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/reference/literature" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Literature</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/reference/telemetry" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Telemetry</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-a29e6ba2 data-v-93396c71><div class="VPDoc has-sidebar has-aside" data-v-93396c71 data-v-e5fa90be><!--[--><!--[--><!--[--><div class="markdown-link-local-nav-container"><a class="markdown-link-local-nav" href="/docs/integrations/react.md" target="_blank" rel="noopener" data-v-c9b8e4a6><span class="title" data-v-c9b8e4a6>✨ Markdown</span></a></div><div class="custom-local-nav-dropdown"><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-bf359f67><button data-v-bf359f67>Return to top</button><!----></div></div><!--]--><!--]--><!--]--><div class="container" data-v-e5fa90be><div class="aside" data-v-e5fa90be><div class="aside-curtain" data-v-e5fa90be></div><div class="aside-container" data-v-e5fa90be><div class="aside-content" data-v-e5fa90be><div class="VPDocAside" data-v-e5fa90be data-v-3e59a195><!--[--><!--]--><!--[--><!--[--><!--[--><!--[--><a class="markdown-link-aside pager-link" href="/docs/integrations/react.md" target="_blank" rel="noopener" data-v-c9b8e4a6><span class="title" data-v-c9b8e4a6>✨ Markdown</span></a><!--]--><!--]--><!--]--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-3e59a195 data-v-2fe00466><div class="content" data-v-2fe00466><div class="outline-marker" data-v-2fe00466></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-2fe00466>On this page</div><ul class="VPDocOutlineItem root" data-v-2fe00466 data-v-1c0671af><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-3e59a195></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e5fa90be><div class="content-container" data-v-e5fa90be><!--[--><!--]--><main class="main" data-v-e5fa90be><div style="position:relative;" class="vp-doc _docs_integrations_react" data-v-e5fa90be><div><div style="display:none;" hidden="true" aria-hidden="true">Are you an LLM? You can read better optimized documentation at /docs/integrations/react.md for this page in Markdown format</div><img src="/img/integrations/react.svg" class="product-icon"><h1 id="react" tabindex="-1">React <a class="header-anchor" href="#react" aria-label="Permalink to &quot;React&quot;">​</a></h1><p>React is a popular library for building declarative, component-based UI.</p><h2 id="electric-and-react" tabindex="-1">Electric and React <a class="header-anchor" href="#electric-and-react" aria-label="Permalink to &quot;Electric and React&quot;">​</a></h2><p>Electric has first-class support for React. We maintain a <a href="https://github.com/electric-sql/electric/tree/main/packages/react-hooks" target="_blank" rel="noreferrer">react-hooks</a> package that provides a number of <a href="https://react.dev/reference/react/hooks" target="_blank" rel="noreferrer">React Hooks</a> to bind Shape data to your components.</p><h2 id="how-to-use" tabindex="-1">How to use <a class="header-anchor" href="#how-to-use" aria-label="Permalink to &quot;How to use&quot;">​</a></h2><h3 id="install" tabindex="-1">Install <a class="header-anchor" href="#install" aria-label="Permalink to &quot;Install&quot;">​</a></h3><p>The package is published on NPM as <a href="https://www.npmjs.com/package/@electric-sql/react" target="_blank" rel="noreferrer"><code>@electric-sql/react</code></a>. Install using e.g.:</p><div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#B392F0;">npm</span><span style="color:#9ECBFF;"> i</span><span style="color:#9ECBFF;"> @electric-sql/react</span></span></code></pre></div><h3 id="best-practice-use-api-endpoints" tabindex="-1">Best Practice: Use API Endpoints <a class="header-anchor" href="#best-practice-use-api-endpoints" aria-label="Permalink to &quot;Best Practice: Use API Endpoints&quot;">​</a></h3><div class="tip custom-block"><p class="custom-block-title">Recommended Pattern</p><p>Always proxy Electric requests through your backend API for production applications. This provides security, authorization, and a clean API interface.</p></div><div class="language-tsx"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#6A737D;">// ✅ Recommended: Clean API pattern</span></span>
<span class="line"><span style="color:#F97583;">import</span><span style="color:#E1E4E8;"> { useShape } </span><span style="color:#F97583;">from</span><span style="color:#9ECBFF;"> &#39;@electric-sql/react&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">const</span><span style="color:#B392F0;"> MyComponent</span><span style="color:#F97583;"> =</span><span style="color:#E1E4E8;"> () </span><span style="color:#F97583;">=&gt;</span><span style="color:#E1E4E8;"> {</span></span>
<span class="line"><span style="color:#F97583;">  const</span><span style="color:#E1E4E8;"> { </span><span style="color:#79B8FF;">isLoading</span><span style="color:#E1E4E8;">, </span><span style="color:#79B8FF;">data</span><span style="color:#E1E4E8;"> } </span><span style="color:#F97583;">=</span><span style="color:#B392F0;"> useShape</span><span style="color:#E1E4E8;">&lt;{ </span><span style="color:#FFAB70;">title</span><span style="color:#F97583;">:</span><span style="color:#79B8FF;"> string</span><span style="color:#E1E4E8;"> }&gt;({</span></span>
<span class="line"><span style="color:#E1E4E8;">    url: </span><span style="color:#9ECBFF;">`http://localhost:3001/api/items`</span><span style="color:#E1E4E8;">, </span><span style="color:#6A737D;">// Your API endpoint</span></span>
<span class="line"><span style="color:#E1E4E8;">  })</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">  if</span><span style="color:#E1E4E8;"> (isLoading) {</span></span>
<span class="line"><span style="color:#F97583;">    return</span><span style="color:#E1E4E8;"> &lt;</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;Loading ...&lt;/</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="color:#E1E4E8;">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">  return</span><span style="color:#E1E4E8;"> (</span></span>
<span class="line"><span style="color:#E1E4E8;">    &lt;</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="color:#E1E4E8;">      {data.</span><span style="color:#B392F0;">map</span><span style="color:#E1E4E8;">((</span><span style="color:#FFAB70;">item</span><span style="color:#E1E4E8;">) </span><span style="color:#F97583;">=&gt;</span><span style="color:#E1E4E8;"> (</span></span>
<span class="line"><span style="color:#E1E4E8;">        &lt;</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;{item.title}&lt;/</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="color:#E1E4E8;">      ))}</span></span>
<span class="line"><span style="color:#E1E4E8;">    &lt;/</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="color:#E1E4E8;">  )</span></span>
<span class="line"><span style="color:#E1E4E8;">}</span></span></code></pre></div><p><strong>→ See the <a href="/docs/guides/auth">authentication guide</a> for complete proxy implementation with streaming, error handling, and authorization.</strong></p><h3 id="useshape" tabindex="-1"><code>useShape</code> <a class="header-anchor" href="#useshape" aria-label="Permalink to &quot;`useShape`&quot;">​</a></h3><p><a href="https://github.com/electric-sql/electric/blob/main/packages/react-hooks/src/react-hooks.tsx#L131" target="_blank" rel="noreferrer"><code>useShape</code></a> binds a materialised <a href="/docs/api/clients/typescript#shape">Shape</a> to a state variable.</p><h4 id="direct-connection-development-only" tabindex="-1">Direct Connection (Development Only) <a class="header-anchor" href="#direct-connection-development-only" aria-label="Permalink to &quot;Direct Connection (Development Only)&quot;">​</a></h4><p>For development, you can connect directly to Electric:</p><div class="language-tsx"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#6A737D;">// ⚠️ Development only - exposes database structure</span></span>
<span class="line"><span style="color:#F97583;">import</span><span style="color:#E1E4E8;"> { useShape } </span><span style="color:#F97583;">from</span><span style="color:#9ECBFF;"> &#39;@electric-sql/react&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">const</span><span style="color:#B392F0;"> MyComponent</span><span style="color:#F97583;"> =</span><span style="color:#E1E4E8;"> () </span><span style="color:#F97583;">=&gt;</span><span style="color:#E1E4E8;"> {</span></span>
<span class="line"><span style="color:#F97583;">  const</span><span style="color:#E1E4E8;"> { </span><span style="color:#79B8FF;">isLoading</span><span style="color:#E1E4E8;">, </span><span style="color:#79B8FF;">data</span><span style="color:#E1E4E8;"> } </span><span style="color:#F97583;">=</span><span style="color:#B392F0;"> useShape</span><span style="color:#E1E4E8;">&lt;{ </span><span style="color:#FFAB70;">title</span><span style="color:#F97583;">:</span><span style="color:#79B8FF;"> string</span><span style="color:#E1E4E8;"> }&gt;({</span></span>
<span class="line"><span style="color:#E1E4E8;">    url: </span><span style="color:#9ECBFF;">`http://localhost:3000/v1/shape`</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#E1E4E8;">    params: {</span></span>
<span class="line"><span style="color:#E1E4E8;">      table: </span><span style="color:#9ECBFF;">&#39;items&#39;</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#E1E4E8;">    },</span></span>
<span class="line"><span style="color:#E1E4E8;">  })</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">  if</span><span style="color:#E1E4E8;"> (isLoading) {</span></span>
<span class="line"><span style="color:#F97583;">    return</span><span style="color:#E1E4E8;"> &lt;</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;Loading ...&lt;/</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="color:#E1E4E8;">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">  return</span><span style="color:#E1E4E8;"> (</span></span>
<span class="line"><span style="color:#E1E4E8;">    &lt;</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="color:#E1E4E8;">      {data.</span><span style="color:#B392F0;">map</span><span style="color:#E1E4E8;">((</span><span style="color:#FFAB70;">item</span><span style="color:#E1E4E8;">) </span><span style="color:#F97583;">=&gt;</span><span style="color:#E1E4E8;"> (</span></span>
<span class="line"><span style="color:#E1E4E8;">        &lt;</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;{item.title}&lt;/</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="color:#E1E4E8;">      ))}</span></span>
<span class="line"><span style="color:#E1E4E8;">    &lt;/</span><span style="color:#85E89D;">div</span><span style="color:#E1E4E8;">&gt;</span></span>
<span class="line"><span style="color:#E1E4E8;">  )</span></span>
<span class="line"><span style="color:#E1E4E8;">}</span></span></code></pre></div><p>You can also include additional PostgreSQL-specific parameters:</p><div class="language-tsx"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#F97583;">const</span><span style="color:#B392F0;"> MyFilteredComponent</span><span style="color:#F97583;"> =</span><span style="color:#E1E4E8;"> () </span><span style="color:#F97583;">=&gt;</span><span style="color:#E1E4E8;"> {</span></span>
<span class="line"><span style="color:#F97583;">  const</span><span style="color:#E1E4E8;"> { </span><span style="color:#79B8FF;">isLoading</span><span style="color:#E1E4E8;">, </span><span style="color:#79B8FF;">data</span><span style="color:#E1E4E8;"> } </span><span style="color:#F97583;">=</span><span style="color:#B392F0;"> useShape</span><span style="color:#E1E4E8;">&lt;{ </span><span style="color:#FFAB70;">id</span><span style="color:#F97583;">:</span><span style="color:#79B8FF;"> number</span><span style="color:#E1E4E8;">; </span><span style="color:#FFAB70;">title</span><span style="color:#F97583;">:</span><span style="color:#79B8FF;"> string</span><span style="color:#E1E4E8;"> }&gt;({</span></span>
<span class="line"><span style="color:#E1E4E8;">    url: </span><span style="color:#9ECBFF;">`http://localhost:3000/v1/shape`</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#E1E4E8;">    params: {</span></span>
<span class="line"><span style="color:#E1E4E8;">      table: </span><span style="color:#9ECBFF;">&#39;items&#39;</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#E1E4E8;">      where: </span><span style="color:#9ECBFF;">&quot;status = &#39;active&#39;&quot;</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#E1E4E8;">      columns: [</span><span style="color:#9ECBFF;">&#39;id&#39;</span><span style="color:#E1E4E8;">, </span><span style="color:#9ECBFF;">&#39;title&#39;</span><span style="color:#E1E4E8;">],</span></span>
<span class="line"><span style="color:#E1E4E8;">    },</span></span>
<span class="line"><span style="color:#E1E4E8;">  })</span></span>
<span class="line"><span style="color:#6A737D;">  // ...</span></span>
<span class="line"><span style="color:#E1E4E8;">}</span></span></code></pre></div><p><code>useShape</code> takes the same options as <a href="/docs/api/clients/typescript#options">ShapeStream</a>. The return value is a <code>UseShapeResult</code>:</p><div class="language-tsx"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#F97583;">export</span><span style="color:#F97583;"> interface</span><span style="color:#B392F0;"> UseShapeResult</span><span style="color:#E1E4E8;">&lt;</span><span style="color:#B392F0;">T</span><span style="color:#F97583;"> extends</span><span style="color:#B392F0;"> Row</span><span style="color:#E1E4E8;">&lt;</span><span style="color:#79B8FF;">unknown</span><span style="color:#E1E4E8;">&gt; </span><span style="color:#F97583;">=</span><span style="color:#B392F0;"> Row</span><span style="color:#E1E4E8;">&gt; {</span></span>
<span class="line"><span style="color:#6A737D;">  /**</span></span>
<span class="line"><span style="color:#6A737D;">   * The array of rows that make up the materialised Shape.</span></span>
<span class="line"><span style="color:#6A737D;">   * </span><span style="color:#F97583;">@type</span><span style="color:#B392F0;"> {T[]}</span></span>
<span class="line"><span style="color:#6A737D;">   */</span></span>
<span class="line"><span style="color:#FFAB70;">  data</span><span style="color:#F97583;">:</span><span style="color:#B392F0;"> T</span><span style="color:#E1E4E8;">[]</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D;">  /**</span></span>
<span class="line"><span style="color:#6A737D;">   * The Shape instance used by this useShape</span></span>
<span class="line"><span style="color:#6A737D;">   * </span><span style="color:#F97583;">@type</span><span style="color:#B392F0;"> {Shape&lt;T&gt;}</span></span>
<span class="line"><span style="color:#6A737D;">   */</span></span>
<span class="line"><span style="color:#FFAB70;">  shape</span><span style="color:#F97583;">:</span><span style="color:#B392F0;"> Shape</span><span style="color:#E1E4E8;">&lt;</span><span style="color:#B392F0;">T</span><span style="color:#E1E4E8;">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D;">  /** True during initial fetch. False afterwise. */</span></span>
<span class="line"><span style="color:#FFAB70;">  isLoading</span><span style="color:#F97583;">:</span><span style="color:#79B8FF;"> boolean</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D;">  /** Unix time at which we last synced. Undefined when `isLoading` is true. */</span></span>
<span class="line"><span style="color:#FFAB70;">  lastSyncedAt</span><span style="color:#F97583;">?:</span><span style="color:#79B8FF;"> number</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D;">  /** Unix time at which we last synced. Undefined when `isLoading` is true. */</span></span>
<span class="line"><span style="color:#FFAB70;">  isError</span><span style="color:#F97583;">:</span><span style="color:#79B8FF;"> boolean</span></span>
<span class="line"><span style="color:#FFAB70;">  error</span><span style="color:#F97583;">:</span><span style="color:#B392F0;"> Shape</span><span style="color:#E1E4E8;">&lt;</span><span style="color:#B392F0;">T</span><span style="color:#E1E4E8;">&gt;[</span><span style="color:#9ECBFF;">`error`</span><span style="color:#E1E4E8;">]</span></span>
<span class="line"><span style="color:#E1E4E8;">}</span></span></code></pre></div><h3 id="preloadshape" tabindex="-1"><code>preloadShape</code> <a class="header-anchor" href="#preloadshape" aria-label="Permalink to &quot;`preloadShape`&quot;">​</a></h3><p><a href="https://github.com/electric-sql/electric/blob/main/packages/react-hooks/src/react-hooks.tsx#L17" target="_blank" rel="noreferrer"><code>preloadShape</code></a> is useful to call in route loading functions or elsewhere when you want to ensure Shape data is loaded before rendering a route or component.</p><div class="language-tsx"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#6A737D;">// ✅ Production pattern with API proxy</span></span>
<span class="line"><span style="color:#F97583;">export</span><span style="color:#F97583;"> const</span><span style="color:#B392F0;"> clientLoader</span><span style="color:#F97583;"> =</span><span style="color:#F97583;"> async</span><span style="color:#E1E4E8;"> () </span><span style="color:#F97583;">=&gt;</span><span style="color:#E1E4E8;"> {</span></span>
<span class="line"><span style="color:#F97583;">  return</span><span style="color:#F97583;"> await</span><span style="color:#B392F0;"> preloadShape</span><span style="color:#E1E4E8;">({</span></span>
<span class="line"><span style="color:#E1E4E8;">    url: </span><span style="color:#9ECBFF;">`http://localhost:3001/api/items`</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#E1E4E8;">  })</span></span>
<span class="line"><span style="color:#E1E4E8;">}</span></span></code></pre></div><p>For development, you can connect directly:</p><div class="language-tsx"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#6A737D;">// ⚠️ Development only</span></span>
<span class="line"><span style="color:#F97583;">export</span><span style="color:#F97583;"> const</span><span style="color:#B392F0;"> devLoader</span><span style="color:#F97583;"> =</span><span style="color:#F97583;"> async</span><span style="color:#E1E4E8;"> () </span><span style="color:#F97583;">=&gt;</span><span style="color:#E1E4E8;"> {</span></span>
<span class="line"><span style="color:#F97583;">  return</span><span style="color:#F97583;"> await</span><span style="color:#B392F0;"> preloadShape</span><span style="color:#E1E4E8;">({</span></span>
<span class="line"><span style="color:#E1E4E8;">    url: </span><span style="color:#9ECBFF;">`http://localhost:3000/v1/shape`</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#E1E4E8;">    params: {</span></span>
<span class="line"><span style="color:#E1E4E8;">      table: </span><span style="color:#9ECBFF;">&#39;items&#39;</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#E1E4E8;">    },</span></span>
<span class="line"><span style="color:#E1E4E8;">  })</span></span>
<span class="line"><span style="color:#E1E4E8;">}</span></span></code></pre></div><p>It takes the same options as <a href="/docs/api/clients/typescript#options">ShapeStream</a>.</p><h3 id="getshapestream" tabindex="-1"><code>getShapeStream</code> <a class="header-anchor" href="#getshapestream" aria-label="Permalink to &quot;`getShapeStream`&quot;">​</a></h3><p><a href="https://github.com/electric-sql/electric/blob/main/packages/react-hooks/src/react-hooks.tsx#L30" target="_blank" rel="noreferrer"><code>getShapeStream&lt;T&gt;</code></a> get-or-creates a <code>ShapeStream</code> off the global cache.</p><div class="language-tsx"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#6A737D;">// ✅ Production pattern</span></span>
<span class="line"><span style="color:#F97583;">const</span><span style="color:#79B8FF;"> itemsStream</span><span style="color:#F97583;"> =</span><span style="color:#B392F0;"> getShapeStream</span><span style="color:#E1E4E8;">&lt;</span><span style="color:#B392F0;">Item</span><span style="color:#E1E4E8;">&gt;({</span></span>
<span class="line"><span style="color:#E1E4E8;">  url: </span><span style="color:#9ECBFF;">`http://localhost:3001/api/items`</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#E1E4E8;">})</span></span></code></pre></div><p>This allows you to avoid consuming multiple streams for the same shape log.</p><h3 id="getshape" tabindex="-1"><code>getShape</code> <a class="header-anchor" href="#getshape" aria-label="Permalink to &quot;`getShape`&quot;">​</a></h3><p><a href="https://github.com/electric-sql/electric/blob/main/packages/react-hooks/src/react-hooks.tsx#L49" target="_blank" rel="noreferrer"><code>getShape&lt;T&gt;</code></a> get-or-creates a <code>Shape</code> off the global cache.</p><div class="language-tsx"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#6A737D;">// ✅ Production pattern</span></span>
<span class="line"><span style="color:#F97583;">const</span><span style="color:#79B8FF;"> itemsShape</span><span style="color:#F97583;"> =</span><span style="color:#B392F0;"> getShape</span><span style="color:#E1E4E8;">&lt;</span><span style="color:#B392F0;">Item</span><span style="color:#E1E4E8;">&gt;({</span></span>
<span class="line"><span style="color:#E1E4E8;">  url: </span><span style="color:#9ECBFF;">`http://localhost:3001/api/items`</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#E1E4E8;">})</span></span></code></pre></div><p>This allows you to avoid materialising multiple shapes for the same stream.</p><h3 id="how-to-abort-a-shape-subscription-—-abortcontroller" tabindex="-1">How to abort a shape subscription — <code>AbortController</code> <a class="header-anchor" href="#how-to-abort-a-shape-subscription-—-abortcontroller" aria-label="Permalink to &quot;How to abort a shape subscription — `AbortController`&quot;">​</a></h3><p>If you&#39;d like to abort the shape&#39;s subscription to live updates e.g. after unmounting a component or navigating away from a route, you can use the <a href="https://developer.mozilla.org/en-US/docs/Web/API/AbortController" target="_blank" rel="noreferrer"><code>AbortController</code></a>.</p><p>The following is a simple example which aborts the subscription when the component is unmounted.</p><div class="language-tsx"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#F97583;">function</span><span style="color:#B392F0;"> MyComponent</span><span style="color:#E1E4E8;">() {</span></span>
<span class="line"><span style="color:#F97583;">  const</span><span style="color:#E1E4E8;"> [</span><span style="color:#79B8FF;">controller</span><span style="color:#E1E4E8;">, </span><span style="color:#79B8FF;">_</span><span style="color:#E1E4E8;">] </span><span style="color:#F97583;">=</span><span style="color:#B392F0;"> useState</span><span style="color:#E1E4E8;">(</span><span style="color:#F97583;">new</span><span style="color:#B392F0;"> AbortController</span><span style="color:#E1E4E8;">())</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">  const</span><span style="color:#E1E4E8;"> { </span><span style="color:#79B8FF;">data</span><span style="color:#E1E4E8;"> } </span><span style="color:#F97583;">=</span><span style="color:#B392F0;"> useShape</span><span style="color:#E1E4E8;">({</span></span>
<span class="line"><span style="color:#F97583;">    ...</span></span>
<span class="line"><span style="color:#E1E4E8;">    signal: controller.signal</span></span>
<span class="line"><span style="color:#E1E4E8;">  })</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0;">  useEffect</span><span style="color:#E1E4E8;">(() </span><span style="color:#F97583;">=&gt;</span><span style="color:#E1E4E8;"> {</span></span>
<span class="line"><span style="color:#F97583;">    return</span><span style="color:#E1E4E8;"> () </span><span style="color:#F97583;">=&gt;</span><span style="color:#E1E4E8;"> {</span></span>
<span class="line"><span style="color:#6A737D;">      // Live updates are now disabled.</span></span>
<span class="line"><span style="color:#E1E4E8;">      controller.</span><span style="color:#B392F0;">abort</span><span style="color:#E1E4E8;">()</span></span>
<span class="line"><span style="color:#E1E4E8;">    }</span></span>
<span class="line"><span style="color:#E1E4E8;">  }, [])</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">  ...</span></span>
<span class="line"><span style="color:#E1E4E8;">}</span></span></code></pre></div><p>Note that if you have multiple components using the same component, this will stop updates for all subscribers. Which is probably not what you want. We plan to add a better API for unsubscribing from updates &amp; cleaning up shapes that are no longer needed. If interested, please file an issue to start a discussion.</p></div></div></main><footer class="VPDocFooter" data-v-e5fa90be data-v-429f87a2><!--[--><!--[--><!--[--><!--[--><div class="markdown-link-footer-container"><a class="markdown-link-footer" href="/docs/integrations/react.md" target="_blank" rel="noopener" data-v-c9b8e4a6><span class="title" data-v-c9b8e4a6>✨ Markdown</span></a></div><!--]--><!--]--><!--]--><!--]--><div class="edit-info" data-v-429f87a2><div class="edit-link" data-v-429f87a2><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/electric-sql/electric/edit/main/website/docs/integrations/react.md" target="_blank" rel="noreferrer" data-v-429f87a2><!--[--><span class="vpi-square-pen edit-link-icon" data-v-429f87a2></span> Edit this page<!--]--></a></div><!----></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-429f87a2><span class="visually-hidden" id="doc-footer-aria-label" data-v-429f87a2>Pager</span><div class="pager" data-v-429f87a2><a class="VPLink link pager-link prev" href="/docs/integrations/phoenix" data-v-429f87a2><!--[--><span class="desc" data-v-429f87a2>Previous page</span><span class="title" data-v-429f87a2>Phoenix</span><!--]--></a></div><div class="pager" data-v-429f87a2><a class="VPLink link pager-link next" href="/docs/integrations/redis" data-v-429f87a2><!--[--><span class="desc" data-v-429f87a2>Next page</span><span class="title" data-v-429f87a2>Redis</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
    <script>window.__VP_HASH_MAP__=JSON.parse("{\"about_community.md\":\"Dq5HA5GI\",\"about_contact.md\":\"hDEdQZrb\",\"about_jobs_founders-associate.md\":\"BOordfnN\",\"about_jobs_index.md\":\"BlHU3vhz\",\"about_jobs_pglite-engineer.md\":\"D00M88r8\",\"about_legal_dpa.md\":\"CXGxOQv7\",\"about_legal_privacy.md\":\"DJVsPHwD\",\"about_legal_subprocessors.md\":\"D-UoEvmh\",\"about_legal_terms.md\":\"WuawsyIG\",\"about_team.md\":\"CeaLPrBs\",\"blog.md\":\"nQzDchm3\",\"blog_2022_05_03_introducing-rich-crdts.md\":\"CoXmRfX3\",\"blog_2022_05_20_relativity-causal-consistency.md\":\"BKtuc4Iv\",\"blog_2022_12_16_evolution-state-transfer.md\":\"B5_Xd_e_\",\"blog_2023_02_02_introducing-jose-kevin-garry.md\":\"DNEng3Dl\",\"blog_2023_02_09_developing-local-first-software.md\":\"ChhiNR07\",\"blog_2023_05_10_welcome-andrei-oleksii.md\":\"B7bbWDLs\",\"blog_2023_09_20_introducing-electricsql-v0.6.md\":\"DCG2XhdF\",\"blog_2023_10_10_welcome-sam.md\":\"DsBXGEsO\",\"blog_2023_10_12_linerlite-local-first-with-react.md\":\"cRX5YHYA\",\"blog_2023_10_26_local-first-software-london-meet-up.md\":\"DOR3LKwN\",\"blog_2023_11_02_electricsql-v0.7-released.md\":\"BjhpvO9D\",\"blog_2023_11_02_using-electricsql-with-the-ionic-framework-and-capacitor.md\":\"CIHVdwL4\",\"blog_2023_12_13_electricsql-v0.8-released.md\":\"BMGJB2M4\",\"blog_2023_12_15_secure-transactions-with-local-first.md\":\"DI7uGCuQ\",\"blog_2024_01_24_electricsql-v0.9-released.md\":\"B9ayNVE6\",\"blog_2024_02_05_local-first-ai-with-tauri-postgres-pgvector-llama.md\":\"Bj6oqeMh\",\"blog_2024_02_27_intel-ignite.md\":\"Be3eWNGk\",\"blog_2024_04_10_electricsql-v0.10-released.md\":\"CPU96tYW\",\"blog_2024_05_14_electricsql-postgres-client-support.md\":\"DZmgob4W\",\"blog_2024_07_17_electric-next.md\":\"BjNZSHoy\",\"blog_2024_11_21_local-first-with-your-existing-api.md\":\"BFYA--mx\",\"blog_2024_12_10_electric-beta-release.md\":\"DZy7gebQ\",\"blog_2025_03_17_electricsql-1.0-released.md\":\"BWPZMT9q\",\"blog_2025_04_07_electric-cloud-public-beta-release.md\":\"TweaC6M0\",\"blog_2025_04_09_building-ai-apps-on-sync.md\":\"ClvuoD3E\",\"blog_2025_04_22_untangling-llm-spaghetti.md\":\"DuKRg7ns\",\"blog_2025_06_05_database-in-the-sandbox.md\":\"BAIDpgM7\",\"blog_2025_07_29_super-fast-apps-on-sync-with-tanstack-db.md\":\"JLJDc4ae\",\"blog_2025_08_04_reliability-sprint.md\":\"DA4eORXQ\",\"blog_2025_08_12_bringing-agents-back-down-to-earth.md\":\"C7DYrws6\",\"blog_2025_08_13_electricsql-v1.1-released.md\":\"CFbAPl9T\",\"blog_2025_12_09_announcing-durable-streams.md\":\"jwhV2DkQ\",\"blog_2025_12_23_durable-streams-0.1.0.md\":\"C7aWEm88\",\"blog_2026_01_12_durable-sessions-for-collaborative-ai.md\":\"BO-AtQUu\",\"blog_2026_01_20_from-science-fiction-to-reality-you-can-build-difficult-things-now.md\":\"LnuVp2w9\",\"blog_2026_01_22_announcing-hosted-durable-streams.md\":\"hbPLDtAG\",\"blog_2026_02_02_configurancy.md\":\"BAXrJQIn\",\"blog_2026_02_19_amdahls-law-for-ai-agents.md\":\"BschsMiR\",\"blog_2026_03_06_agent-skills-now-shipping.md\":\"yrmK3E4s\",\"blog_2026_03_24_durable-transport-ai-sdks.md\":\"3FNkt0fT\",\"blog_2026_03_25_announcing-pglite-v04.md\":\"SZ_RDfwx\",\"blog_2026_03_25_tanstack-db-0.6-app-ready-with-persistence-and-includes.md\":\"IpVYCg7q\",\"blog_2026_03_26_stream-db.md\":\"BUDnZjRT\",\"blog_2026_04_02_electric-cloud-pricing.md\":\"iVpPD97q\",\"changelog.md\":\"8tBYg29L\",\"cloud_cli.md\":\"DK4FTB2D\",\"cloud_index.md\":\"DaUq66du\",\"cloud_protocols.md\":\"Dik0becM\",\"cloud_usage.md\":\"CCgUQodH\",\"demos.md\":\"D3FG7HeP\",\"demos_ai-chat.md\":\"BkpJV1kh\",\"demos_bash.md\":\"DZMtno9C\",\"demos_burn.md\":\"DVnSbDy_\",\"demos_encryption.md\":\"D1jFbjqX\",\"demos_gatekeeper-auth.md\":\"CEkURS8m\",\"demos_linearlite.md\":\"B5QLpHe0\",\"demos_nextjs.md\":\"ron_Ukcq\",\"demos_notes.md\":\"D7d4Knmf\",\"demos_phoenix-liveview.md\":\"D163eCSW\",\"demos_pixel-art.md\":\"B7m38HvU\",\"demos_proxy-auth.md\":\"Dloqx_Ln\",\"demos_react.md\":\"CvnOUQQe\",\"demos_redis.md\":\"dPJq6Kp_\",\"demos_remix.md\":\"C1OhmwN6\",\"demos_tanstack.md\":\"Cj5wW-JE\",\"demos_todo-app.md\":\"Ds4reuAr\",\"demos_write-patterns.md\":\"DAa7F1TN\",\"demos_yjs.md\":\"VUJClXHz\",\"docs__tutorial.md\":\"DzTNiqZO\",\"docs_agents.md\":\"-hxM5KuS\",\"docs_api_clients_elixir.md\":\"jPymefUQ\",\"docs_api_clients_typescript.md\":\"DuIjdVyw\",\"docs_api_config.md\":\"C1Z4YeFh\",\"docs_api_http.md\":\"D1zE0Rmg\",\"docs_guides_auth.md\":\"79v9ZOqc\",\"docs_guides_client-development.md\":\"D8sD8skx\",\"docs_guides_deployment.md\":\"CFli_dKV\",\"docs_guides_installation.md\":\"DE1OkWLz\",\"docs_guides_postgres-permissions.md\":\"CdbDCMVx\",\"docs_guides_security.md\":\"D-l3zYXi\",\"docs_guides_shapes.md\":\"CPuokKrK\",\"docs_guides_sharding.md\":\"CquzB4ei\",\"docs_guides_troubleshooting.md\":\"CAekaf3H\",\"docs_guides_writes.md\":\"-QpfGb-B\",\"docs_integrations_aws.md\":\"CFjZQY_n\",\"docs_integrations_cloudflare.md\":\"MvZUcUoj\",\"docs_integrations_crunchy.md\":\"DnZ5DCzf\",\"docs_integrations_digital-ocean.md\":\"Bwe9GDS1\",\"docs_integrations_expo.md\":\"Cs6atpvP\",\"docs_integrations_fly.md\":\"BFRbm_lw\",\"docs_integrations_gcp.md\":\"DcL3_wDy\",\"docs_integrations_livestore.md\":\"BExYNslP\",\"docs_integrations_mobx.md\":\"BdsYB7WB\",\"docs_integrations_neon.md\":\"Dqb_q5_o\",\"docs_integrations_netlify.md\":\"DEOT7v0R\",\"docs_integrations_next.md\":\"BFAy43is\",\"docs_integrations_phoenix.md\":\"iwQ20sD-\",\"docs_integrations_planetscale.md\":\"DEVxApVu\",\"docs_integrations_react.md\":\"Cx2sxq67\",\"docs_integrations_redis.md\":\"DUEckOG7\",\"docs_integrations_render.md\":\"Dn_z6DJo\",\"docs_integrations_supabase.md\":\"MsiVS4fy\",\"docs_integrations_tanstack.md\":\"C9MsaxDT\",\"docs_integrations_vercel.md\":\"CCrepP5b\",\"docs_integrations_yjs.md\":\"CwoUxCrD\",\"docs_intro.md\":\"B51O8NVh\",\"docs_llms__intro_redux.md\":\"b0wf2SP7\",\"docs_llms__quickstart_redux.md\":\"B27brHB8\",\"docs_quickstart.md\":\"DhHw3UBM\",\"docs_reference_alternatives.md\":\"QfrFTLye\",\"docs_reference_benchmarks.md\":\"BRuD3kNN\",\"docs_reference_literature.md\":\"Bq8FNy3z\",\"docs_reference_telemetry.md\":\"BppQTfl8\",\"docs_stacks.md\":\"BOeSdfsC\",\"index.md\":\"6Z7BE4Yr\",\"old-index.md\":\"DJn6VF_b\",\"pricing.md\":\"RCkC-1lg\",\"primitives_durable-streams.md\":\"B32ir6di\",\"primitives_index.md\":\"CTzjhOaQ\",\"primitives_pglite.md\":\"Cz-ZW19n\",\"primitives_postgres-sync.md\":\"BQ4lRh4r\",\"primitives_tanstack-db.md\":\"DBlk_Fb5\",\"src_partials_home-cta.md\":\"CC1folU4\",\"src_partials_home-features-after.md\":\"CQ_a_cfZ\",\"src_partials_home-features-before.md\":\"DTNzqvd-\",\"src_partials_home-your-stack-simplified.md\":\"4e8Yiw8a\",\"sync.md\":\"D4TMXcTx\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en\",\"dir\":\"ltr\",\"title\":\"Electric\",\"description\":\"Electric provides the data primitives and infra to build collaborative, multi-agent systems. Including Postgres Sync, Durable Streams, TanStack DB and PGlite.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":\"force-dark\",\"themeConfig\":{\"editLink\":{\"pattern\":\"https://github.com/electric-sql/electric/edit/main/website/:path\"},\"logo\":\"/img/brand/logo.svg\",\"nav\":[{\"text\":\"Sync\",\"link\":\"/sync\",\"activeMatch\":\"/sync\"},{\"text\":\"Primitives\",\"link\":\"/primitives\",\"activeMatch\":\"/primitives\"},{\"text\":\"Cloud\",\"link\":\"/cloud\",\"activeMatch\":\"/cloud\"},{\"text\":\"Pricing\",\"link\":\"/pricing\",\"activeMatch\":\"/pricing\"},{\"text\":\"Docs\",\"link\":\"/docs/intro\",\"activeMatch\":\"/docs/\"},{\"text\":\"Demos\",\"link\":\"/demos\",\"activeMatch\":\"/demos\"},{\"text\":\"Blog\",\"link\":\"/blog\",\"activeMatch\":\"/blog\"},{\"text\":\"About\",\"link\":\"/about/community\",\"activeMatch\":\"/about/\"},{\"component\":\"NavSignupButton\"}],\"search\":{\"provider\":\"local\"},\"sidebar\":{\"/primitives\":[{\"text\":\"Primitives\",\"items\":[{\"text\":\"Overview\",\"link\":\"/primitives/\"},{\"text\":\"Postgres Sync\",\"link\":\"/primitives/postgres-sync\"},{\"text\":\"Durable Streams\",\"link\":\"/primitives/durable-streams\"},{\"text\":\"TanStack DB\",\"link\":\"/primitives/tanstack-db\"},{\"text\":\"PGlite\",\"link\":\"/primitives/pglite\"}]}],\"/cloud\":[{\"text\":\"Electric Cloud\",\"items\":[{\"text\":\"Overview\",\"link\":\"/cloud/\"},{\"text\":\"Usage\",\"link\":\"/cloud/usage\"},{\"text\":\"Protocols\",\"link\":\"/cloud/protocols\"},{\"text\":\"Pricing\",\"link\":\"/pricing\"},{\"text\":\"CLI\",\"link\":\"/cloud/cli\"}]}],\"/docs\":[{\"text\":\"Docs\",\"collapsed\":false,\"items\":[{\"text\":\"Intro\",\"link\":\"/docs/intro\"},{\"text\":\"Quickstart\",\"link\":\"/docs/quickstart\"},{\"text\":\"Stacks\",\"link\":\"/docs/stacks\"},{\"text\":\"AGENTS.md\",\"link\":\"/docs/agents\"}]},{\"text\":\"Guides\",\"collapsed\":false,\"items\":[{\"text\":\"Auth\",\"link\":\"/docs/guides/auth\"},{\"text\":\"Shapes\",\"link\":\"/docs/guides/shapes\"},{\"text\":\"Writes\",\"link\":\"/docs/guides/writes\"},{\"text\":\"Installation\",\"link\":\"/docs/guides/installation\"},{\"text\":\"PostgreSQL Permissions\",\"link\":\"/docs/guides/postgres-permissions\"},{\"text\":\"Deployment\",\"link\":\"/docs/guides/deployment\"},{\"text\":\"Sharding\",\"link\":\"/docs/guides/sharding\"},{\"text\":\"Security\",\"link\":\"/docs/guides/security\"},{\"text\":\"Troubleshooting\",\"link\":\"/docs/guides/troubleshooting\"},{\"text\":\"Client development\",\"link\":\"/docs/guides/client-development\"}]},{\"text\":\"API\",\"collapsed\":false,\"items\":[{\"text\":\"HTTP\",\"link\":\"/docs/api/http\"},{\"text\":\"Clients\",\"items\":[{\"text\":\"TypeScript\",\"link\":\"/docs/api/clients/typescript\"},{\"text\":\"Elixir\",\"link\":\"/docs/api/clients/elixir\"}],\"collapsed\":false},{\"text\":\"Config\",\"link\":\"/docs/api/config\"}]},{\"text\":\"Integrations\",\"collapsed\":false,\"items\":[{\"text\":\"Frameworks\",\"items\":[{\"text\":\"LiveStore\",\"link\":\"/docs/integrations/livestore\"},{\"text\":\"MobX\",\"link\":\"/docs/integrations/mobx\"},{\"text\":\"Next.js\",\"link\":\"/docs/integrations/next\"},{\"text\":\"Phoenix\",\"link\":\"/docs/integrations/phoenix\"},{\"text\":\"React\",\"link\":\"/docs/integrations/react\"},{\"text\":\"Redis\",\"link\":\"/docs/integrations/redis\"},{\"text\":\"TanStack\",\"link\":\"/docs/integrations/tanstack\"},{\"text\":\"Yjs\",\"link\":\"/docs/integrations/yjs\"}]},{\"text\":\"Platforms\",\"items\":[{\"text\":\"AWS\",\"link\":\"/docs/integrations/aws\"},{\"text\":\"Cloudflare\",\"link\":\"/docs/integrations/cloudflare\"},{\"text\":\"Crunchy\",\"link\":\"/docs/integrations/crunchy\"},{\"text\":\"Digital Ocean\",\"link\":\"/docs/integrations/digital-ocean\"},{\"text\":\"Expo\",\"link\":\"/docs/integrations/expo\"},{\"text\":\"Fly.io\",\"link\":\"/docs/integrations/fly\"},{\"text\":\"GCP\",\"link\":\"/docs/integrations/gcp\"},{\"text\":\"Neon\",\"link\":\"/docs/integrations/neon\"},{\"text\":\"Netlify\",\"link\":\"/docs/integrations/netlify\"},{\"text\":\"PlanetScale\",\"link\":\"/docs/integrations/planetscale\"},{\"text\":\"Render\",\"link\":\"/docs/integrations/render\"},{\"text\":\"Supabase\",\"link\":\"/docs/integrations/supabase\"}]}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Alternatives\",\"link\":\"/docs/reference/alternatives\"},{\"text\":\"Benchmarks\",\"link\":\"/docs/reference/benchmarks\"},{\"text\":\"Literature\",\"link\":\"/docs/reference/literature\"},{\"text\":\"Telemetry\",\"link\":\"/docs/reference/telemetry\"}]}],\"/demos\":[{\"text\":\"Demos\",\"collapsed\":false,\"items\":[{\"text\":\"Burn\",\"link\":\"/demos/burn\"},{\"text\":\"AI Chat\",\"link\":\"/demos/ai-chat\"},{\"text\":\"Linearlite\",\"link\":\"/demos/linearlite\"},{\"text\":\"Notes\",\"link\":\"/demos/notes\"},{\"text\":\"Pixel art\",\"link\":\"/demos/pixel-art\"}]},{\"text\":\"Examples\",\"collapsed\":false,\"items\":[{\"text\":\"Bash\",\"link\":\"/demos/bash\"},{\"text\":\"Encryption\",\"link\":\"/demos/encryption\"},{\"text\":\"Gatekeeper auth\",\"link\":\"/demos/gatekeeper-auth\"},{\"text\":\"Next.js\",\"link\":\"/demos/nextjs\"},{\"text\":\"Phoenix LiveView\",\"link\":\"/demos/phoenix-liveview\"},{\"text\":\"Proxy auth\",\"link\":\"/demos/proxy-auth\"},{\"text\":\"React\",\"link\":\"/demos/react\"},{\"text\":\"Redis\",\"link\":\"/demos/redis\"},{\"text\":\"Remix\",\"link\":\"/demos/remix\"},{\"text\":\"Tanstack\",\"link\":\"/demos/tanstack\"},{\"text\":\"Todo app\",\"link\":\"/demos/todo-app\"},{\"text\":\"Write patterns\",\"link\":\"/demos/write-patterns\"},{\"text\":\"Yjs\",\"link\":\"/demos/yjs\"}]}],\"/blog\":[{\"text\":\"Blog\",\"items\":[{\"text\":\"Electric Cloud pricing is live\",\"link\":\"/blog/2026/04/02/electric-cloud-pricing\"},{\"text\":\"StreamDB — a reactive database in a Durable Stream\",\"link\":\"/blog/2026/03/26/stream-db\"},{\"text\":\"Electric apps get persistence and includes with TanStack DB 0.6\",\"link\":\"/blog/2026/03/25/tanstack-db-0.6-app-ready-with-persistence-and-includes\"},{\"text\":\"Announcing PGlite v0.4: PostGIS, connection multiplexing, and a new architecture\",\"link\":\"/blog/2026/03/25/announcing-pglite-v04\"},{\"text\":\"Durable Transports for your AI SDK\",\"link\":\"/blog/2026/03/24/durable-transport-ai-sdks\"},{\"text\":\"Agent skills now shipping in our npm packages\",\"link\":\"/blog/2026/03/06/agent-skills-now-shipping\"},{\"text\":\"Amdahl's law for AI agents\",\"link\":\"/blog/2026/02/19/amdahls-law-for-ai-agents\"},{\"text\":\"Configurancy: keeping systems intelligible when agents write all the code\",\"link\":\"/blog/2026/02/02/configurancy\"},{\"text\":\"Announcing Hosted Durable Streams\",\"link\":\"/blog/2026/01/22/announcing-hosted-durable-streams\"},{\"text\":\"From fiction to reality, you can now build difficult things\",\"link\":\"/blog/2026/01/20/from-science-fiction-to-reality-you-can-build-difficult-things-now\"},{\"text\":\"Durable Sessions — the key pattern for collaborative AI\",\"link\":\"/blog/2026/01/12/durable-sessions-for-collaborative-ai\"},{\"text\":\"Durable Streams 0.1.0 and State Protocol\",\"link\":\"/blog/2025/12/23/durable-streams-0.1.0\"},{\"text\":\"Announcing Durable Streams\",\"link\":\"/blog/2025/12/09/announcing-durable-streams\"},{\"text\":\"Electric 1.1: new storage engine with 100x faster writes\",\"link\":\"/blog/2025/08/13/electricsql-v1.1-released\"},{\"text\":\"Bringing agents back down to earth\",\"link\":\"/blog/2025/08/12/bringing-agents-back-down-to-earth\"},{\"text\":\"120 days of hardening – the post‑1.0 reliability sprint\",\"link\":\"/blog/2025/08/04/reliability-sprint\"},{\"text\":\"Super-fast apps on sync with Electric and TanStack DB\",\"link\":\"/blog/2025/07/29/super-fast-apps-on-sync-with-tanstack-db\"},{\"text\":\"Vibe coding with a database in the sandbox\",\"link\":\"/blog/2025/06/05/database-in-the-sandbox\"},{\"text\":\"Untangling the LLM spaghetti\",\"link\":\"/blog/2025/04/22/untangling-llm-spaghetti\"},{\"text\":\"Building AI apps? You need sync\",\"link\":\"/blog/2025/04/09/building-ai-apps-on-sync\"},{\"text\":\"Electric Cloud public BETA: Sync in 30 seconds\",\"link\":\"/blog/2025/04/07/electric-cloud-public-beta-release\"},{\"text\":\"Electric 1.0 released\",\"link\":\"/blog/2025/03/17/electricsql-1.0-released\"},{\"text\":\"Electric BETA release\",\"link\":\"/blog/2024/12/10/electric-beta-release\"},{\"text\":\"Local-first with your existing API\",\"link\":\"/blog/2024/11/21/local-first-with-your-existing-api\"},{\"text\":\"A new approach to building Electric\",\"link\":\"/blog/2024/07/17/electric-next\"},{\"text\":\"Electric v0.11 released with support for Postgres in the client\",\"link\":\"/blog/2024/05/14/electricsql-postgres-client-support\"},{\"text\":\"Electric v0.10 released with shape filtering\",\"link\":\"/blog/2024/04/10/electricsql-v0.10-released\"},{\"text\":\"Electrify, Ignition, Liftoff!\",\"link\":\"/blog/2024/02/27/intel-ignite\"},{\"text\":\"Local AI with Postgres, pgvector and llama2, inside a Tauri app\",\"link\":\"/blog/2024/02/05/local-first-ai-with-tauri-postgres-pgvector-llama\"},{\"text\":\"ElectricSQL v0.9 released\",\"link\":\"/blog/2024/01/24/electricsql-v0.9-released\"},{\"text\":\"Secure transactions with local-first\",\"link\":\"/blog/2023/12/15/secure-transactions-with-local-first\"},{\"text\":\"ElectricSQL v0.8 released with JSON and Supabase support\",\"link\":\"/blog/2023/12/13/electricsql-v0.8-released\"},{\"text\":\"Use ElectricSQL with the Ionic Framework and Capacitor\",\"link\":\"/blog/2023/11/02/using-electricsql-with-the-ionic-framework-and-capacitor\"},{\"text\":\"ElectricSQL v0.7 released\",\"link\":\"/blog/2023/11/02/electricsql-v0.7-released\"},{\"text\":\"ElectricSQL hosted the first \\\"Local-first Software London\\\" meet-up\",\"link\":\"/blog/2023/10/26/local-first-software-London-meet-up\"},{\"text\":\"Linearlite - A local-first app built with ElectricSQL and React\",\"link\":\"/blog/2023/10/12/linerlite-local-first-with-react\"},{\"text\":\"Welcome Sam Willis!\",\"link\":\"/blog/2023/10/10/welcome-sam\"},{\"text\":\"Local-first sync for Postgres from the inventors of CRDTs\",\"link\":\"/blog/2023/09/20/introducing-electricsql-v0.6\"},{\"text\":\"Welcome Andrei and Oleksii!\",\"link\":\"/blog/2023/05/10/welcome-andrei-oleksii\"},{\"text\":\"Developing local-first software\",\"link\":\"/blog/2023/02/09/developing-local-first-software\"},{\"text\":\"Welcome José, Kevin and Garry!\",\"link\":\"/blog/2023/02/02/introducing-jose-kevin-garry\"},{\"text\":\"The evolution of state transfer\",\"link\":\"/blog/2022/12/16/evolution-state-transfer\"},{\"text\":\"Relativity and causal consistency\",\"link\":\"/blog/2022/05/20/relativity-causal-consistency\"},{\"text\":\"Introducing Rich-CRDTs\",\"link\":\"/blog/2022/05/03/introducing-rich-crdts\"}]}],\"/about\":[{\"text\":\"About\",\"items\":[{\"text\":\"Community\",\"link\":\"/about/community\"},{\"text\":\"Team\",\"link\":\"/about/team\"},{\"text\":\"Jobs\",\"link\":\"/about/jobs\",\"items\":[{\"text\":\"Founders Associate\",\"link\":\"/about/jobs/founders-associate\"}],\"collapsed\":false},{\"text\":\"Legal\",\"items\":[{\"text\":\"Terms\",\"link\":\"/about/legal/terms\"},{\"text\":\"Privacy\",\"link\":\"/about/legal/privacy\"}],\"collapsed\":false},{\"text\":\"Contact\",\"link\":\"/about/contact\"}]}]},\"siteTitle\":false,\"socialLinks\":[{\"icon\":\"durable-streams\",\"link\":\"https://durablestreams.com\"},{\"icon\":\"tanstack\",\"link\":\"https://tanstack.com/db\"},{\"icon\":\"pglite\",\"link\":\"https://pglite.dev\"},{\"icon\":\"x\",\"link\":\"https://x.com/ElectricSQL\"},{\"icon\":\"discord\",\"link\":\"https://discord.electric-sql.com\"},{\"icon\":\"github\",\"link\":\"https://github.com/electric-sql/electric\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
    
  </body>
</html>