<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Deployment - Guide | Electric</title>
    <meta name="description" content="How to deploy the Electric sync engine.">
    <meta name="generator" content="VitePress v1.5.0">
    <link rel="preload stylesheet" href="/assets/style.RIjqY79U.css" as="style">
    <link rel="preload stylesheet" href="/vp-icons.css" as="style">
    
    <script type="module" src="/assets/app.6hFJuvLV.js"></script>
    <link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="modulepreload" href="/assets/chunks/theme.DCXLaQhN.js">
    <link rel="modulepreload" href="/assets/chunks/framework.D1Q5NcTP.js">
    <link rel="modulepreload" href="/assets/chunks/deploy.C-RmH-S2.js">
    <link rel="modulepreload" href="/assets/chunks/components.sm.c-ITFty9.js">
    <link rel="modulepreload" href="/assets/docs_sync_guides_deployment.md.DAN-IBOp.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,electric.ax" 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="Deployment - Guide | Electric">
    <meta name="twitter:description" content="How to deploy the Electric sync engine.">
    <meta name="twitter:image" content="https://electric.ax/.netlify/images?url=https%3A%2F%2Felectric.ax%2Fimg%2Fmeta%2Felectric.jpg&amp;w=1200&amp;h=630&amp;fit=cover&amp;fm=jpg&amp;q=80">
    <meta property="og:title" content="Deployment - Guide | Electric">
    <meta property="og:description" content="How to deploy the Electric sync engine.">
    <meta property="og:image" content="https://electric.ax/.netlify/images?url=https%3A%2F%2Felectric.ax%2Fimg%2Fmeta%2Felectric.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-53d7592e><!--[--><!--]--><!--[--><span tabindex="-1" data-v-756fd5d1></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-756fd5d1> Skip to content </a><!--]--><!----><header class="VPNav" data-v-53d7592e data-v-7d190830><div class="VPNavBar" data-v-7d190830 data-v-50db50bc><div class="wrapper" data-v-50db50bc><div class="container" data-v-50db50bc><div class="title" data-v-50db50bc><div class="VPNavBarTitle has-sidebar" data-v-50db50bc data-v-1658659a><a class="title" href="/" data-v-1658659a><!--[--><!--]--><!--[--><!--[--><!--[--><img class="VPImage dark logo" src="/img/brand/logo.svg" alt="Electric" data-v-048d2156><!--]--><!--[--><img class="VPImage light logo" src="/img/brand/logo.inverse.svg" alt="Electric" data-v-048d2156><!--]--><!--]--><!--]--><!----><!--[--><!--]--></a></div></div><div class="content" data-v-50db50bc><div class="content-body" data-v-50db50bc><!--[--><!--[--><!--[--><div class="VPNavBarMenu MegaNav"><!--[--><!--[--><div class="mega-nav-trigger-wrap" data-id="agents"><button type="button" class="VPNavBarMenuLink mega-nav-link mega-nav-trigger" aria-haspopup="menu" aria-expanded="false" aria-controls="mega-panel-agents">Agents <span class="mega-nav-chevron vpi-chevron-down" aria-hidden="true"></span></button><!----></div><!--]--><!--[--><div class="mega-nav-trigger-wrap" data-id="streams"><button type="button" class="VPNavBarMenuLink mega-nav-link mega-nav-trigger" aria-haspopup="menu" aria-expanded="false" aria-controls="mega-panel-streams">Streams <span class="mega-nav-chevron vpi-chevron-down" aria-hidden="true"></span></button><!----></div><!--]--><!--[--><div class="mega-nav-trigger-wrap" data-id="sync"><button type="button" class="active VPNavBarMenuLink mega-nav-link mega-nav-trigger" aria-haspopup="menu" aria-expanded="false" aria-controls="mega-panel-sync">Sync <span class="mega-nav-chevron vpi-chevron-down" aria-hidden="true"></span></button><!----></div><!--]--><!--[--><span class="mega-nav-divider" aria-hidden="true"></span><!--]--><!--[--><div class="mega-nav-trigger-wrap" data-id="cloud"><button type="button" class="VPNavBarMenuLink mega-nav-link mega-nav-trigger" aria-haspopup="menu" aria-expanded="false" aria-controls="mega-panel-cloud">Cloud <span class="mega-nav-chevron vpi-chevron-down" aria-hidden="true"></span></button><!----></div><!--]--><!--[--><a class="mega-nav-top-pricing VPNavBarMenuLink mega-nav-link" href="/pricing">Pricing</a><!--]--><!--[--><span class="mega-nav-divider" aria-hidden="true"></span><!--]--><!--[--><a class="mega-nav-top-blog VPNavBarMenuLink mega-nav-link" href="/blog">Blog</a><!--]--><!--[--><div class="mega-nav-trigger-wrap" data-id="resources"><button type="button" class="VPNavBarMenuLink mega-nav-link mega-nav-trigger" aria-haspopup="menu" aria-expanded="false" aria-controls="mega-panel-resources">More <span class="mega-nav-chevron vpi-chevron-down" aria-hidden="true"></span></button><!----></div><!--]--><!--]--></div><!--]--><!--]--><!--]--><div class="VPNavBarSearch search" data-v-50db50bc><!--[--><!----><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-50db50bc data-v-e02be8ee><span id="main-nav-aria-label" class="visually-hidden" data-v-e02be8ee> Main Navigation </span><!--[--><!--]--></nav><!----><!----><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-50db50bc data-v-41f0c3ea data-v-4c1b1d12><!--[--><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-50db50bc data-v-4b696f69 data-v-55f0ba30><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-55f0ba30><span class="vpi-more-horizontal icon" data-v-55f0ba30></span></button><div class="menu" data-v-55f0ba30><div class="VPMenu" data-v-55f0ba30 data-v-cdf166a9><!----><!--[--><!--[--><!----><!----><div class="group" data-v-4b696f69><div class="item social-links" data-v-4b696f69><div class="VPSocialLinks social-links-list" data-v-4b696f69 data-v-4c1b1d12><!--[--><!--]--></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-43af2b7a>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-43af2b7a>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-43af2b7a>Go to Cloud</a></div></div><!--]--><!--]--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-50db50bc data-v-98160fa3><span class="container" data-v-98160fa3><span class="top" data-v-98160fa3></span><span class="middle" data-v-98160fa3></span><span class="bottom" data-v-98160fa3></span></span></button></div></div></div></div><div class="divider" data-v-50db50bc><div class="divider-line" data-v-50db50bc></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-53d7592e data-v-171f8b65><div class="container" data-v-171f8b65><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-171f8b65><span class="vpi-align-left menu-icon" data-v-171f8b65></span><span class="menu-text" data-v-171f8b65>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-171f8b65 data-v-6b00a9e6><button data-v-6b00a9e6>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-53d7592e data-v-958c514a><div class="curtain" data-v-958c514a></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-958c514a><span class="visually-hidden" id="sidebar-aria-label" data-v-958c514a> Sidebar Navigation </span><!--[--><!--[--><div class="docs-sidebar-hero" data-v-2c1b19f1><a class="docs-sidebar-hero-btn docs-sidebar-hero-btn--sync" href="/sync" aria-label="Back to the Electric Sync home page" data-v-2c1b19f1><span class="docs-sidebar-hero-label" data-v-2c1b19f1>Electric Sync</span><span class="docs-sidebar-hero-arrow vpi-chevron-right" aria-hidden="true" data-v-2c1b19f1></span></a><!--[--><div class="docs-sidebar-hero-link" data-v-2c1b19f1><div class="VPSidebarItem level-0 is-link" data-v-2c1b19f1 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Overview</p><!--]--></a><!----></div><!----></div></div><div class="docs-sidebar-hero-link" data-v-2c1b19f1><div class="VPSidebarItem level-0 is-link" data-v-2c1b19f1 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/quickstart" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Quickstart</p><!--]--></a><!----></div><!----></div></div><div class="docs-sidebar-hero-link" data-v-2c1b19f1><div class="VPSidebarItem level-0 is-link" data-v-2c1b19f1 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/stacks" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Stacks</p><!--]--></a><!----></div><!----></div></div><div class="docs-sidebar-hero-link" data-v-2c1b19f1><div class="VPSidebarItem level-0 is-link" data-v-2c1b19f1 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/sync/demos/" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Demos</p><!--]--></a><!----></div><!----></div></div><!--]--></div><!--]--><!--]--><!--[--><div class="no-transition group" data-v-12d53e25><section class="VPSidebarItem level-0 collapsible" data-v-12d53e25 data-v-8d0ea651><div class="item" role="button" tabindex="0" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><h2 class="text" data-v-8d0ea651>Sync primitives</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-8d0ea651><span class="vpi-chevron-right caret-icon" data-v-8d0ea651></span></div></div><div class="items" data-v-8d0ea651><!--[--><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/sync/postgres-sync" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Postgres Sync</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/sync/tanstack-db" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>TanStack DB</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/sync/pglite" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>PGlite</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-12d53e25><section class="VPSidebarItem level-0 collapsible has-active" data-v-12d53e25 data-v-8d0ea651><div class="item" role="button" tabindex="0" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><h2 class="text" data-v-8d0ea651>Guides</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-8d0ea651><span class="vpi-chevron-right caret-icon" data-v-8d0ea651></span></div></div><div class="items" data-v-8d0ea651><!--[--><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/guides/auth" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Auth</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/guides/shapes" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Shapes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/guides/writes" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Writes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/guides/installation" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Installation</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/guides/postgres-permissions" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>PostgreSQL Permissions</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/guides/deployment" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Deployment</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/guides/upgrading" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Upgrading</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/guides/sharding" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Sharding</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/guides/security" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Security</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/guides/troubleshooting" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Troubleshooting</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/guides/client-development" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Client development</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-12d53e25><section class="VPSidebarItem level-0 collapsible" data-v-12d53e25 data-v-8d0ea651><div class="item" role="button" tabindex="0" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><h2 class="text" data-v-8d0ea651>API</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-8d0ea651><span class="vpi-chevron-right caret-icon" data-v-8d0ea651></span></div></div><div class="items" data-v-8d0ea651><!--[--><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/api/http" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>HTTP</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-1 collapsible" data-v-8d0ea651 data-v-8d0ea651><div class="item" role="button" tabindex="0" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><h3 class="text" data-v-8d0ea651>Clients</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-8d0ea651><span class="vpi-chevron-right caret-icon" data-v-8d0ea651></span></div></div><div class="items" data-v-8d0ea651><!--[--><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/api/clients/typescript" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>TypeScript</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/api/clients/elixir" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Elixir</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/api/config" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Config</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-12d53e25><section class="VPSidebarItem level-0 collapsible" data-v-12d53e25 data-v-8d0ea651><div class="item" role="button" tabindex="0" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><h2 class="text" data-v-8d0ea651>Integrations</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-8d0ea651><span class="vpi-chevron-right caret-icon" data-v-8d0ea651></span></div></div><div class="items" data-v-8d0ea651><!--[--><section class="VPSidebarItem level-1" data-v-8d0ea651 data-v-8d0ea651><div class="item" role="button" tabindex="0" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><h3 class="text" data-v-8d0ea651>Frameworks</h3><!----></div><div class="items" data-v-8d0ea651><!--[--><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/livestore" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>LiveStore</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/mobx" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>MobX</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/next" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Next.js</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/phoenix" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Phoenix</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/react" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>React</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/redis" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Redis</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/tanstack" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>TanStack</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/yjs" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Yjs</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1" data-v-8d0ea651 data-v-8d0ea651><div class="item" role="button" tabindex="0" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><h3 class="text" data-v-8d0ea651>Platforms</h3><!----></div><div class="items" data-v-8d0ea651><!--[--><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/aws" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>AWS</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/cloudflare" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Cloudflare</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/crunchy" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Crunchy</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/digital-ocean" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Digital Ocean</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/expo" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Expo</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/fly" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Fly.io</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/gcp" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>GCP</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/neon" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Neon</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/netlify" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Netlify</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/planetscale" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>PlanetScale</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/render" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Render</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/integrations/supabase" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Supabase</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="no-transition group" data-v-12d53e25><section class="VPSidebarItem level-0 collapsible" data-v-12d53e25 data-v-8d0ea651><div class="item" role="button" tabindex="0" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><h2 class="text" data-v-8d0ea651>Reference</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-8d0ea651><span class="vpi-chevron-right caret-icon" data-v-8d0ea651></span></div></div><div class="items" data-v-8d0ea651><!--[--><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/reference/alternatives" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Alternatives</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/reference/benchmarks" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Benchmarks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/reference/literature" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Literature</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-8d0ea651 data-v-8d0ea651><div class="item" data-v-8d0ea651><div class="indicator" data-v-8d0ea651></div><a class="VPLink link link" href="/docs/sync/reference/telemetry" data-v-8d0ea651><!--[--><p class="text" data-v-8d0ea651>Telemetry</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-53d7592e data-v-cc7caf18><div class="VPDoc has-sidebar has-aside" data-v-cc7caf18 data-v-9de355d2><!--[--><!--[--><!--[--><div class="markdown-link-local-nav-container"><a class="markdown-link-local-nav" href="/docs/sync/guides/deployment.md" target="_blank" rel="noopener" data-v-f88f512c><span class="title" data-v-f88f512c>✨ Markdown</span></a></div><!----><!--]--><!--]--><!--]--><div class="container" data-v-9de355d2><div class="aside" data-v-9de355d2><div class="aside-curtain" data-v-9de355d2></div><div class="aside-container" data-v-9de355d2><div class="aside-content" data-v-9de355d2><div class="VPDocAside" data-v-9de355d2 data-v-a2bbf8e3><!--[--><!--]--><!--[--><!--[--><!--[--><!--[--><a class="markdown-link-aside pager-link" href="/docs/sync/guides/deployment.md" target="_blank" rel="noopener" data-v-f88f512c><span class="title" data-v-f88f512c>✨ Markdown</span></a><!--]--><!--]--><!--]--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-a2bbf8e3 data-v-a4fbf1e8><div class="content" data-v-a4fbf1e8><div class="outline-marker" data-v-a4fbf1e8></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-a4fbf1e8>On this page</div><ul class="VPDocOutlineItem root" data-v-a4fbf1e8 data-v-f8b22c7d><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-a2bbf8e3></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-9de355d2><div class="content-container" data-v-9de355d2><!--[--><!--]--><main class="main" data-v-9de355d2><div style="position:relative;" class="vp-doc _docs_sync_guides_deployment" data-v-9de355d2><div><div style="display:none;" hidden="true" aria-hidden="true">Are you an LLM? You can read better optimized documentation at /docs/sync/guides/deployment.md for this page in Markdown format</div><p><img src="/img/icons/deploy.png" class="product-icon" style="width:72px;"></p><h1 id="deployment" tabindex="-1">Deployment <a class="header-anchor" href="#deployment" aria-label="Permalink to &quot;Deployment&quot;">​</a></h1><p>How to deploy the <a href="/sync/">Electric sync engine</a>, with links to integration docs for specific platforms like <a href="/docs/sync/integrations/supabase">Supabase</a>, <a href="/docs/sync/integrations/neon">Neon</a>, <a href="/docs/sync/integrations/render">Render</a> and <a href="/docs/sync/integrations/aws">AWS</a>.</p><div class="tip custom-block github-alert"><p class="custom-block-title">Electric Cloud – the simplest way to use Electric</p><p>The simplest way to use Electric is via the <a href="/cloud/">Electric Cloud</a>, which is a simple, scalable, <span class="no-wrap">low-cost</span>, managed Electric hosting service.</p><p class="action cloud-cta"><a href="/cloud/" class="VPButton small brand vspace"><span class="vpi-electric-icon"></span> View Cloud</a></p></div><h2 id="the-ingredients-of-a-successful-deployment" tabindex="-1">The ingredients of a successful deployment <a class="header-anchor" href="#the-ingredients-of-a-successful-deployment" aria-label="Permalink to &quot;The ingredients of a successful deployment&quot;">​</a></h2><p>An Electric deployment has three main components. Your Postgres database, the Electric sync service and your app.</p><p>Electric connects to your Postgres using a <code>DATABASE_URL</code>. Your app connects to Electric <a href="/docs/sync/api/http">over HTTP</a>, usually using a <a href="/docs/sync/api/clients/typescript">Client library</a>.</p><figure><a href="/assets/components.DNCChOI5.jpg"><img src="/assets/components.qKqz322G.png" class="hidden-sm" alt="Illustration of the main components of a successfull deployment"><img src="/assets/components.sm.BR1Ct5je.png" class="block-sm" style="max-width:360px;" alt="Illustration of the main components of a successfull deployment"></a></figure><p>As a result, there are three ingredients to a successful Electric deployment:</p><ol><li>you need to be <a href="#_1-running-postgres">running a Postgres database</a></li><li>you need to <a href="#_2-running-electric">run and connect the Electric sync service</a></li><li>you need your app/client to <a href="#_3-connecting-your-app">connect to Electric over HTTP</a></li></ol><h3 id="proxying-requests-to-electric" tabindex="-1">Proxying requests to Electric <a class="header-anchor" href="#proxying-requests-to-electric" aria-label="Permalink to &quot;Proxying requests to Electric&quot;">​</a></h3><p>You also often want to proxy requests to Electric through your API, or other proxy. For example, to implement <a href="./auth">auth</a> and/or <a href="/docs/sync/api/http#caching">caching</a>. In these cases, you&#39;ll also need to deploy your API and/or proxy layer in front of Electric.</p><p>Note also that, when running Electric behind a CDN, you may want your proxy in front of the CDN. This is where primitives like <a href="/docs/sync/integrations/supabase#sync-into-edge-function">edge functions</a> and <a href="/docs/sync/integrations/cloudflare#workers">edge workers</a> can be very useful.</p><div class="tip custom-block github-alert"><p class="custom-block-title">Running the proxy on Bun?</p><p>Raise <code>BUN_CONFIG_MAX_HTTP_REQUESTS</code> to match your concurrency. See <a href="/docs/sync/guides/troubleshooting#bun-fetch-concurrency-cap-why-is-my-proxy-slow-under-load">Bun fetch concurrency cap</a> in troubleshooting.</p></div><h3 id="securing-data-access" tabindex="-1">Securing data access <a class="header-anchor" href="#securing-data-access" aria-label="Permalink to &quot;Securing data access&quot;">​</a></h3><p>By default, Electric exposes public access to the contents of your database. You generally don&#39;t want to expose the contents of your database, so you need to <a href="/docs/sync/guides/security#secure-data-access">lock down access</a> to the Electric HTTP API.</p><p>See the <a href="/docs/sync/guides/security">Security guide</a> for information.</p><h2 id="_1-running-postgres" tabindex="-1">1. Running Postgres <a class="header-anchor" href="#_1-running-postgres" aria-label="Permalink to &quot;1. Running Postgres&quot;">​</a></h2><p>You can use <strong><em>any standard Postgres</em></strong>, version 14 and above.</p><p>This includes Postgres you host yourself, or Postgres hosted by managed database hosting providers, including:</p><ul><li><a href="/docs/sync/integrations/supabase">Supabase</a></li><li><a href="/docs/sync/integrations/neon">Neon</a></li><li><a href="/docs/sync/integrations/aws">AWS (RDS and Aurora)</a></li><li><a href="/docs/sync/integrations/gcp">GCP (Cloud SQL and Alloy)</a></li><li><a href="/docs/sync/integrations/digital-ocean">Digital Ocean</a></li><li><a href="/docs/sync/integrations/crunchy">Crunchy</a></li></ul><p>Postgres must have <a href="https://www.postgresql.org/docs/current/logical-replication-config.html" target="_blank" rel="noreferrer">logical replication</a> enabled. You also need to connect as a database role that has the <a href="https://www.postgresql.org/docs/current/logical-replication-security.html" target="_blank" rel="noreferrer"><code>REPLICATION</code></a> attribute.</p><h3 id="data-model-compatibility" tabindex="-1">Data model compatibility <a class="header-anchor" href="#data-model-compatibility" aria-label="Permalink to &quot;Data model compatibility&quot;">​</a></h3><p>Electric is compatible with <strong><em>any Postgres data model</em></strong>.</p><p>Electric will work as a drop on to any existing data model. There are no limitations on the database features, data types or extensions you can use.</p><h3 id="connecting-to-postgres" tabindex="-1">Connecting to Postgres <a class="header-anchor" href="#connecting-to-postgres" aria-label="Permalink to &quot;Connecting to Postgres&quot;">​</a></h3><p>You connect to Postgres using a <a href="/docs/sync/api/config#database-url"><code>DATABASE_URL</code></a> env var. This connection string contains your user credentials and an <code>sslmode</code> parameter.</p><p>You usually want to connect directly to Postgres and not via a connection pool. This is because Electric uses logical replication and most connection poolers don&#39;t support it. (pgBouncer does support logical replication, <a href='https://www.pgbouncer.org/changelog#pgbouncer-123x' rel='noreferrer' target='_blank'>as of version 1.23</a> so this may change in future).</p><p>You can optionally provide a separate <a href="/docs/sync/api/config#electric-query-database-url"><code>ELECTRIC_POOLED_DATABASE_URL</code></a> env var, which can use a pooler and will be used for all queries other than replication.</p><p>To force Electric to verify the database server&#39;s certificate when connecting to it using TLS, set the <a href="/docs/sync/api/config#electric-database-ca-certificate-file"><code>ELECTRIC_DATABASE_CA_CERTIFICATE_FILE</code></a> config option.</p><div class="tip custom-block github-alert"><p class="custom-block-title">Troubleshooting common errors</p><p>If you get a TCP connection error saying <code>non-existing domain - :nxdomain</code> or <code>network is unreachable - :enetunreach</code> then you may need to connect using IPv6. You can enable this by setting <a href="/docs/sync/api/config#database-use-ipv6"><code>ELECTRIC_DATABASE_USE_IPV6=true</code></a>.</p><p>If you get a TCP connection <code>timeout</code> error then make sure you&#39;re connecting directly to Postgres and not via a connection pool. For example, when using <a href="/docs/sync/integrations/supabase">Supabase</a> you need to untick their &quot;Use connection pooling&quot; option on the database settings page.</p><p>If you&#39;re using IPv6 with Docker, then assuming the machine you&#39;re running Electric on has IPv6 connectivity, you may also need to enable IPv6 for the Docker daemon. You can do this by <a href="https://docs.docker.com/engine/daemon/ipv6/#create-an-ipv6-network" target="_blank" rel="noreferrer">defining an IPv6-capable network</a>) in your Compose file and then adding the <code>networks</code> key to the Electric service definition.</p></div><h3 id="database-resources" tabindex="-1">Database resources <a class="header-anchor" href="#database-resources" aria-label="Permalink to &quot;Database resources&quot;">​</a></h3><p>Electric creates a logical replication <a href="https://www.postgresql.org/docs/current/logical-replication-publication.html" target="_blank" rel="noreferrer">publication</a> and <a href="https://www.postgresql.org/docs/current/logical-replication-subscription.html#LOGICAL-REPLICATION-SUBSCRIPTION-SLOT" target="_blank" rel="noreferrer">replication slot</a> inside Postgres. These are called <code>electric_publication_default</code> and <code>electric_slot_default</code> by default. You can configure the name suffix using the <a href="/docs/sync/api/config#replication-stream-id"><code>ELECTRIC_REPLICATION_STREAM_ID</code></a> env var.</p><p>If the database role that Electric connects to Postgres as doesn&#39;t have the required privileges to create or update the publication, Electric will check that the publication exists in the database and that it is in the right state, meaning that any table for which a shape request is created must have been added to the publication by hand, in advance. This behaviour can also be enforced with the <a href="/docs/sync/api/config#electric-manual-table-publishing"><code>ELECTRIC_MANUAL_TABLE_PUBLISHING</code></a> config option.</p><p>When running, Electric also keeps a pool of active database connections open. The size of this pool defaults to <code>20</code> and can be configured using <a href="/docs/sync/api/config#electric-db-pool-size"><code>ELECTRIC_DB_POOL_SIZE</code></a>.</p><div class="tip custom-block github-alert"><p class="custom-block-title">Cleaning up resources</p><p>If you decide to stop using Electric with a given Postgres database or switch to a different database but keep the old one around, make sure to clean up both the publication and the replication slot.</p><p>See this <a href="./troubleshooting#wal-growth-mdash-why-is-my-postgres-database-storage-filling-up">troubleshooting advice</a> for details.</p></div><h2 id="_2-running-electric" tabindex="-1">2. Running Electric <a class="header-anchor" href="#_2-running-electric" aria-label="Permalink to &quot;2. Running Electric&quot;">​</a></h2><p>The <a href="/sync/">Electric sync engine</a> is an Elixir web service, packaged using Docker.</p><p>You can deploy it anywhere you can run a container with a filesystem and exposed HTTP port. This includes cloud and application hosting platforms like:</p><ul><li><a href="/docs/sync/integrations/aws">AWS</a></li><li><a href="/docs/sync/integrations/gcp">GCP</a></li><li><a href="/docs/sync/integrations/digital-ocean">Digital Ocean</a></li><li><a href="/docs/sync/integrations/fly">Fly.io</a></li><li><a href="/docs/sync/integrations/render">Render</a></li></ul><p>The <a href="/docs/sync/integrations/aws#deploy-electric">AWS guide</a> goes into the most depth, covering how to choose an ECS launch type and storage backing. It comes with <a href="https://github.com/electric-sql/electric-aws" target="_blank" rel="noreferrer">example Terraform and Pulumi configurations</a> that provision the whole stack — database, sync service and load balancer.</p><h3 id="docker-container" tabindex="-1">Docker container <a class="header-anchor" href="#docker-container" aria-label="Permalink to &quot;Docker container&quot;">​</a></h3><p>Images are deployed to Docker Hub at <a href="https://hub.docker.com/r/electricsql/electric" target="_blank" rel="noreferrer">electricsql/electric</a>.</p><h3 id="optimizing-for-disk" tabindex="-1">Optimizing for disk <a class="header-anchor" href="#optimizing-for-disk" aria-label="Permalink to &quot;Optimizing for disk&quot;">​</a></h3><p>Electric caches <a href="/docs/sync/api/http#shape-log">Shape logs</a> and metadata on the filesystem. Your Electric host must provide a persistent filesystem. Ideally this should be large, fast and locally mounted, such as a NVMe SSD. If you&#39;re configuring a machine and you want to optimise it for Electric, the factors to optimise for, in order of importance, are:</p><ol><li>disk speed — low latency, high throughput reads and writes</li><li>memory</li><li>CPU</li></ol><p>For example, on AWS, <a href="https://aws.amazon.com/ec2/instance-types/#Storage_Optimized" target="_blank" rel="noreferrer">storage optimized</a> instances such as the <code>i4i</code> family, or general purpose instances that ship local NVMe such as <code>m6id</code>, are both good choices. On Hetzner, the <a href="https://www.hetzner.com/dedicated-rootserver/matrix-sx/" target="_blank" rel="noreferrer">SX-line</a> of dedicated servers works well.</p><p>For a worked example, see <a href="/docs/sync/integrations/aws#ecs-on-ec2">ECS on EC2</a> in the AWS guide. It covers choosing between local NVMe and an attached EBS volume, and <a href="/docs/sync/integrations/aws#bootstrapping-the-data-disk">preparing the disk on boot</a>.</p><h3 id="configuring-storage" tabindex="-1">Configuring storage <a class="header-anchor" href="#configuring-storage" aria-label="Permalink to &quot;Configuring storage&quot;">​</a></h3><p>The path to Electric&#39;s persistent storage can be configured via the <a href="/docs/sync/api/config#electric-storage-dir"><code>ELECTRIC_STORAGE_DIR</code></a> environment variable, e.g. <code>ELECTRIC_STORAGE_DIR=/var/lib/electric/persistent</code>. Electric will create the directory at that path if it doesn&#39;t exist yet. However, you need to make sure that the OS user that Electric is running as has the necessary permissions in the parent directory.</p><p>The file system location configured via <code>ELECTRIC_STORAGE_DIR</code> and the data Electric stores there must survive sync service&#39;s restarts. For example, when using Kubernetes, you&#39;ll want to create a persistent volume and attach it to your Electric deployment.</p><div class="tip custom-block github-alert"><p class="custom-block-title">Clear one, clear the other</p><p>The persistent state that Electric maintains in Postgres (via the logical replication publication and replication slot) <strong>must</strong> stay in sync with the shape data cached on disk by Electric.</p><p>If you change the value of <code>ELECTRIC_STORAGE_DIR</code> or switch to a different <code>DATABASE_URL</code> at any point, you <strong>must</strong> clean up the other location by hand, whether it&#39;s removing a directory tree on disk or dropping the replication slot and publication in Postgres.</p></div><div class="tip custom-block github-alert"><p class="custom-block-title">How much storage space?</p><p>Electric trades storage for low memory use and fast sync. How much storage you need is highly application dependent. We encourage you to test with your own workload.</p><p>We plan to implement <a href="https://github.com/electric-sql/electric/issues/1582" target="_blank" rel="noreferrer">compaction</a> and other features to limit and optimise storage use, such as <a href="https://github.com/electric-sql/electric/issues/1529" target="_blank" rel="noreferrer">garbage collecting LRU shapes</a>.</p></div><h3 id="http-port" tabindex="-1">HTTP port <a class="header-anchor" href="#http-port" aria-label="Permalink to &quot;HTTP port&quot;">​</a></h3><p>Electric provides an HTTP API exposed on a configurable <a href="/docs/sync/api/config#electric-port"><code>ELECTRIC_PORT</code></a>. You should make sure this is exposed to the Internet.</p><h3 id="health-checks" tabindex="-1">Health checks <a class="header-anchor" href="#health-checks" aria-label="Permalink to &quot;Health checks&quot;">​</a></h3><p>Electric provides a health check endpoint at <code>/v1/health</code> that can be used for liveness and readiness probes. This endpoint does not require authentication, so it works even when <a href="/docs/sync/api/config#electric-secret"><code>ELECTRIC_SECRET</code></a> is set.</p><p>The endpoint returns a JSON response with a <code>status</code> field:</p><table tabindex="0"><thead><tr><th>HTTP Status</th><th>Response</th><th>Meaning</th></tr></thead><tbody><tr><td><code>200</code></td><td><code>{&quot;status&quot;: &quot;active&quot;}</code></td><td>Electric is fully operational and ready to serve requests</td></tr><tr><td><code>202</code></td><td><code>{&quot;status&quot;: &quot;waiting&quot;}</code></td><td>Electric is waiting to acquire the replication lock</td></tr><tr><td><code>202</code></td><td><code>{&quot;status&quot;: &quot;starting&quot;}</code></td><td>Electric is starting up and establishing connections</td></tr></tbody></table><p>For <strong>liveness probes</strong>, any response (200 or 202) indicates the service is alive.</p><p>For <strong>readiness probes</strong>, you should check for a <code>200</code> status code to ensure Electric is fully ready to handle shape requests.</p><p>Example health check using curl:</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;">curl</span><span style="color:#9ECBFF;"> http://localhost:3000/v1/health</span></span>
<span class="line"><span style="color:#6A737D;"># {&quot;status&quot;:&quot;active&quot;}</span></span></code></pre></div><h4 id="kubernetes-probes" tabindex="-1">Kubernetes probes <a class="header-anchor" href="#kubernetes-probes" aria-label="Permalink to &quot;Kubernetes probes&quot;">​</a></h4><p>When deploying Electric on Kubernetes, note that standard <code>httpGet</code> probes consider any 2xx response as success. This means an <code>httpGet</code> readiness probe would incorrectly mark the pod as ready when Electric returns <code>202</code> (still starting up).</p><p>For <strong>liveness probes</strong>, <code>httpGet</code> works fine since any response indicates the service is alive:</p><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#85E89D;">livenessProbe</span><span style="color:#E1E4E8;">:</span></span>
<span class="line"><span style="color:#85E89D;">  httpGet</span><span style="color:#E1E4E8;">:</span></span>
<span class="line"><span style="color:#85E89D;">    path</span><span style="color:#E1E4E8;">: </span><span style="color:#9ECBFF;">/v1/health</span></span>
<span class="line"><span style="color:#85E89D;">    port</span><span style="color:#E1E4E8;">: </span><span style="color:#79B8FF;">3000</span></span>
<span class="line"><span style="color:#85E89D;">  initialDelaySeconds</span><span style="color:#E1E4E8;">: </span><span style="color:#79B8FF;">10</span></span>
<span class="line"><span style="color:#85E89D;">  periodSeconds</span><span style="color:#E1E4E8;">: </span><span style="color:#79B8FF;">10</span></span>
<span class="line"><span style="color:#85E89D;">  timeoutSeconds</span><span style="color:#E1E4E8;">: </span><span style="color:#79B8FF;">2</span></span></code></pre></div><p>For <strong>readiness probes</strong>, use an <code>exec</code> probe to check for exactly HTTP 200. The Electric container includes <code>curl</code>:</p><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#85E89D;">readinessProbe</span><span style="color:#E1E4E8;">:</span></span>
<span class="line"><span style="color:#85E89D;">  exec</span><span style="color:#E1E4E8;">:</span></span>
<span class="line"><span style="color:#85E89D;">    command</span><span style="color:#E1E4E8;">:</span></span>
<span class="line"><span style="color:#E1E4E8;">      - </span><span style="color:#9ECBFF;">sh</span></span>
<span class="line"><span style="color:#E1E4E8;">      - </span><span style="color:#9ECBFF;">-c</span></span>
<span class="line"><span style="color:#E1E4E8;">      - </span><span style="color:#F97583;">|</span></span>
<span class="line"><span style="color:#9ECBFF;">        test &quot;$(curl -so /dev/null -w &#39;%{http_code}&#39; http://localhost:3000/v1/health)&quot; = &quot;200&quot;</span></span>
<span class="line"><span style="color:#85E89D;">  initialDelaySeconds</span><span style="color:#E1E4E8;">: </span><span style="color:#79B8FF;">5</span></span>
<span class="line"><span style="color:#85E89D;">  periodSeconds</span><span style="color:#E1E4E8;">: </span><span style="color:#79B8FF;">10</span></span>
<span class="line"><span style="color:#85E89D;">  timeoutSeconds</span><span style="color:#E1E4E8;">: </span><span style="color:#79B8FF;">2</span></span>
<span class="line"><span style="color:#85E89D;">  failureThreshold</span><span style="color:#E1E4E8;">: </span><span style="color:#79B8FF;">3</span></span></code></pre></div><p>This ensures the pod is only marked ready when Electric is fully operational and ready to serve shape requests.</p><div class="tip custom-block github-alert"><p class="custom-block-title">Rolling upgrades need different readiness probes</p><p>If you are performing rolling deployments with <code>maxSurge: 1</code>, the <code>exec</code> probe above will cause a deadlock — the new pod can never return <code>200</code> while the old pod holds the replication lock. Use an <code>httpGet</code> readiness probe instead, which accepts any 2xx. See the <a href="/docs/sync/guides/upgrading">Upgrading guide</a> for details.</p></div><h3 id="observability" tabindex="-1">Observability <a class="header-anchor" href="#observability" aria-label="Permalink to &quot;Observability&quot;">​</a></h3><p>Electric supports <a href="https://opentelemetry.io/" target="_blank" rel="noreferrer">OpenTelemetry</a> for exporting traces, with built-in support for <a href="https://www.honeycomb.io/" target="_blank" rel="noreferrer">Honeycomb.io</a>. Metrics are also available in StatsD and Prometheus formats.</p><p>See the <a href="/docs/sync/reference/telemetry#opentelemetry">Telemetry reference</a> for configuration details.</p><div class="warning custom-block github-alert"><p class="custom-block-title">Scrape the Prometheus endpoint, or leave it disabled</p><p>If you enable the Prometheus endpoint with <code>ELECTRIC_PROMETHEUS_PORT</code>, it <strong>must be scraped regularly</strong>. An enabled-but-unscraped endpoint accumulates metrics in memory without bound and can eventually crash the service. If you only use OpenTelemetry, leave <code>ELECTRIC_PROMETHEUS_PORT</code> unset. See the <a href="/docs/sync/reference/telemetry#metrics">Telemetry reference</a> for details.</p></div><h3 id="caching-proxy" tabindex="-1">Caching proxy <a class="header-anchor" href="#caching-proxy" aria-label="Permalink to &quot;Caching proxy&quot;">​</a></h3><p>Electric is designed to run behind a caching proxy, such as <a href="https://nginx.org/en" target="_blank" rel="noreferrer">Nginx</a>, <a href="https://caddyserver.com" target="_blank" rel="noreferrer">Caddy</a>, <a href="https://varnish-cache.org" target="_blank" rel="noreferrer">Varnish</a> or a CDN like <a href="https://www.cloudflare.com/en-gb/application-services/primitives/cdn" target="_blank" rel="noreferrer">Cloudflare</a> or <a href="https://www.fastly.com/primitives/cdn" target="_blank" rel="noreferrer">Fastly</a>. You don&#39;t <em>have</em> to run a proxy in front of Electric but you will benefit from radically better performance if you do.</p><p>See the <a href="/docs/sync/api/http#caching">Caching section</a> of the HTTP API docs for more information.</p><h3 id="upgrading" tabindex="-1">Upgrading <a class="header-anchor" href="#upgrading" aria-label="Permalink to &quot;Upgrading&quot;">​</a></h3><p>If you&#39;re running Electric behind an orchestrator that performs rolling updates (e.g., Kubernetes, AWS ECS), see the <a href="/docs/sync/guides/upgrading">Upgrading guide</a> for strategies to minimize disruption when deploying new versions.</p><h2 id="_3-connecting-your-app" tabindex="-1">3. Connecting your app <a class="header-anchor" href="#_3-connecting-your-app" aria-label="Permalink to &quot;3. Connecting your app&quot;">​</a></h2><p>You can then connect your app to Electric <a href="/docs/sync/api/http">over HTTP</a>. Typically you use a <a href="/docs/sync/api/clients/typescript">Client library</a> and configure the URL in the constructor, e.g.:</p><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#F97583;">const</span><span style="color:#79B8FF;"> stream</span><span style="color:#F97583;"> =</span><span style="color:#F97583;"> new</span><span style="color:#B392F0;"> ShapeStream</span><span style="color:#E1E4E8;">({</span></span>
<span class="line"><span style="color:#E1E4E8;">  url: </span><span style="color:#9ECBFF;">`https://your-electric-service.example.com/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;">`foo`</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:#F97583;">const</span><span style="color:#79B8FF;"> shape</span><span style="color:#F97583;"> =</span><span style="color:#F97583;"> new</span><span style="color:#B392F0;"> Shape</span><span style="color:#E1E4E8;">(stream)</span></span></code></pre></div><p>You can connect to Electric from any language/environment that speaks HTTP. See the <a href="/docs/sync/api/http">HTTP API</a> and <a href="/docs/sync/api/clients/typescript">Client docs</a> for more information.</p></div></div></main><footer class="VPDocFooter" data-v-9de355d2 data-v-a3804509><!--[--><!--]--><div class="edit-info" data-v-a3804509><div class="edit-link" data-v-a3804509><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/electric-sql/electric/edit/main/website/docs/sync/guides/deployment.md" target="_blank" rel="noreferrer" data-v-a3804509><!--[--><span class="vpi-square-pen edit-link-icon" data-v-a3804509></span> Edit this page<!--]--></a></div><!----></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-a3804509><span class="visually-hidden" id="doc-footer-aria-label" data-v-a3804509>Pager</span><div class="pager" data-v-a3804509><a class="VPLink link pager-link prev" href="/docs/sync/guides/postgres-permissions" data-v-a3804509><!--[--><span class="desc" data-v-a3804509>Previous page</span><span class="title" data-v-a3804509>PostgreSQL Permissions</span><!--]--></a></div><div class="pager" data-v-a3804509><a class="VPLink link pager-link next" href="/docs/sync/guides/upgrading" data-v-a3804509><!--[--><span class="desc" data-v-a3804509>Next page</span><span class="title" data-v-a3804509>Upgrading</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
    <script>window.__VP_HASH_MAP__=JSON.parse("{\"about_community.md\":\"UuQw7PpW\",\"about_contact.md\":\"CrWeZGP9\",\"about_index.md\":\"Bq4KZzf1\",\"about_legal_delete-account.md\":\"DICjdN43\",\"about_legal_dpa.md\":\"CrPdIFxp\",\"about_legal_privacy.md\":\"C611Yjau\",\"about_legal_subprocessors.md\":\"60BNvMnV\",\"about_legal_terms.md\":\"DT1KLhME\",\"about_team.md\":\"CFJikY0z\",\"agents_demos.md\":\"C6KXCB6_\",\"agents_demos_chat-starter.md\":\"jOrNZOok\",\"agents_demos_deep-survey.md\":\"Zo9eelhq\",\"agents_index.md\":\"D5Vs-BRf\",\"app.md\":\"BhKbexup\",\"blog.md\":\"ofOT4asT\",\"blog_2022_05_03_introducing-rich-crdts.md\":\"mRerUczD\",\"blog_2022_05_20_relativity-causal-consistency.md\":\"COcdxIu1\",\"blog_2022_12_16_evolution-state-transfer.md\":\"DYPI1l3N\",\"blog_2023_02_02_introducing-jose-kevin-garry.md\":\"BwaGnHCI\",\"blog_2023_02_09_developing-local-first-software.md\":\"CZeRedyL\",\"blog_2023_05_10_welcome-andrei-oleksii.md\":\"eiBWAe3D\",\"blog_2023_09_20_introducing-electricsql-v0.6.md\":\"DDWXSB9a\",\"blog_2023_10_10_welcome-sam.md\":\"CkitPE9L\",\"blog_2023_10_12_linerlite-local-first-with-react.md\":\"ui4X1QdI\",\"blog_2023_10_26_local-first-software-london-meet-up.md\":\"BJFxTL0q\",\"blog_2023_11_02_electricsql-v0.7-released.md\":\"DXl8qrG7\",\"blog_2023_11_02_using-electricsql-with-the-ionic-framework-and-capacitor.md\":\"CCh6Rzbz\",\"blog_2023_12_13_electricsql-v0.8-released.md\":\"kEmocVVP\",\"blog_2023_12_15_secure-transactions-with-local-first.md\":\"E9HixMLR\",\"blog_2024_01_24_electricsql-v0.9-released.md\":\"gfcO1sKX\",\"blog_2024_02_05_local-first-ai-with-tauri-postgres-pgvector-llama.md\":\"DwsPscOL\",\"blog_2024_02_27_intel-ignite.md\":\"CYQ4ZqQL\",\"blog_2024_04_10_electricsql-v0.10-released.md\":\"zHPlO7EW\",\"blog_2024_05_14_electricsql-postgres-client-support.md\":\"COsfmo0d\",\"blog_2024_07_17_electric-next.md\":\"Deyv0ZgX\",\"blog_2024_11_21_local-first-with-your-existing-api.md\":\"D2sFRRct\",\"blog_2024_12_10_electric-beta-release.md\":\"CMQETgpK\",\"blog_2025_03_17_electricsql-1.0-released.md\":\"DsGpPE4A\",\"blog_2025_04_07_electric-cloud-public-beta-release.md\":\"Bjfl35T-\",\"blog_2025_04_09_building-ai-apps-on-sync.md\":\"B3B-lRW9\",\"blog_2025_04_22_untangling-llm-spaghetti.md\":\"D4wPgzao\",\"blog_2025_06_05_database-in-the-sandbox.md\":\"Bh9Hqadw\",\"blog_2025_07_29_super-fast-apps-on-sync-with-tanstack-db.md\":\"DSrYj0du\",\"blog_2025_08_04_reliability-sprint.md\":\"B8mnnGjP\",\"blog_2025_08_12_bringing-agents-back-down-to-earth.md\":\"0BjqObCU\",\"blog_2025_08_13_electricsql-v1.1-released.md\":\"-4PdpeCE\",\"blog_2025_12_09_announcing-durable-streams.md\":\"aC3UpQtp\",\"blog_2025_12_23_durable-streams-0.1.0.md\":\"CYvoVp1w\",\"blog_2026_01_12_durable-sessions-for-collaborative-ai.md\":\"C_Ece-8n\",\"blog_2026_01_20_from-science-fiction-to-reality-you-can-build-difficult-things-now.md\":\"DIqN2k2l\",\"blog_2026_01_22_announcing-hosted-durable-streams.md\":\"DZ8U66OM\",\"blog_2026_02_02_configurancy.md\":\"C8sfka6L\",\"blog_2026_02_19_amdahls-law-for-ai-agents.md\":\"B1d9DqMw\",\"blog_2026_03_06_agent-skills-now-shipping.md\":\"BZdruk20\",\"blog_2026_03_24_durable-transport-ai-sdks.md\":\"Cvjb-9Yu\",\"blog_2026_03_25_announcing-pglite-v04.md\":\"ByHu8ESa\",\"blog_2026_03_25_tanstack-db-0.6-app-ready-with-persistence-and-includes.md\":\"DMSoDlVK\",\"blog_2026_03_26_stream-db.md\":\"CEfor2AD\",\"blog_2026_04_02_electric-cloud-pricing.md\":\"VJpp1eZT\",\"blog_2026_04_07_yjs-durable-streams-on-electric-cloud.md\":\"D-jS_4_n\",\"blog_2026_04_08_ai-agents-as-crdt-peers-with-yjs.md\":\"b_HPl6j1\",\"blog_2026_04_08_data-primitive-agent-loop.md\":\"lw7j3UtO\",\"blog_2026_04_15_fork-branching-for-durable-streams.md\":\"Whm6CPqM\",\"blog_2026_04_20_doom-on-durable-streams.md\":\"BUeKgpEs\",\"blog_2026_04_29_introducing-electric-agents.md\":\"DRAvdYH9\",\"blog_2026_06_04_serverless-agents.md\":\"DtlH42na\",\"blog_2026_06_16_electric-agents-0-6-from-runtime-to-app.md\":\"B9-yTiO_\",\"blog_2026_06_25_pglite-reaches-10-million-weekly-downloads.md\":\"CElPFtoP\",\"blog_2026_06_26_durable-streams-at-kernel-speed.md\":\"Cbxtjx1W\",\"blog_2026_07_17_electric-circuits.md\":\"-cFNWPsT\",\"blog_2026_08_11_electric-joining-databricks.md\":\"B7o71sMj\",\"brand-toys.md\":\"Fy4UQIH0\",\"changelog.md\":\"Clr1MXla\",\"cloud_cli.md\":\"BU7cLi80\",\"cloud_index.md\":\"CSI1D_9q\",\"cloud_usage.md\":\"D9728tKK\",\"docs_agents_entities_agents_horton.md\":\"CVxAcC4x\",\"docs_agents_entities_agents_worker.md\":\"CQsIM53N\",\"docs_agents_entities_patterns_blackboard.md\":\"DaujizbE\",\"docs_agents_entities_patterns_dispatcher.md\":\"BtvRjkuQ\",\"docs_agents_entities_patterns_manager-worker.md\":\"r4RZOFKq\",\"docs_agents_entities_patterns_map-reduce.md\":\"C0TFuyhH\",\"docs_agents_entities_patterns_pipeline.md\":\"Dzjb_2Hh\",\"docs_agents_entities_patterns_reactive-observers.md\":\"DIu4o0Yz\",\"docs_agents_examples_playground.md\":\"C5EdQJjM\",\"docs_agents_index.md\":\"BG-YHP_e\",\"docs_agents_quickstart.md\":\"D5QlDjVW\",\"docs_agents_reference_agent-config.md\":\"DZ150NYR\",\"docs_agents_reference_agent-tool.md\":\"DW0Xz5pm\",\"docs_agents_reference_built-in-collections.md\":\"CLLSdrk7\",\"docs_agents_reference_cli.md\":\"COPEynMU\",\"docs_agents_reference_entity-definition.md\":\"C-1S3OER\",\"docs_agents_reference_entity-handle.md\":\"Bz6Fcrke\",\"docs_agents_reference_entity-registry.md\":\"CZ90_MSf\",\"docs_agents_reference_handler-context.md\":\"Dx29ZNB3\",\"docs_agents_reference_mcp-registry.md\":\"rAC7EPF9\",\"docs_agents_reference_mcp-server-config.md\":\"CaLJl9IN\",\"docs_agents_reference_runtime-handler.md\":\"53ebZQFF\",\"docs_agents_reference_shared-state-handle.md\":\"otE5AGpG\",\"docs_agents_reference_state-collection-proxy.md\":\"CqJ6GdML\",\"docs_agents_reference_wake-event.md\":\"D8Qj15NO\",\"docs_agents_usage_app-setup.md\":\"DjUCUPmR\",\"docs_agents_usage_attachments.md\":\"llfxlKOb\",\"docs_agents_usage_clients-and-react.md\":\"C0oaRkgq\",\"docs_agents_usage_configuring-the-agent.md\":\"DvqFwsOG\",\"docs_agents_usage_context-composition.md\":\"ZIuwF0Je\",\"docs_agents_usage_defining-entities.md\":\"Cv3KgQlC\",\"docs_agents_usage_defining-tools.md\":\"ROR2cyab\",\"docs_agents_usage_embedded-builtins.md\":\"CVO_gNQE\",\"docs_agents_usage_managing-state.md\":\"DV3au0Qo\",\"docs_agents_usage_mcp-servers.md\":\"CxxQ7Ye7\",\"docs_agents_usage_overview.md\":\"xyImYIEN\",\"docs_agents_usage_permissions-and-principals.md\":\"DDIT5K1I\",\"docs_agents_usage_programmatic-runtime-client.md\":\"BHpq3A0B\",\"docs_agents_usage_sandboxing.md\":\"3FZKbnMg\",\"docs_agents_usage_shared-state.md\":\"Bw7AnIyB\",\"docs_agents_usage_signals.md\":\"BsLK8Ywv\",\"docs_agents_usage_spawning-and-coordinating.md\":\"CohnEMRv\",\"docs_agents_usage_testing.md\":\"KimbkNTV\",\"docs_agents_usage_waking-entities.md\":\"A-94GK18\",\"docs_agents_usage_webhook-sources.md\":\"Sqd2hNVr\",\"docs_agents_usage_writing-handlers.md\":\"DzcjSQ9L\",\"docs_agents_walkthrough.md\":\"Bvrqcrfi\",\"docs_streams_cli.md\":\"ObVBddHf\",\"docs_streams_clients_other.md\":\"DI1sHRPM\",\"docs_streams_clients_python.md\":\"D1GJddva\",\"docs_streams_clients_typescript.md\":\"DeyCrcc0\",\"docs_streams_durable-proxy.md\":\"Cc84hUE2\",\"docs_streams_durable-state.md\":\"D0_8bTEA\",\"docs_streams_index.md\":\"CxnjtvDd\",\"docs_streams_integrations_tanstack-ai.md\":\"I_qBEWHO\",\"docs_streams_integrations_vercel-ai-sdk.md\":\"BIo96yHu\",\"docs_streams_integrations_yjs.md\":\"SQoUkQjW\",\"docs_streams_json-mode.md\":\"BYbzS18a\",\"docs_streams_quickstart.md\":\"CORpX5Vd\",\"docs_streams_stream-db.md\":\"JyO1VTP4\",\"docs_streams_stream-fs.md\":\"BGEPNXi7\",\"docs_sync_api_clients_elixir.md\":\"w0-9uuFf\",\"docs_sync_api_clients_typescript.md\":\"BsdPKcK5\",\"docs_sync_api_config.md\":\"DHfZgyLI\",\"docs_sync_api_http.md\":\"CQ176Pxb\",\"docs_sync_guides_auth.md\":\"DfK4_zOQ\",\"docs_sync_guides_client-development.md\":\"J-yaSBtt\",\"docs_sync_guides_deployment.md\":\"DAN-IBOp\",\"docs_sync_guides_installation.md\":\"Diok8fHR\",\"docs_sync_guides_postgres-permissions.md\":\"UyadFc07\",\"docs_sync_guides_security.md\":\"spqe2WB0\",\"docs_sync_guides_shapes.md\":\"CGNnARt5\",\"docs_sync_guides_sharding.md\":\"D0WaY4Gr\",\"docs_sync_guides_troubleshooting.md\":\"p18oqooR\",\"docs_sync_guides_upgrading.md\":\"DaL6MuHF\",\"docs_sync_guides_writes.md\":\"C5pPvyYL\",\"docs_sync_index.md\":\"BZIXF6k7\",\"docs_sync_integrations_aws.md\":\"CFfyX_IX\",\"docs_sync_integrations_cloudflare.md\":\"DK2Plaiv\",\"docs_sync_integrations_crunchy.md\":\"Bon_YHsm\",\"docs_sync_integrations_digital-ocean.md\":\"DRoAY_DT\",\"docs_sync_integrations_expo.md\":\"DnyvQmMo\",\"docs_sync_integrations_fly.md\":\"08_ADkUX\",\"docs_sync_integrations_gcp.md\":\"D0zsl4B4\",\"docs_sync_integrations_livestore.md\":\"C2CGiYiU\",\"docs_sync_integrations_mobx.md\":\"D1G4Mv8y\",\"docs_sync_integrations_neon.md\":\"DBW4Q0UN\",\"docs_sync_integrations_netlify.md\":\"0Aoc0P12\",\"docs_sync_integrations_next.md\":\"EAcZc9He\",\"docs_sync_integrations_phoenix.md\":\"DYJCkdLF\",\"docs_sync_integrations_planetscale.md\":\"Md6CXZcP\",\"docs_sync_integrations_react.md\":\"CV4Er8Ia\",\"docs_sync_integrations_redis.md\":\"DYCyqyYq\",\"docs_sync_integrations_render.md\":\"BAKzq0e_\",\"docs_sync_integrations_supabase.md\":\"DvZPEbo3\",\"docs_sync_integrations_tanstack.md\":\"CSNjTR3p\",\"docs_sync_integrations_vercel.md\":\"e1iYsiVy\",\"docs_sync_integrations_yjs.md\":\"COYaMhy7\",\"docs_sync_llms__intro_redux.md\":\"C2GXx9EZ\",\"docs_sync_llms__quickstart_redux.md\":\"AW5dGiLC\",\"docs_sync_llms__tutorial.md\":\"DrRI3xNz\",\"docs_sync_quickstart.md\":\"DZjtiXKd\",\"docs_sync_reference_alternatives.md\":\"Dl302COE\",\"docs_sync_reference_benchmarks.md\":\"DYKqtXU8\",\"docs_sync_reference_literature.md\":\"DbBcRE0l\",\"docs_sync_reference_telemetry.md\":\"D6sH8Lgc\",\"docs_sync_stacks.md\":\"Bly4oaX4\",\"index.md\":\"VckipgZH\",\"llms.md\":\"BExSzd0K\",\"og_agents.md\":\"BZPK5qXQ\",\"og_cloud.md\":\"C5zjVLJI\",\"og_default.md\":\"CCS4LdPe\",\"og_streams.md\":\"CgzIIa2u\",\"og_sync.md\":\"CCPgPBwg\",\"old-index.md\":\"DdVbzBBY\",\"pricing.md\":\"Ck_PZyHK\",\"src_partials_home-cta.md\":\"DY6UbUj_\",\"src_partials_home-features-after.md\":\"C9DlaIGZ\",\"src_partials_home-features-before.md\":\"BAGq4DRI\",\"src_partials_home-your-stack-simplified.md\":\"e4A7FKZJ\",\"streams_demos_collaborative-ai-editor.md\":\"Ce4jAuvY\",\"streams_demos_durable-doom.md\":\"ByRQLtF3\",\"streams_demos_index.md\":\"ZeIcbC4q\",\"streams_demos_territory-wars.md\":\"CS0UJqw4\",\"streams_index.md\":\"Dtp5ynmr\",\"sync_demos_ai-chat.md\":\"au9O5yjj\",\"sync_demos_bash.md\":\"Dlgcfhz8\",\"sync_demos_burn.md\":\"BctCEEU5\",\"sync_demos_encryption.md\":\"D60GDQJb\",\"sync_demos_gatekeeper-auth.md\":\"-7F5bQPB\",\"sync_demos_index.md\":\"DBsaGlYm\",\"sync_demos_linearlite.md\":\"CB-dKY9S\",\"sync_demos_nextjs.md\":\"BglOX7oy\",\"sync_demos_notes.md\":\"n-0At1ak\",\"sync_demos_phoenix-liveview.md\":\"p5-vNs2t\",\"sync_demos_pixel-art.md\":\"cUcP17Te\",\"sync_demos_proxy-auth.md\":\"DxUTwVG4\",\"sync_demos_react.md\":\"o4Tzw8A0\",\"sync_demos_redis.md\":\"BsZZk2C1\",\"sync_demos_remix.md\":\"TwFt5iIX\",\"sync_demos_tanstack.md\":\"CTHQEbxX\",\"sync_demos_todo-app.md\":\"CRr1YjnV\",\"sync_demos_write-patterns.md\":\"YGD2CIKU\",\"sync_demos_yjs.md\":\"H4FNKtRy\",\"sync_index.md\":\"CygiKUnA\",\"sync_pglite.md\":\"C3lqrXXk\",\"sync_postgres-sync.md\":\"DYcl4YY7\",\"sync_tanstack-db.md\":\"BgQvoWlg\"}");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\":{\"light\":\"/img/brand/logo.inverse.svg\",\"dark\":\"/img/brand/logo.svg\",\"alt\":\"Electric\"},\"nav\":[],\"search\":{\"provider\":\"local\"},\"sidebar\":{\"/cloud/\":[{\"text\":\"Hosted products\",\"collapsed\":false,\"items\":[{\"text\":\"Electric Streams\",\"link\":\"/streams\"},{\"text\":\"Electric Sync\",\"link\":\"/sync\"}]}],\"/sync/postgres-sync\":[{\"text\":\"Sync primitives\",\"collapsed\":false,\"items\":[{\"text\":\"Postgres Sync\",\"link\":\"/sync/postgres-sync\"},{\"text\":\"TanStack DB\",\"link\":\"/sync/tanstack-db\"},{\"text\":\"PGlite\",\"link\":\"/sync/pglite\"}]},{\"text\":\"Guides\",\"collapsed\":false,\"items\":[{\"text\":\"Auth\",\"link\":\"/docs/sync/guides/auth\"},{\"text\":\"Shapes\",\"link\":\"/docs/sync/guides/shapes\"},{\"text\":\"Writes\",\"link\":\"/docs/sync/guides/writes\"},{\"text\":\"Installation\",\"link\":\"/docs/sync/guides/installation\"},{\"text\":\"PostgreSQL Permissions\",\"link\":\"/docs/sync/guides/postgres-permissions\"},{\"text\":\"Deployment\",\"link\":\"/docs/sync/guides/deployment\"},{\"text\":\"Upgrading\",\"link\":\"/docs/sync/guides/upgrading\"},{\"text\":\"Sharding\",\"link\":\"/docs/sync/guides/sharding\"},{\"text\":\"Security\",\"link\":\"/docs/sync/guides/security\"},{\"text\":\"Troubleshooting\",\"link\":\"/docs/sync/guides/troubleshooting\"},{\"text\":\"Client development\",\"link\":\"/docs/sync/guides/client-development\"}]},{\"text\":\"API\",\"collapsed\":false,\"items\":[{\"text\":\"HTTP\",\"link\":\"/docs/sync/api/http\"},{\"text\":\"Clients\",\"items\":[{\"text\":\"TypeScript\",\"link\":\"/docs/sync/api/clients/typescript\"},{\"text\":\"Elixir\",\"link\":\"/docs/sync/api/clients/elixir\"}],\"collapsed\":false},{\"text\":\"Config\",\"link\":\"/docs/sync/api/config\"}]},{\"text\":\"Integrations\",\"collapsed\":false,\"items\":[{\"text\":\"Frameworks\",\"items\":[{\"text\":\"LiveStore\",\"link\":\"/docs/sync/integrations/livestore\"},{\"text\":\"MobX\",\"link\":\"/docs/sync/integrations/mobx\"},{\"text\":\"Next.js\",\"link\":\"/docs/sync/integrations/next\"},{\"text\":\"Phoenix\",\"link\":\"/docs/sync/integrations/phoenix\"},{\"text\":\"React\",\"link\":\"/docs/sync/integrations/react\"},{\"text\":\"Redis\",\"link\":\"/docs/sync/integrations/redis\"},{\"text\":\"TanStack\",\"link\":\"/docs/sync/integrations/tanstack\"},{\"text\":\"Yjs\",\"link\":\"/docs/sync/integrations/yjs\"}]},{\"text\":\"Platforms\",\"items\":[{\"text\":\"AWS\",\"link\":\"/docs/sync/integrations/aws\"},{\"text\":\"Cloudflare\",\"link\":\"/docs/sync/integrations/cloudflare\"},{\"text\":\"Crunchy\",\"link\":\"/docs/sync/integrations/crunchy\"},{\"text\":\"Digital Ocean\",\"link\":\"/docs/sync/integrations/digital-ocean\"},{\"text\":\"Expo\",\"link\":\"/docs/sync/integrations/expo\"},{\"text\":\"Fly.io\",\"link\":\"/docs/sync/integrations/fly\"},{\"text\":\"GCP\",\"link\":\"/docs/sync/integrations/gcp\"},{\"text\":\"Neon\",\"link\":\"/docs/sync/integrations/neon\"},{\"text\":\"Netlify\",\"link\":\"/docs/sync/integrations/netlify\"},{\"text\":\"PlanetScale\",\"link\":\"/docs/sync/integrations/planetscale\"},{\"text\":\"Render\",\"link\":\"/docs/sync/integrations/render\"},{\"text\":\"Supabase\",\"link\":\"/docs/sync/integrations/supabase\"}]}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Alternatives\",\"link\":\"/docs/sync/reference/alternatives\"},{\"text\":\"Benchmarks\",\"link\":\"/docs/sync/reference/benchmarks\"},{\"text\":\"Literature\",\"link\":\"/docs/sync/reference/literature\"},{\"text\":\"Telemetry\",\"link\":\"/docs/sync/reference/telemetry\"}]}],\"/sync/tanstack-db\":[{\"text\":\"Sync primitives\",\"collapsed\":false,\"items\":[{\"text\":\"Postgres Sync\",\"link\":\"/sync/postgres-sync\"},{\"text\":\"TanStack DB\",\"link\":\"/sync/tanstack-db\"},{\"text\":\"PGlite\",\"link\":\"/sync/pglite\"}]},{\"text\":\"Guides\",\"collapsed\":false,\"items\":[{\"text\":\"Auth\",\"link\":\"/docs/sync/guides/auth\"},{\"text\":\"Shapes\",\"link\":\"/docs/sync/guides/shapes\"},{\"text\":\"Writes\",\"link\":\"/docs/sync/guides/writes\"},{\"text\":\"Installation\",\"link\":\"/docs/sync/guides/installation\"},{\"text\":\"PostgreSQL Permissions\",\"link\":\"/docs/sync/guides/postgres-permissions\"},{\"text\":\"Deployment\",\"link\":\"/docs/sync/guides/deployment\"},{\"text\":\"Upgrading\",\"link\":\"/docs/sync/guides/upgrading\"},{\"text\":\"Sharding\",\"link\":\"/docs/sync/guides/sharding\"},{\"text\":\"Security\",\"link\":\"/docs/sync/guides/security\"},{\"text\":\"Troubleshooting\",\"link\":\"/docs/sync/guides/troubleshooting\"},{\"text\":\"Client development\",\"link\":\"/docs/sync/guides/client-development\"}]},{\"text\":\"API\",\"collapsed\":false,\"items\":[{\"text\":\"HTTP\",\"link\":\"/docs/sync/api/http\"},{\"text\":\"Clients\",\"items\":[{\"text\":\"TypeScript\",\"link\":\"/docs/sync/api/clients/typescript\"},{\"text\":\"Elixir\",\"link\":\"/docs/sync/api/clients/elixir\"}],\"collapsed\":false},{\"text\":\"Config\",\"link\":\"/docs/sync/api/config\"}]},{\"text\":\"Integrations\",\"collapsed\":false,\"items\":[{\"text\":\"Frameworks\",\"items\":[{\"text\":\"LiveStore\",\"link\":\"/docs/sync/integrations/livestore\"},{\"text\":\"MobX\",\"link\":\"/docs/sync/integrations/mobx\"},{\"text\":\"Next.js\",\"link\":\"/docs/sync/integrations/next\"},{\"text\":\"Phoenix\",\"link\":\"/docs/sync/integrations/phoenix\"},{\"text\":\"React\",\"link\":\"/docs/sync/integrations/react\"},{\"text\":\"Redis\",\"link\":\"/docs/sync/integrations/redis\"},{\"text\":\"TanStack\",\"link\":\"/docs/sync/integrations/tanstack\"},{\"text\":\"Yjs\",\"link\":\"/docs/sync/integrations/yjs\"}]},{\"text\":\"Platforms\",\"items\":[{\"text\":\"AWS\",\"link\":\"/docs/sync/integrations/aws\"},{\"text\":\"Cloudflare\",\"link\":\"/docs/sync/integrations/cloudflare\"},{\"text\":\"Crunchy\",\"link\":\"/docs/sync/integrations/crunchy\"},{\"text\":\"Digital Ocean\",\"link\":\"/docs/sync/integrations/digital-ocean\"},{\"text\":\"Expo\",\"link\":\"/docs/sync/integrations/expo\"},{\"text\":\"Fly.io\",\"link\":\"/docs/sync/integrations/fly\"},{\"text\":\"GCP\",\"link\":\"/docs/sync/integrations/gcp\"},{\"text\":\"Neon\",\"link\":\"/docs/sync/integrations/neon\"},{\"text\":\"Netlify\",\"link\":\"/docs/sync/integrations/netlify\"},{\"text\":\"PlanetScale\",\"link\":\"/docs/sync/integrations/planetscale\"},{\"text\":\"Render\",\"link\":\"/docs/sync/integrations/render\"},{\"text\":\"Supabase\",\"link\":\"/docs/sync/integrations/supabase\"}]}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Alternatives\",\"link\":\"/docs/sync/reference/alternatives\"},{\"text\":\"Benchmarks\",\"link\":\"/docs/sync/reference/benchmarks\"},{\"text\":\"Literature\",\"link\":\"/docs/sync/reference/literature\"},{\"text\":\"Telemetry\",\"link\":\"/docs/sync/reference/telemetry\"}]}],\"/sync/pglite\":[{\"text\":\"Sync primitives\",\"collapsed\":false,\"items\":[{\"text\":\"Postgres Sync\",\"link\":\"/sync/postgres-sync\"},{\"text\":\"TanStack DB\",\"link\":\"/sync/tanstack-db\"},{\"text\":\"PGlite\",\"link\":\"/sync/pglite\"}]},{\"text\":\"Guides\",\"collapsed\":false,\"items\":[{\"text\":\"Auth\",\"link\":\"/docs/sync/guides/auth\"},{\"text\":\"Shapes\",\"link\":\"/docs/sync/guides/shapes\"},{\"text\":\"Writes\",\"link\":\"/docs/sync/guides/writes\"},{\"text\":\"Installation\",\"link\":\"/docs/sync/guides/installation\"},{\"text\":\"PostgreSQL Permissions\",\"link\":\"/docs/sync/guides/postgres-permissions\"},{\"text\":\"Deployment\",\"link\":\"/docs/sync/guides/deployment\"},{\"text\":\"Upgrading\",\"link\":\"/docs/sync/guides/upgrading\"},{\"text\":\"Sharding\",\"link\":\"/docs/sync/guides/sharding\"},{\"text\":\"Security\",\"link\":\"/docs/sync/guides/security\"},{\"text\":\"Troubleshooting\",\"link\":\"/docs/sync/guides/troubleshooting\"},{\"text\":\"Client development\",\"link\":\"/docs/sync/guides/client-development\"}]},{\"text\":\"API\",\"collapsed\":false,\"items\":[{\"text\":\"HTTP\",\"link\":\"/docs/sync/api/http\"},{\"text\":\"Clients\",\"items\":[{\"text\":\"TypeScript\",\"link\":\"/docs/sync/api/clients/typescript\"},{\"text\":\"Elixir\",\"link\":\"/docs/sync/api/clients/elixir\"}],\"collapsed\":false},{\"text\":\"Config\",\"link\":\"/docs/sync/api/config\"}]},{\"text\":\"Integrations\",\"collapsed\":false,\"items\":[{\"text\":\"Frameworks\",\"items\":[{\"text\":\"LiveStore\",\"link\":\"/docs/sync/integrations/livestore\"},{\"text\":\"MobX\",\"link\":\"/docs/sync/integrations/mobx\"},{\"text\":\"Next.js\",\"link\":\"/docs/sync/integrations/next\"},{\"text\":\"Phoenix\",\"link\":\"/docs/sync/integrations/phoenix\"},{\"text\":\"React\",\"link\":\"/docs/sync/integrations/react\"},{\"text\":\"Redis\",\"link\":\"/docs/sync/integrations/redis\"},{\"text\":\"TanStack\",\"link\":\"/docs/sync/integrations/tanstack\"},{\"text\":\"Yjs\",\"link\":\"/docs/sync/integrations/yjs\"}]},{\"text\":\"Platforms\",\"items\":[{\"text\":\"AWS\",\"link\":\"/docs/sync/integrations/aws\"},{\"text\":\"Cloudflare\",\"link\":\"/docs/sync/integrations/cloudflare\"},{\"text\":\"Crunchy\",\"link\":\"/docs/sync/integrations/crunchy\"},{\"text\":\"Digital Ocean\",\"link\":\"/docs/sync/integrations/digital-ocean\"},{\"text\":\"Expo\",\"link\":\"/docs/sync/integrations/expo\"},{\"text\":\"Fly.io\",\"link\":\"/docs/sync/integrations/fly\"},{\"text\":\"GCP\",\"link\":\"/docs/sync/integrations/gcp\"},{\"text\":\"Neon\",\"link\":\"/docs/sync/integrations/neon\"},{\"text\":\"Netlify\",\"link\":\"/docs/sync/integrations/netlify\"},{\"text\":\"PlanetScale\",\"link\":\"/docs/sync/integrations/planetscale\"},{\"text\":\"Render\",\"link\":\"/docs/sync/integrations/render\"},{\"text\":\"Supabase\",\"link\":\"/docs/sync/integrations/supabase\"}]}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Alternatives\",\"link\":\"/docs/sync/reference/alternatives\"},{\"text\":\"Benchmarks\",\"link\":\"/docs/sync/reference/benchmarks\"},{\"text\":\"Literature\",\"link\":\"/docs/sync/reference/literature\"},{\"text\":\"Telemetry\",\"link\":\"/docs/sync/reference/telemetry\"}]}],\"/sync/demos\":[{\"text\":\"Demo apps\",\"collapsed\":false,\"items\":[{\"text\":\"Burn\",\"link\":\"/sync/demos/burn\"},{\"text\":\"AI Chat\",\"link\":\"/sync/demos/ai-chat\"},{\"text\":\"Linearlite\",\"link\":\"/sync/demos/linearlite\"},{\"text\":\"Notes\",\"link\":\"/sync/demos/notes\"},{\"text\":\"Pixel art\",\"link\":\"/sync/demos/pixel-art\"}]},{\"text\":\"Technical examples\",\"collapsed\":false,\"items\":[{\"text\":\"Bash\",\"link\":\"/sync/demos/bash\"},{\"text\":\"Encryption\",\"link\":\"/sync/demos/encryption\"},{\"text\":\"Gatekeeper auth\",\"link\":\"/sync/demos/gatekeeper-auth\"},{\"text\":\"Next.js\",\"link\":\"/sync/demos/nextjs\"},{\"text\":\"Phoenix LiveView\",\"link\":\"/sync/demos/phoenix-liveview\"},{\"text\":\"Proxy auth\",\"link\":\"/sync/demos/proxy-auth\"},{\"text\":\"React\",\"link\":\"/sync/demos/react\"},{\"text\":\"Redis\",\"link\":\"/sync/demos/redis\"},{\"text\":\"Remix\",\"link\":\"/sync/demos/remix\"},{\"text\":\"Tanstack\",\"link\":\"/sync/demos/tanstack\"},{\"text\":\"Todo app\",\"link\":\"/sync/demos/todo-app\"},{\"text\":\"Write patterns\",\"link\":\"/sync/demos/write-patterns\"},{\"text\":\"Yjs\",\"link\":\"/sync/demos/yjs\"}]}],\"/sync/\":[{\"text\":\"Electric Sync\",\"items\":[{\"text\":\"Overview\",\"link\":\"/sync\"}]},{\"text\":\"Sync primitives\",\"items\":[{\"text\":\"Postgres Sync\",\"link\":\"/sync/postgres-sync\"},{\"text\":\"TanStack DB\",\"link\":\"/sync/tanstack-db\"},{\"text\":\"PGlite\",\"link\":\"/sync/pglite\"}]}],\"/agents/demos\":[{\"text\":\"Demo apps\",\"collapsed\":false,\"items\":[{\"text\":\"Chat Starter\",\"link\":\"/agents/demos/chat-starter\"},{\"text\":\"Deep Survey\",\"link\":\"/agents/demos/deep-survey\"}]},{\"text\":\"Technical examples\",\"collapsed\":false,\"items\":[{\"text\":\"Playground\",\"link\":\"/docs/agents/examples/playground\"}]}],\"/streams/demos\":[{\"text\":\"Demo apps\",\"collapsed\":false,\"items\":[{\"text\":\"Durable Doom\",\"link\":\"/streams/demos/durable-doom\"},{\"text\":\"Collaborative AI Editor\",\"link\":\"/streams/demos/collaborative-ai-editor\"},{\"text\":\"Territory Wars\",\"link\":\"/streams/demos/territory-wars\"}]},{\"text\":\"Technical examples\",\"collapsed\":false,\"items\":[{\"text\":\"Yjs demo\",\"link\":\"https://github.com/durable-streams/durable-streams/tree/main/examples/yjs-demo\"},{\"text\":\"StreamDB\",\"link\":\"https://github.com/durable-streams/durable-streams/tree/main/examples/stream-db\"},{\"text\":\"Chat AI SDK\",\"link\":\"https://github.com/durable-streams/durable-streams/tree/main/examples/chat-aisdk\"},{\"text\":\"Chat TanStack\",\"link\":\"https://github.com/durable-streams/durable-streams/tree/main/examples/chat-tanstack\"}]}],\"/docs/sync\":[{\"text\":\"Sync primitives\",\"collapsed\":false,\"items\":[{\"text\":\"Postgres Sync\",\"link\":\"/sync/postgres-sync\"},{\"text\":\"TanStack DB\",\"link\":\"/sync/tanstack-db\"},{\"text\":\"PGlite\",\"link\":\"/sync/pglite\"}]},{\"text\":\"Guides\",\"collapsed\":false,\"items\":[{\"text\":\"Auth\",\"link\":\"/docs/sync/guides/auth\"},{\"text\":\"Shapes\",\"link\":\"/docs/sync/guides/shapes\"},{\"text\":\"Writes\",\"link\":\"/docs/sync/guides/writes\"},{\"text\":\"Installation\",\"link\":\"/docs/sync/guides/installation\"},{\"text\":\"PostgreSQL Permissions\",\"link\":\"/docs/sync/guides/postgres-permissions\"},{\"text\":\"Deployment\",\"link\":\"/docs/sync/guides/deployment\"},{\"text\":\"Upgrading\",\"link\":\"/docs/sync/guides/upgrading\"},{\"text\":\"Sharding\",\"link\":\"/docs/sync/guides/sharding\"},{\"text\":\"Security\",\"link\":\"/docs/sync/guides/security\"},{\"text\":\"Troubleshooting\",\"link\":\"/docs/sync/guides/troubleshooting\"},{\"text\":\"Client development\",\"link\":\"/docs/sync/guides/client-development\"}]},{\"text\":\"API\",\"collapsed\":false,\"items\":[{\"text\":\"HTTP\",\"link\":\"/docs/sync/api/http\"},{\"text\":\"Clients\",\"items\":[{\"text\":\"TypeScript\",\"link\":\"/docs/sync/api/clients/typescript\"},{\"text\":\"Elixir\",\"link\":\"/docs/sync/api/clients/elixir\"}],\"collapsed\":false},{\"text\":\"Config\",\"link\":\"/docs/sync/api/config\"}]},{\"text\":\"Integrations\",\"collapsed\":false,\"items\":[{\"text\":\"Frameworks\",\"items\":[{\"text\":\"LiveStore\",\"link\":\"/docs/sync/integrations/livestore\"},{\"text\":\"MobX\",\"link\":\"/docs/sync/integrations/mobx\"},{\"text\":\"Next.js\",\"link\":\"/docs/sync/integrations/next\"},{\"text\":\"Phoenix\",\"link\":\"/docs/sync/integrations/phoenix\"},{\"text\":\"React\",\"link\":\"/docs/sync/integrations/react\"},{\"text\":\"Redis\",\"link\":\"/docs/sync/integrations/redis\"},{\"text\":\"TanStack\",\"link\":\"/docs/sync/integrations/tanstack\"},{\"text\":\"Yjs\",\"link\":\"/docs/sync/integrations/yjs\"}]},{\"text\":\"Platforms\",\"items\":[{\"text\":\"AWS\",\"link\":\"/docs/sync/integrations/aws\"},{\"text\":\"Cloudflare\",\"link\":\"/docs/sync/integrations/cloudflare\"},{\"text\":\"Crunchy\",\"link\":\"/docs/sync/integrations/crunchy\"},{\"text\":\"Digital Ocean\",\"link\":\"/docs/sync/integrations/digital-ocean\"},{\"text\":\"Expo\",\"link\":\"/docs/sync/integrations/expo\"},{\"text\":\"Fly.io\",\"link\":\"/docs/sync/integrations/fly\"},{\"text\":\"GCP\",\"link\":\"/docs/sync/integrations/gcp\"},{\"text\":\"Neon\",\"link\":\"/docs/sync/integrations/neon\"},{\"text\":\"Netlify\",\"link\":\"/docs/sync/integrations/netlify\"},{\"text\":\"PlanetScale\",\"link\":\"/docs/sync/integrations/planetscale\"},{\"text\":\"Render\",\"link\":\"/docs/sync/integrations/render\"},{\"text\":\"Supabase\",\"link\":\"/docs/sync/integrations/supabase\"}]}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Alternatives\",\"link\":\"/docs/sync/reference/alternatives\"},{\"text\":\"Benchmarks\",\"link\":\"/docs/sync/reference/benchmarks\"},{\"text\":\"Literature\",\"link\":\"/docs/sync/reference/literature\"},{\"text\":\"Telemetry\",\"link\":\"/docs/sync/reference/telemetry\"}]}],\"/docs/agents/examples\":[{\"text\":\"Demo apps\",\"collapsed\":false,\"items\":[{\"text\":\"Chat Starter\",\"link\":\"/agents/demos/chat-starter\"},{\"text\":\"Deep Survey\",\"link\":\"/agents/demos/deep-survey\"}]},{\"text\":\"Technical examples\",\"collapsed\":false,\"items\":[{\"text\":\"Playground\",\"link\":\"/docs/agents/examples/playground\"}]}],\"/docs/agents\":[{\"text\":\"Usage\",\"collapsed\":false,\"items\":[{\"text\":\"Overview\",\"link\":\"/docs/agents/usage/overview\"},{\"text\":\"Defining entities\",\"link\":\"/docs/agents/usage/defining-entities\"},{\"text\":\"Writing handlers\",\"link\":\"/docs/agents/usage/writing-handlers\"},{\"text\":\"Configuring the agent\",\"link\":\"/docs/agents/usage/configuring-the-agent\"},{\"text\":\"Context composition\",\"link\":\"/docs/agents/usage/context-composition\"},{\"text\":\"Defining tools\",\"link\":\"/docs/agents/usage/defining-tools\"},{\"text\":\"Managing state\",\"link\":\"/docs/agents/usage/managing-state\"},{\"text\":\"Permissions & principals\",\"link\":\"/docs/agents/usage/permissions-and-principals\"},{\"text\":\"Spawning & coordinating\",\"link\":\"/docs/agents/usage/spawning-and-coordinating\"},{\"text\":\"Waking entities\",\"link\":\"/docs/agents/usage/waking-entities\"},{\"text\":\"Signals\",\"link\":\"/docs/agents/usage/signals\"},{\"text\":\"Sandboxing\",\"link\":\"/docs/agents/usage/sandboxing\"},{\"text\":\"Attachments\",\"link\":\"/docs/agents/usage/attachments\"},{\"text\":\"Shared state\",\"link\":\"/docs/agents/usage/shared-state\"},{\"text\":\"Clients & React\",\"link\":\"/docs/agents/usage/clients-and-react\"},{\"text\":\"Programmatic runtime client\",\"link\":\"/docs/agents/usage/programmatic-runtime-client\"},{\"text\":\"App setup\",\"link\":\"/docs/agents/usage/app-setup\"},{\"text\":\"Embedded built-ins\",\"link\":\"/docs/agents/usage/embedded-builtins\"},{\"text\":\"Webhook sources\",\"link\":\"/docs/agents/usage/webhook-sources\"},{\"text\":\"MCP servers\",\"link\":\"/docs/agents/usage/mcp-servers\"},{\"text\":\"Testing\",\"link\":\"/docs/agents/usage/testing\"}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"CLI\",\"link\":\"/docs/agents/reference/cli\"},{\"text\":\"HandlerContext\",\"link\":\"/docs/agents/reference/handler-context\"},{\"text\":\"EntityDefinition\",\"link\":\"/docs/agents/reference/entity-definition\"},{\"text\":\"AgentConfig\",\"link\":\"/docs/agents/reference/agent-config\"},{\"text\":\"AgentTool\",\"link\":\"/docs/agents/reference/agent-tool\"},{\"text\":\"StateCollectionProxy\",\"link\":\"/docs/agents/reference/state-collection-proxy\"},{\"text\":\"EntityHandle\",\"link\":\"/docs/agents/reference/entity-handle\"},{\"text\":\"SharedStateHandle\",\"link\":\"/docs/agents/reference/shared-state-handle\"},{\"text\":\"WakeEvent\",\"link\":\"/docs/agents/reference/wake-event\"},{\"text\":\"Built-in collections\",\"link\":\"/docs/agents/reference/built-in-collections\"},{\"text\":\"EntityRegistry\",\"link\":\"/docs/agents/reference/entity-registry\"},{\"text\":\"RuntimeHandler\",\"link\":\"/docs/agents/reference/runtime-handler\"},{\"text\":\"McpRegistry\",\"link\":\"/docs/agents/reference/mcp-registry\"},{\"text\":\"McpServerConfig\",\"link\":\"/docs/agents/reference/mcp-server-config\"}]},{\"text\":\"Entities\",\"collapsed\":false,\"items\":[{\"text\":\"Agents\",\"items\":[{\"text\":\"Horton\",\"link\":\"/docs/agents/entities/agents/horton\"},{\"text\":\"Worker\",\"link\":\"/docs/agents/entities/agents/worker\"}],\"collapsed\":false},{\"text\":\"Patterns\",\"items\":[{\"text\":\"Manager-Worker\",\"link\":\"/docs/agents/entities/patterns/manager-worker\"},{\"text\":\"Pipeline\",\"link\":\"/docs/agents/entities/patterns/pipeline\"},{\"text\":\"Map-Reduce\",\"link\":\"/docs/agents/entities/patterns/map-reduce\"},{\"text\":\"Dispatcher\",\"link\":\"/docs/agents/entities/patterns/dispatcher\"},{\"text\":\"Blackboard (shared state)\",\"link\":\"/docs/agents/entities/patterns/blackboard\"},{\"text\":\"Reactive observers\",\"link\":\"/docs/agents/entities/patterns/reactive-observers\"}],\"collapsed\":false}]}],\"/docs/streams\":[{\"text\":\"Usage\",\"collapsed\":false,\"items\":[{\"text\":\"CLI\",\"link\":\"/docs/streams/cli\"},{\"text\":\"Clients\",\"collapsed\":false,\"items\":[{\"text\":\"TypeScript\",\"link\":\"/docs/streams/clients/typescript\"},{\"text\":\"Python\",\"link\":\"/docs/streams/clients/python\"},{\"text\":\"Other clients\",\"link\":\"/docs/streams/clients/other\"}]},{\"text\":\"JSON mode\",\"link\":\"/docs/streams/json-mode\"},{\"text\":\"Durable Proxy\",\"link\":\"/docs/streams/durable-proxy\"},{\"text\":\"Durable State\",\"link\":\"/docs/streams/durable-state\"},{\"text\":\"StreamDB\",\"link\":\"/docs/streams/stream-db\"},{\"text\":\"StreamFS\",\"link\":\"/docs/streams/stream-fs\"}]},{\"text\":\"Integrations\",\"collapsed\":false,\"items\":[{\"text\":\"TanStack AI\",\"link\":\"/docs/streams/integrations/tanstack-ai\"},{\"text\":\"Vercel AI SDK\",\"link\":\"/docs/streams/integrations/vercel-ai-sdk\"},{\"text\":\"Yjs\",\"link\":\"/docs/streams/integrations/yjs\"}]},{\"text\":\"Open Protocol\",\"items\":[{\"text\":\"durablestreams.com\",\"link\":\"https://durablestreams.com\"}]}],\"/about\":[{\"text\":\"About\",\"link\":\"/about/\"},{\"text\":\"Community\",\"link\":\"/about/community\"},{\"text\":\"Team\",\"link\":\"/about/team\"},{\"text\":\"Contact\",\"link\":\"/about/contact\"},{\"text\":\"Legal\",\"items\":[{\"text\":\"Terms\",\"link\":\"/about/legal/terms\"},{\"text\":\"Privacy\",\"link\":\"/about/legal/privacy\"},{\"text\":\"Delete your account\",\"link\":\"/about/legal/delete-account\"}],\"collapsed\":false},{\"text\":\"LLMs / AGENTS.md\",\"link\":\"/llms\"}],\"/llms\":[{\"text\":\"About\",\"link\":\"/about/\"},{\"text\":\"Community\",\"link\":\"/about/community\"},{\"text\":\"Team\",\"link\":\"/about/team\"},{\"text\":\"Contact\",\"link\":\"/about/contact\"},{\"text\":\"Legal\",\"items\":[{\"text\":\"Terms\",\"link\":\"/about/legal/terms\"},{\"text\":\"Privacy\",\"link\":\"/about/legal/privacy\"},{\"text\":\"Delete your account\",\"link\":\"/about/legal/delete-account\"}],\"collapsed\":false},{\"text\":\"LLMs / AGENTS.md\",\"link\":\"/llms\"}]},\"siteTitle\":false,\"socialLinks\":[]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
    
  </body>
</html>