audio-recorder-voice
About · technical

How this recorder works

How this recorder works, written to be checked rather than believed. If you are evaluating it for confidential work, this is the page to hand to whoever needs to assess it.

The full path, step by step

  1. You press Record. The page calls navigator.mediaDevices.getUserMedia({ audio }), which triggers your browser's permission prompt.
  2. The browser returns a MediaStream. This is a live in-memory handle to the microphone, not a file.
  3. The stream is connected to an AudioContext, and an AnalyserNode reads it to draw the waveform and level meter.
  4. For WAV and MP3, a processing node collects raw float samples into an array as you speak. For native output, MediaRecorder encodes the stream directly.
  5. On Stop, the samples are converted — to 16-bit PCM with a RIFF header for WAV, or through a JavaScript LAME encoder for MP3.
  6. The result becomes a Blob, and URL.createObjectURL() produces a blob: URL pointing at your own memory.
  7. That URL is attached to a download link. Clicking it writes the file to your disk.

No step involves the network. The blob: URL scheme is specifically a reference to in-memory data in your browser, not a remote address.

Verifying it

The offline test is the most convincing. A tool that requires an upload cannot function without a network; this one is unaffected.

What each format does technically

WAV
Float samples converted to 16-bit integers, prefixed with a 44-byte RIFF header. No compression, no library.
MP3
Samples passed through LAME compiled to JavaScript, running on your processor. 128 kbps CBR mono.
Native
Browser's own MediaRecorder — Opus in WebM on Chrome, Edge and Firefox; AAC in MP4 on Safari.

What the site loads

Everything is served from this domain. Fonts are self-hosted rather than pulled from a font CDN, so no third party learns that you visited. The MP3 encoder is served from this origin and loaded only when you select MP3. There are no third-party scripts on recorder pages.

The limitations this design imposes

Being local-only costs real capability, and it is worth stating plainly:

These are consequences of the architecture, not oversights. A tool that fixed them would need to upload your audio.

Questions

How can I be sure my audio is not uploaded?

Three checks: watch the Network tab while recording, read /recorder.js for any fetch or WebSocket call, or disconnect from the network entirely and confirm recording still works.

What is a blob: URL?

A reference to data held in your browser's memory. It is not a web address and points at nothing remote — which is how the download works without a server.

Is the code available to read?

The recorder is served unminified at /recorder.js. Open it directly in your browser and read it.

Does the MP3 encoder send audio anywhere?

No. It is a JavaScript library served from this domain that runs on your processor. It has no network capability.

Why can't I recover a lost recording?

Because nothing is stored. That is the direct cost of the design — the same property that means we never have your audio means we cannot return it.

Does the site load anything from third parties?

No. Fonts, styles and scripts are all served from this domain, so visiting does not reveal anything to an outside party.