One write path.
Every engine, in step.
Fabriq is a standalone data fabric for Go. Commands commit once through a transactional outbox, then fan out to relational, time-series, vector, graph, and search engines — versioned, tenant-scoped, always rebuildable.
Three invariants.
Zero drift.
Not conventions. Not review checklists. Structural properties of the fabric.
One write, one event
Every command commits inside a Postgres transaction that appends exactly one versioned event. A leader-elected relay publishes it to Redis Streams — nothing written twice, nothing lost.
Tenant-scoped, structurally
Tenant rides on context and is stamped into every engine — row-level security in Postgres, graph-per-tenant, index routing, key prefixes. Cross-tenant reads don’t fail politely. They can’t happen.
Always rebuildable
Graph and search are projections, never written directly. Blue-green rebuilds swap in atomically, and a reconciler detects drift and heals it through the same outbox.
Follow a write through the loom.
- 01
f.Exec(cmd)
A command enters the facade — validated against the registry, tenant and traceparent stamped on the envelope.
- 02
postgres commit
State and exactly one versioned event commit atomically — the outbox lives in the same transaction.
- 03
leader relay
A leader-elected relay wakes on LISTEN/NOTIFY and publishes the event to Redis Streams, in order.
- 04
woven outward
Consumer groups project the event into graph and search, and push live deltas to subscribers — one truth, every engine.
Every shape of data. One facade.
Reads go through typed ports. Writes go through Exec — and nowhere else. The fabric decides which engine serves which shape; your code imports one package.
The only write path. Commands in a Postgres transaction, exactly one versioned event each.
Transactional outboxTyped gets, filtered lists, and pagination against the source of truth.
Postgres · RLSBulk telemetry ingest and windowed reads on hypertables.
TimescaleDBSimilarity search over embeddings with HNSW indexes.
pgvectoropenCypher traversals with one-shot, batched hydration.
FalkorDBFull-text multi-match over declared fields, alias-swap rebuilds.
ElasticsearchCRDT documents that materialize into ordinary versioned entities.
Merge engineConflated live deltas with Last-Event-ID resume over SSE.
Redis StreamsInvariants,
not promises.
Most stacks bolt a search index and a graph onto a primary database and hope the glue holds. Drift creeps in quietly, tenancy leaks through a forgotten filter, and rebuilding a projection becomes a weekend with a runbook.
Fabriq makes the guarantees structural. Writes pass through one door and leave a versioned trail. Projections are derived, disposable, and rebuilt blue-green while reads keep flowing. And when an engine disagrees with the source of truth, the reconciler notices — and heals it through the same front door.