Hear. Relay. Understand.
Desktop app for live speech transcription and translated captions through the OpenAI Realtime API.
- Captures microphone audio, system audio, or both through browser media APIs
- Streams PCM16 audio chunks from the renderer to an OpenAI Realtime WebSocket session
- Lets the control window start and stop Relay, choose sources, set the original caption label and target translation language, manage the API key, toggle the overlay, and export transcripts
- Shows recent original and translated captions in the overlay window
- Saves transcripts as plain text with source and target language codes
- Bun 1.3.14
- OpenAI API key with Realtime API access
- Desktop runtime supported by Electron
bun ci
bun devOpen the control window, save an OpenAI API key, choose the original caption label and target translation language, then start Relay.
Relay stores app settings locally. Defaults:
| Name | Default | Description |
|---|---|---|
microphone |
true |
Capture microphone audio |
systemAudio |
true |
Capture system audio |
originalLanguage |
en |
Original transcript label, or auto |
translationLanguage |
ru |
Target translation language |
overlayRows |
4 |
Captions shown in the overlay |
overlayOpacity |
0.8 |
Overlay window opacity |
The OpenAI API key is stored separately from normal app settings.
bun check
bun check:fix
bun check:types
bun check:unused
bun check:vulnsbun run buildbun run build writes packaged Electron artifacts to release/<version>/.
Versioning is handled through release-it:
bun release:patch
bun release:minor
bun release:majorThe release config prepares the next package.json version and pushes a v* tag. It does not
publish npm packages or create the GitHub release directly.
Release builds run from Git tags matching v*. The CI workflow builds Linux, macOS, and Windows
artifacts and publishes them to the GitHub release.
Release builds are unsigned unless signing credentials are configured outside this repository.
bun postinstall
bun vite build
bun electron-builder --linux --x64 --publish never
bun electron-builder --mac --arm64 --publish never
bun electron-builder --win --x64 --publish never- The renderer captures audio with Web Audio APIs and sends fixed-size PCM16 chunks through IPC
- The Electron main process owns the Realtime WebSocket session and app state
- System audio capture uses
getDisplayMediaand requires platform support for shared audio - Captions are kept in app state, rendered in the overlay, and exported through the save dialog
- Settings cannot be edited while Relay is actively connecting or listening
- Electron, React, TypeScript, Bun
- Vite, Tailwind CSS, Base UI, lucide-react
- ESLint, Prettier, Stylelint, Lefthook, Knip