Skip to content
← All work
PresentFull-Stack Engineer

Pivot

Open collaboration platform — Notion-style docs, real-time messaging, and LiveKit audio/video in one cross-platform product (web, iOS, Android, desktop).

Visit live site

Tech stack

GoTypeScriptReact NativeConnect-RPC / gRPCNATS JetStreamTemporalLiveKitYjs / LexicalPostgreSQLCassandraAWS EKS

The challenge

Delivering Google-Docs-grade collaborative editing, sub-second real-time presence, and reliable A/V — across web, iOS, Android, and desktop — on a service-oriented backend that had to stay consistent and observable in production.

Architecture & approach

Service-oriented backend (~20 microservices) on AWS EKS with protobuf-first Connect-RPC APIs, a NATS JetStream event bus, and Temporal for durable workflows. Polyglot persistence (Aurora Postgres, Cassandra, Valkey, Turbopuffer, S3). Real-time layer is a custom Pilot (WebSocket) + Dealer (pub/sub fan-out) stack; collaborative block editing uses Yjs CRDT merged server-side. A single React Native + Expo codebase (wrapped by Tauri on desktop) drives all four platforms.

Pivot high-level architectureClients — React NativeWeb · iOS · Android · Tauri desktopEdge / API Layerfriend (Connect-RPC) · visa (auth) · pilot (WebSocket) · restAI / Searchasimov · questDomain Services (Go)facebox · messenger · blockheadblobby · buzzer · stagehand · uconfReal-timedealer (pub/sub fan-out)fusion (Yjs merge)NATSJetStream+ TemporalAurora PostgresEnt + AtlasCassandrahigh-write hot pathsValkey · Turbopuffercache · vector searchAWS EKSHelm · Argo CD · Karpenter · Cilium mTLS · OTEL → Axiom

Key technical decisions

  • 01Service-oriented from day one — hard domain boundaries with one database per service, rather than splitting a monolith later.
  • 02Protobuf as the single contract for both gRPC (Connect-RPC) and NATS events, generating Go and TypeScript clients from one source.
  • 03Split real-time into Pilot (WebSocket connection management) and Dealer (pub/sub fan-out) so each scales independently.
  • 04Yjs CRDT for collaborative editing — merge conflicts without operational-transform complexity, with Friend/RPC as source of truth over ephemeral Pilot data.
  • 05Polyglot persistence: Postgres for relational data, Cassandra for high-write hot paths (messages, block updates), Valkey for caching, Turbopuffer for vector search.
  • 06One React Native codebase for web, iOS, Android, and Tauri desktop to avoid maintaining four separate clients.

Results

  • Contributed across the stack — Go/TypeScript microservices, real-time systems, and the React Native frontend
  • Built real-time collaboration features on the Pilot/Dealer WebSocket stack: presence, typing indicators, live cursors, and Yjs-based block editing
  • Implemented Connect-RPC/gRPC services with protobuf contracts shared across Go and TypeScript, backed by NATS event streams
  • Shipped cross-platform UI from one React Native codebase to web, iOS, Android, and Tauri desktop, including the Lexical + Yjs collaborative editor
  • Integrated LiveKit audio/video (rooms, recording, transcription) and AI features (RAG/vector search, summaries)
  • Worked within the EKS + Argo CD CI/CD pipeline with affected-service deploys, OpenTelemetry tracing, and integration tests

What I learned

At this scale, reliability is a feature: strict service boundaries, protobuf contracts, and treating real-time state as ephemeral (with RPC as source of truth) are what keep multiplayer fast and correct.

Want an outcome like this?