Update this file as tasks are completed. Check boxes with
[x].
- Update README: npm badge to beta, remove alpha references, update roadmap Phase 3 to say "beta"
- Update svelte package description to include
liveTable(already done) - Package READMEs: review for accuracy, ensure install commands don't reference alpha
- CONTRIBUTING.md: brief contributor guide (setup, PR process, coding conventions)
- CHANGELOG.md: summarize changes from alpha → beta (features, breaking changes if any)
- Docs site (
apps/docs): update intro page version references to beta (already version-agnostic) - Integration guide: brief "Adding LiveSQL to an existing Express/Fastify app" page
- Deployment guide: brief "Running LiveSQL in production" (PostgreSQL config, env vars, health checks)
- PostgREST integration guide: "Using PostgREST + LiveSQL" — Docker Compose setup, architecture diagram, example showing PostgREST for CRUD + LiveSQL for real-time streaming
- Bump all package versions to
1.0.0-beta.1 - Add
publishConfig: { "access": "public" }to all packages (already set) - Build all packages (
pnpm build) - Run full test suite (
pnpm test) — 163 tests passing - Commit version bump and doc updates
- Publish to npm in dependency order: core → client → server → react → vue → svelte
- Create git tag
v1.0.0-beta.1and GitHub release with beta pre-release flag - Push tag and release
- Hacker News "Show HN" submission
- Reddit post (r/typescript, r/node, r/webdev)
- Twitter/X announcement thread
- Dev.to / Hashnode launch blog post (how LiveSQL works, benchmarks, quick start)
- PostgREST deeper integration: shared Docker Compose template, example repo (
postgrest-livesql-starter), optional auto-discovery of PostgREST tables - Collect feedback for 2–4 weeks
- Triage issues and fix API ergonomic problems (if any)
- Promote to
v1.0.0stable release once feedback is addressed
Chaos tests (23 tests across 6 failure modes)→ all passingReplication slot failover detection and auto-recovery→ PostgresProvider.recoverFromSlotLoss()Comprehensive TypeScript types→ audit clean, added useLiveTable to Vue/Svelte for parityFirebase migration guide→ apps/docs/docs/guides/migration-firebase.mdFix integration test event batching assertions→ predicate-based wait instead of exact count
Authorization header support (→ Phase 1 completeBearer <token>)k6 load test (1,000 concurrent clients)→ p95 96ms, all thresholds passedPublish benchmark results→ tests/load/RESULTS.mdObservability hooks (→ doneonEvent,onClientConnect,onClientDisconnect)
- Initialize git repository
- Create
pnpm-workspace.yaml - Create root
package.jsonwith workspace scripts - Create root
tsconfig.base.json(ES2022, NodeNext, strict) - Configure eslint + prettier
- Configure husky + lint-staged
- Create
.gitignore - Create
docker-compose.test.yml(PostgreSQL 16, wal_level=logical)
- Create
package.jsonfor@livesql/core - Create
tsconfig.jsonwith project references - Define
ChangeTypeandChangeEventtypes - Define
SubscribeMessageandUnsubscribeMessagetypes - Define
SyncMessageandErrorMessagetypes - Define
ClientMessageandServerMessageunion types - Define
ChangeProviderinterface - Create
index.tswith public exports - Build succeeds with
tsup
- Create
package.jsonfor@livesql/server - Create
tsconfig.json - Implement
ListenNotifyProvider(LISTEN/NOTIFY for PoC) - Create trigger function for INSERT/UPDATE/DELETE notifications
- Implement minimal WebSocket server (
createLiveSQLServer) - Handle subscribe/unsubscribe messages
- Fan-out events to matching subscribers
- Create
index.tswith public exports - Build succeeds
- Create
package.jsonfor@livesql/client - Create
tsconfig.json - Implement
LiveSQLClientclass - WebSocket connect and message handling
- Subscribe/unsubscribe methods
- Basic reconnection (simple retry)
- Offset tracking
- Create
index.tswith public exports - Build succeeds
- Create demo application (HTML + vanilla JS)
- Live order status dashboard
- Auto-updates on INSERT/UPDATE/DELETE
- SQL setup script for demo tables
- Write README.md with 5-minute quickstart
- Verify: clone → install → docker up → insert row → see in browser < 5 min
- Implement
PostgresProviderclass - Create publication and replication slot
- Open replication connection
- Parse pgoutput binary messages (Relation, Begin, Insert, Update, Delete, Commit)
- Cache Relation messages by OID
- Map column positions to names
- Emit
ChangeEventfor each row change - Track monotonic offset per event
- Implement
replayFrom(offset)for reconnection backfill
- Implement
checkSlotHealth()function - Query
pg_replication_slotsforlag_bytes - Configurable warning threshold (default 512MB)
- Emit
slot:lag-warningevent - Emit
slot:inactiveevent - Run health check on 30s interval
- JWT verification on WebSocket handshake
- Token from query string (
?token=) - Token from Authorization header (
Bearer <token>) -
opts.permissions(userId, table)callback on subscribe - Reject with
FORBIDDENerror code
- Implement
validateFilter()— parsecolumn operator value - Validate column against
allowedFilterColumns - Validate operator against allowlist (
=,!=,<,>,<=,>=) - Implement
matchesFilter()— in-process filter evaluation - Reject with
INVALID_FILTERerror code
- Client stores
lastOffseton every received event - Client sends
offsetin subscribe message on reconnect - Server replays from offset via
replayFrom() - Exponential backoff: 250ms → 30s cap
- Test: INSERT event delivered to subscribed client
- Test: UPDATE event delivered with old + new row
- Test: DELETE event delivered
- Test: Reconnection backfills missed events
- Test: Permission rejection returns FORBIDDEN
- Test: Invalid filter returns INVALID_FILTER
- Test: Unsubscribe stops event delivery
-
@livesql/corev0.1.0-alpha.2 on npm (updated to alpha.3 in Phase 2) -
@livesql/serverv0.1.0-alpha.2 on npm (updated to alpha.3 in Phase 2) -
@livesql/clientv0.1.0-alpha.2 on npm (updated to alpha.3 in Phase 2)
-
LiveSQLProvidercontext provider -
useLiveQuery<T>()hook with insert/update/delete handling -
useLiveTable<T>()Map-based hook -
useLiveSQLClient()escape hatch
-
useLiveQuerycomposable -
useLiveTablecomposable (Map-based, O(1) row lookups) -
createLiveSQLPluginVue plugin (provide/inject viaLIVESQL_CLIENT_KEY)
-
liveQuerystore (lazyReadable<{data, loading, error}>, explicit client param) -
liveTablestore (Map-based, O(1) row lookups)
- Row-level permission:
opts.rowPermission(userId, table, row)(Phase 1) -
EventBatcher— coalesce, flush at 50 events or 16ms - Backpressure detection (
ws.bufferedAmount > 1MB) -
opts.onBackpressure(userId)callback
-
LiveSQLErrorexported from@livesql/client -
onErrorcallback insubscribe()routes server errors to callers -
filterparam insubscribe()sent in subscribe/re-subscribe messages
-
@livesql/corev0.1.0-alpha.3 on npm -
@livesql/serverv0.1.0-alpha.3 on npm -
@livesql/clientv0.1.0-alpha.3 on npm -
@livesql/reactv0.1.0-alpha.4 on npm (first publish) -
@livesql/vuev0.1.0-alpha.4 on npm (first publish) -
@livesql/sveltev0.1.0-alpha.4 on npm (first publish)
- Set up Docusaurus in
apps/docs - 5-minute quickstart tutorial
- Concepts page: how sync works
- API reference for all packages
- Migration guide from Supabase Realtime
- Polished React demo application (apps/react-demo — Vite + @livesql/react)
- k6 load test: 1,000 concurrent clients (p95 event latency 96ms, all thresholds passed)
- Published benchmark results (tests/load/RESULTS.md)
- Publish beta before stable — v1.0.0-beta.1 for early adopter feedback
- Network partition (simulated disconnect + reconnect with offset replay)
- Slow client / high bufferedAmount (backpressure detection)
- PostgreSQL primary failover (slot loss detection + auto-recovery)
- WAL disk approaching limit (checkSlotHealth lag detection)
- Mass reconnect / thundering herd (200 simultaneous connections)
- SQL injection via filter (13 injection vectors tested)
- Exponential backoff with jitter (±25%, implemented in client)
- Observability hooks: onEvent, onError, onSlotLag, onClientConnect, onClientDisconnect
- Replication slot failover detection and auto-recovery (reconnectOnSlotLoss, onSlotLost)
- Comprehensive TypeScript types — audit clean, useLiveTable added to Vue/Svelte
- Performance benchmark (p50/p95/p99) — tests/load/RESULTS.md
- Migration guide from Firebase Realtime Database
- Launch blog post
- v1.0.0-beta.1 → collect feedback → v1.0.0 stable
- Hacker News submission
- Implement
MySQLProviderwith binlog support - Integration tests for MySQL
- Managed cloud service (LiveSQL Cloud)
- Audit logging
- SAML SSO