Video, audio and screen recording. One JavaScript client.
Embed a lightweight recorder with streaming uploads, automatic connection retries and a decade of workarounds for browser bugs. Record video up to 4K and audio on desktop and mobile, plus screen recording on desktop. Use our UI or your own. Nothing for users to install.
One client. Four ways to capture.
The same embed and the same APIs whether you need a voice memo, a 4K webcam take, a screen walkthrough, or a file the user already has.
Audio
Microphone recording in a lighter audio-only mode, with a warning when the input level is too low to be useful.
Camera
Webcam and phone camera video up to 4K (3840×2160), with optional background blurring and a face-positioning guide.
Screen
Screen, window or tab, with system audio, microphone and an optional webcam overlay, on Chrome, Firefox and Safari.
Upload
Users can submit an existing audio or video file through the same widget, and it goes through the same processing pipeline.
Millions of recordings a year means we meet every bug before you do.
Each of these started as a support ticket somewhere and is now a workaround in the client. The links go to the write-ups.
01 · ConnectionsHigh latency, low bandwidth, dropped links
- Initial connection retry before the user sees an error
- Reconnection while the user is still recording, so the take isn't lost
- Fallback to the other zone in the region if the first refuses
- Recovery of recordings whose connection died before saving
02 · Browser changesBehavior that shifted between releases
- Device lists that arrive late, incomplete, or without labels
- HTML Media Capture losing the camera option on Android 14 and 15
- iOS 18 mp4 recordings drifting out of sync after processing
03 · Browser bugsThings the spec never intended
- MediaRecorder emitting huge slices instead of the requested interval
04 · UsersReasonable things people do mid-recording
- Revoking camera or mic permission after granting it
- Recording with the microphone barely picking up, now flagged live
- Laptop going to sleep, or a phone call arriving, during a take
- Unplugging a Bluetooth headset or plugging in a webcam after the recorder loaded
05 · CapabilitiesDevices that can't do what was asked
- Older Android devices that fail to encode at the requested resolution, dropped to a codec they can handle instead of failing
- Firefox's non-persistent camera dialog, worked around with a picture-in-picture playback mode
Camera and microphone selection that updates in real time.
Let users choose their camera and microphone from a list that updates as devices connect or disconnect. Disconnected devices stay visible, so users can see what changed. Explore the device selector.
Updates in real time
Connect a webcam or pair a headset after the page loads and it appears in the list, with a notification badge on the settings control.
Keeps showing disconnected devices
A device that vanished stays visible, marked as disconnected, so the user understands why their picture went dark instead of hunting for it.
Accounts for the switching delay
Switching cameras or mics takes a moment in every browser. The UI reflects the in-between state rather than freezing or flickering.
Respects browser-level decisions
When the browser or OS has already chosen or restricted a device, the selector follows that decision instead of fighting it.
Tested on the hardware your users actually own.
Every client release goes through real devices, virtual machines and a long list of corner cases, on macOS, Windows, iOS and Android.
Real devices
A shelf of machines chosen for being awkward:
- A Windows PC with no sound card
- A Mac mini, a popular Mac with no microphone
- Webcams from Microsoft, Logitech and OBSBOT, including 60 fps and 4K models
- An iPhone XS, the earliest iPhone with Continuity Camera
- An older Android phone that can't encode at high resolutions
Virtual devices
UTM, Parallels and BrowserStack for immediate access to OS and browser combinations we don't keep on the shelf, desktop and mobile.
Corner cases
A maintained checklist of the ways a recording session goes sideways:
- Connecting a webcam after the client initialized
- Disconnecting a Bluetooth headset while recording
- Taking a phone call mid-recording
- Revoking permissions, sleeping the laptop, switching tabs
Easy to embed. Yours to control.
The 2.0 embed code mounts one or several recorders in a page or single-page app. The JS APIs let you hide the native UI entirely and react to every state change.
// hide AddPipe's controls, use your own buttons PipeSDK.insert("recorder", { size: { width: 640, height: 390 }, qualityurl: "avq/1080p.xml", accountHash: "YOUR_ACCOUNT_HASH", eid: "YOUR_ENV_ID", showMenu: false, mrt: 300 }, (recorder) => { // control API $("#start").onclick = () => recorder.record(); $("#stop").onclick = () => recorder.stopVideo(); // events API recorder.onReadyToRecord = () => enable("#start"); recorder.onRecordingStarted = () => showTimer(); recorder.onConnectionClosed = () => toast("Reconnecting…"); recorder.onSaveOk = (id, name, duration) => done(name, duration); });
// npm i @addpipe/react-pipe-media-recorder import { usePipeSDK } from "@addpipe/react-pipe-media-recorder"; export function Recorder() { const { isLoaded } = usePipeSDK((recorders) => { const r = recorders[0]; r.onSaveOk = (id, name, duration) => save(name, duration); }, { size: { width: 640, height: 390 }, qualityurl: "avq/720p.xml", accountHash: "YOUR_ACCOUNT_HASH", eid: "YOUR_ENV_ID" }); return <div id="custom-id" />; }
HTML and JS embed codes
One embed per recorder, several per page if you need them, in plain HTML or from JavaScript.
JS Control API
Hide the native UI and call record, stop, playback and more from your own interface with the control API.
JS Events API
Ready, started, stopped, connection lost, saved: every state change fires an event on desktop and mobile.
npm and React
The npm package for bundlers, and a fully typed React hook for TypeScript and JavaScript projects. See the React demo.
Working examples
Custom UI in HTML, in JavaScript, a form with a recorder, and a recorder with a teleprompter.
The rest of what's in the 80 kB.
Streams as it records
Media is sent to the ingestion server from the first second. On a decent connection there's no upload wait when the user presses stop.
Delivered by CDN
pipe.js is served from Amazon CloudFront worldwide, or from our EU delivery servers for the EU silo. Four requests, 80 kB gzipped.
Your look, your size
Dimensions, colors and controls are configurable, or replace the UI entirely with the control API.
Four languages, or yours
English, French, German and Spanish built in, plus your own language file for anything else.
Accessible
Pipe’s recorder UI is built to WCAG 2.2 Level AA. Our VPAT documents current support criterion by criterion.
Background blurring
Blur what's behind the user for privacy-sensitive recordings such as interviews and identity checks.
Picture in picture
A PiP playback mode, added to work around Firefox's camera privacy dialog losing its state.
Time limits and countdown
Cap recording length per embed and show a countdown before recording starts.
Versioned, with a changelog
Every non-trivial change is published on the changelog with its build slug; versioning is documented.
Recording client FAQs.
Which browsers are supported?
All major desktop and mobile browsers on Windows, macOS, Linux, iOS and Android. Where a browser lacks a capability, the client degrades to what the device can do rather than failing; see the casebook above.
Do my users need an app or a AddPipe account?
No. Recording runs in the browser on your page. Your users never see or interact with AddPipe as a service.
Can I host pipe.js myself?
You can, but we advise against it: the client is updated frequently in response to browser changes, and a self-hosted copy misses those. If you must, pull the latest build regularly; the versioning docs explain how.
How big is the client and how is it loaded?
About 80 kB gzipped over four HTTP requests, served from Amazon CloudFront or, for EU-silo customers, from our EU delivery servers.
Is there a record of what changed?
Yes: the changelog lists non-trivial client changes with their build slugs.
How do I get started?
Start free trial, generate an embed code from the dashboard, paste it into a page and record. Recordings appear in the dashboard immediately.
What does it cost?
Plans start at $50 a month plus VAT or sales tax, and every plan begins with the free trial. Details on the pricing page.
What if I need help integrating?
Contact us and you'll hear back from an engineer. For work beyond AddPipe, our custom development partners can help.
Something else? Email us.
Try the recording client in your own app.
Embed the recorder and test it with your devices, browsers and workflows. Try the complete platform free for 14 days. No credit card required.
