Open source · MIT · Zero dependencies
@reechy-tools/
recorder
OBS-style screen + camera PIP recording in the browser.
The open-source library behind Reechy.
Draggable PIP · Shape masks · Audio mixing · TypeScript · React hooks · ~10KB gzipped
$npm install @reechy-tools/recorder
Vanilla JS
import { BrowserRecorder } from '@reechy-tools/recorder'
const recorder = new BrowserRecorder({
screen: true,
pip: { shape: 'rounded', mirrored: true },
maxDuration: 300, // auto-stop at 5 min
})
await recorder.init()
recorder.start()
const blob = await recorder.stop() // → WebMReact
import { useRecorder, usePip } from '@reechy-tools/recorder/react'
const recorder = useRecorder({ screen: true, pip: { shape: 'rounded' } })
// Spread on your container → Tailwind state styling
<div {...recorder.dataAttrs}
className="[&[data-recording]]:ring-2 [&[data-recording]]:ring-red-500"
>
<video ref={el => { if (el) el.srcObject = recorder.screenStream }} />
</div>Features
Everything you need
Extracted from Reechy's production codebase. Battle-tested.
TypeScript native
Strict types, full autocomplete. No @types/ package needed.
Screen + camera PIP
Canvas compositing with draggable, resizable overlay. Circle, rounded, or square mask.
Audio mixing
AudioContext graph — mic + system audio without crashing MediaRecorder.
Camera switch
Front ↔ back with freeze-frame. No flash, no glitch mid-recording.
Add screen mid-recording
Start camera-only, add screen share without stopping. Fully dynamic.
Max duration + auto-stop
Set maxDuration in seconds. Emits duration-limit event before stopping.
React hooks
useRecorder() + usePip() — full state, dataAttrs for Tailwind styling.
Structured errors
Every error has code + recovery hint. AI-debuggable by design.
Comparison
Why not RecordRTC?
RecordRTC hasn't shipped a release since 2021. No TypeScript, no PIP, 180KB.
FeatureRecordRTC@reechy-tools
TypeScript — native, strict—✓
Screen + camera PIP—✓
Draggable & resizable PIP—✓
PIP shape masks (circle, rounded, square)—✓
Audio mixing without crashing MediaRecorder—✓
Camera switch with freeze-frame—✓
Add screen share mid-recording—✓
Max duration + auto-stop—✓
React hooks (useRecorder, usePip)—✓
Tailwind data-* state attributes—✓
Bundle size~180KB~10KB gzip
Last updated2021Active
Chrome 88+ · Firefox 84+ · Edge 88+ · Safari 15+ (camera only)