AGENTS.md · electric-sql/electric
AGENTS.md from electric-sql/electric: 451 lines covering TL;DR, 🔒 Security Rules (ALWAYS), Golden Path, Optimistic Mutations and more.
Template by electric-sql
Install
Works with Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode, Claude Code. Read the repository before you give any tool access to your data.
curl -fsSL https://raw.githubusercontent.com/electric-sql/electric/main/AGENTS.md -o AGENTS.md
Read it and adapt it to your project before use.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: prompt-engineering
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
What's in it
An AGENTS.md file: instructions coding agents (Codex, Cursor, Copilot, Gemini CLI and others) read before working in a repo.
- For
- Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode, Claude Code
- Length
- 451 lines
- File
AGENTS.md
Sections
- TL;DR
- 🔒 Security Rules (ALWAYS)
- Golden Path
- Optimistic Mutations
- Developing Electric Agents
- Working on the TypeScript client
- Testing
- ⚠️ Critical Gotchas
- Framework integrations
- Migration from TanStack Query
- Deployment
- Stack (web/mobile)
- Evolution from Old Electric
- References
First lines (shown under the repo's Apache-2.0 license)
# AGENTS.md – ElectricSQL + TanStack DB
> **Audience:** coding agents/codegen tools
> **Goal:** ship fast, reliable, local-first apps by pairing **Electric** (Postgres sync engine over HTTP) with **TanStack DB** (embedded client DB with live queries & optimistic mutations).
> **Status:** current as of **2025-09-18**.
## TL;DR
- **Electric:** read-path sync Postgres→clients via HTTP (shapes→changelog→client) ([Electric][1])
- **TanStack DB:** client collections+live queries+transactional optimistic mutations. Swap `queryCollectionOptions`→`electricCollectionOptions` without touching components ([TanStack][2])
- **Electric Collection:** subscribes to Electric Shapes (single-table, optional `where`/`columns`) ([TanStack][3])
- **Writes:** mutations→API→Postgres txid→await in Electric collection→drop optimistic state when change arrives ([TanStack][3])
- **Live queries:** differential dataflow→sub-ms updates+cross-collection joins ([TanStack][2])
- **Security/scale:** proxy auth, shape-scoped authorization, CDN caching. Use Electric Cloud to skip ops ([Electric][4])
## 🔒 Security Rules (ALWAYS)
1. **Never expose `SOURCE_SECRET` to browser** – inject server-side via proxy
2. **Electric HTTP API public by default** – enforce auth at proxy
3. **Put Electric behind server/proxy** – never call directly from production ([Electric][10])
4. **Define shapes in server/proxy** – no client-defined tables/WHERE clauses
## Golden Path
### 0) Create project
```sh
npx gitpick electric-sql/electric/tree/main/examples/tanstack-db-web-starter my-tanstack-db-project
cd my-tanstack-db-project
cp .env.example .env
pnpm install
pnpm dev
# in new terminal
pnpm migrate
```
### 1) Electric proxy (server)
```ts
// TanStack Start server function
import { createServerFileRoute } from '@tanstack/react-start/server'
import { ELECTRIC_PROTOCOL_QUERY_PARAMS } from '@electric-sql/client'
const ELECTRIC_URL = 'https://api.electric-sql.cloud/v1/shape'
const serve = async ({ request }: { request: Request }) => {
const url = new URL(request.url)
const origin = new URL(ELECTRIC_URL)
// Pass Electric protocol params
url.searchParams.forEach((v, k) => {
if (ELECTRIC_PROTOCOL_QUERY_PARAMS.includes(k))
origin.searchParams.set(k, v)
})
// Server decides shape
origin.searchParams.set('table', 'todos')
// Tenant isolation: origin.searchParams.set('where', `user_id=$1`)
// origin.searchParams.set('params', JSON.stringify([user.id]))
origin.searchParams.set('source_id', process.env.SOURCE_ID!)
origin.searchParams.set('secret', process.env.SOURCE_SECRET!)
const res = await fetch(origin)
const headers = new Headers(res.headers)
headers.delete('content-encoding')
headers.delete('content-length')
return new Response(res.body, {
status: res.status,
statusText: res.statusText,
headers,
})
}
export const ServerRoute = createServerFileRoute('/api/todos').methods({
GET: serve,
})
```
### 2) Electric Collection (client)
```ts
import { createCollection } from '@tanstack/react-db'
import { electricCollectionOptions } from '@tanstack/electric-db-collection'
import { todoSchema } from './schema'
export const todoCollection = createCollection(
electricCollectionOptions({
id: 'todos',
schema: todoSchema,
getKey: (row) => row.id,
shapeOptions: { url: '/api/todos' },
onInsert: async ({ transaction }) => {
const newTodo = transaction.mutations[0].modified
const { txid } = await api.todos.create(newTodo)
return { txid }
},
// onUpdate/onDelete same pattern
})
)
```
**Shape config:**
- Single-table only + optional `where`/`columns`
- Include PK if using `columns`
- Shapes immutable per subscription ([Electric][6]) use collection factory function to make dynamic
### 3) Write-path contract
1. UI mutates collection (instant optimistic)
2. Collection calls API in `onInsert`/`onUpdate`/`onDelete`
3. API writes Postgres, returns txid
4. Client awaits tx on Electric stream→drops optimistic state
**Backend: get Postgres txid and return as an integer**
```sql
SELECT pg_current_xact_id()::xid::text as txid
```
### 4) Live queries
TanStack DB SQL-like queries **sub-ms performance** differential dataflow ([TanStack][7]):
```tsx
import { useLiveQuery, eq } from '@tanstack/react-db'
export function TodoList() {
const { data: todos } = useLiveQuery((q) =>
q
.from({ todo: todoCollection })
.where(({ todo }) => eq(todo.completed, false))
.orderBy(({ todo }) => todo.created_at, 'desc')
.limit(50)
)
return (
<ul>
{todos.map((todo) => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
)
}
```
Dependencies:
```tsx
const [direction, setDirection] = useState('desc')
const { data } = useLiveQuery(
(q) =>
q
.from({ todo: todoCollection })
.orderBy(({ todo }) => todo.createdAt, direction)
.limit(50),
[direction]
)
```
Cross-collection joins:Signals
- Stars
- 10,413
- Forks
- 400
- Open issues
- 179
- Last commit (this folder)
- Jun 1, 2026 (4 months ago)
- Last release
- Sep 9, 2026 (1 month ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- Apache-2.0
- Repository
- github.com/electric-sql/electric
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
Cite this page
AGENTS.md · electric-sql/electric. Agent Mart. https://agentmart.dev/templates/electric-sql-electric-agents-md (last updated 2026-10-24)