Petar Stojanović
All work

Link

A TypeScript SDK for team channels and calls: text and voice channels, announcements, direct messages and LiveKit voice and video calls. Seven packages that any React or React Native app can adopt piece by piece.

Several of our products needed the same thing: team channels, direct messages and calls. Link is the shared answer, a set of packages that a host app adopts as far as it needs.

PackageWhat it does
link-coreDesign tokens, strings and pure logic, with no dependencies at all, not even React
link-clientOffline-first client for the Link backend
link-reactReact hooks
link-react-nativeReady-made components
link-expoSQLite, secure storage and runtime drivers for Expo
link-browserSQLite in WebAssembly for browser storage
link-callsLiveKit calls, plus the Android foreground service and iOS background audio a call needs

Design decisions

  • Rendering is optional in both directions. A host can take only the hooks and draw its own UI, or take the components as they are.
  • Layering is tested, not just documented. A boundary test fails the build if a logic package imports a rendering package.
  • WebRTC is opt-in. An app that only needs text channels stays pure JavaScript and can be updated over the air instead of needing a new store build.
  • One source of truth for voice rooms. Who is in a room comes from the media server, not a copy in the database that could drift.

I also built the Expo mobile client on top of it alone (VoIP push, CallKit, moving a call between devices, guest seats) and co-led the Next.js web client, which adds noise suppression and background effects in the browser.