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.
| Package | What it does |
|---|---|
link-core | Design tokens, strings and pure logic, with no dependencies at all, not even React |
link-client | Offline-first client for the Link backend |
link-react | React hooks |
link-react-native | Ready-made components |
link-expo | SQLite, secure storage and runtime drivers for Expo |
link-browser | SQLite in WebAssembly for browser storage |
link-calls | LiveKit 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.