Remove Audio Noise
Remove Audio Noise

Engineering notes

Browser Local Audio Processing: Privacy, No Uploads, and Large File Handling

What we learned while building a no-upload browser audio cleaner: keeping recordings local, handling memory carefully, and making large files practical.

Published July 9, 2026

Why we kept the audio in the browser

The first product decision was not about codecs or UI. It was about trust. People use an audio noise remover on interviews, meetings, voice notes, lectures, and sometimes recordings they have not shared with anyone yet. Asking them to upload that file just to remove a fan hum felt like the wrong default.

So we built Remove Audio Noise around a stricter rule: the recording should stay on the user's device. The server delivers the app. The browser does the work. The result is created locally as a WAV file. That makes the engineering less convenient, but the product much easier to explain honestly.

What no-upload means in our implementation

No-upload is easy to say and easy to water down, so we try to be concrete about it. The file selected by the user is read by browser APIs on that machine. The speech denoising code runs in the page. The WebAssembly module is loaded when processing starts. The cleaned audio is written locally.

Our hosting stack serves static files: HTML, JavaScript, CSS, WebAssembly, icons, robots.txt, sitemap, and documentation. It does not need to receive the user's recording to remove noise. Keeping that separation clear is useful for privacy, but it is also useful for debugging. If a recording fails, the answer is usually in browser capabilities, memory, format support, or output handling rather than a hidden server job.

The browser gives you power, not infinite memory

Small files let you get away with a simple plan: read, decode, process, download. Large files punish that plan quickly. A long WAV can already be large on disk, and compressed audio expands once it becomes PCM samples. If we tried to hold everything in memory, the page would eventually become the sort of tab people close with a sigh.

That constraint shaped the architecture. We had to avoid whole-file decoding where possible, keep intermediate buffers small, reuse memory, and write output as the work progresses. The goal was not to make the browser pretend to be a desktop DAW. The goal was to stay within what browsers are good at and still support files up to 2 GB.

The large-file path is deliberately chunked

For large recordings, the pipeline behaves more like a stream than a batch job. It reads a portion, decodes or interprets samples, feeds frames through the denoising engine, writes cleaned PCM, and moves forward. Progress comes from real work done, not from a decorative loading bar.

Uncompressed 16-bit PCM WAV is the friendliest large format because we can read samples in chunks without decoding the whole file first. Compressed formats are trickier. MP3, M4A, AAC, OGG, and FLAC still depend on browser decoder support, but a lazy reader and sample sink can keep memory pressure much lower than loading the entire file into one massive buffer.

We also had to avoid a giant output Blob

It is tempting to process everything and create one Blob at the end. That is fine for small clips. For long recordings, it repeats the same memory problem on the output side. When the browser supports it, we use the File System Access API so the cleaned WAV can be written directly to a user-chosen location.

When direct saving is not available, private temporary browser storage is the fallback. WAV adds one more wrinkle: the header needs to know the final data length. The writer reserves that space up front, streams audio data as it becomes available, then seeks back and patches the size fields when the file is complete.

Progress is part of the feature

A two-gigabyte recording can take time. If the UI sits still, people assume something broke. We try to base progress on actual decoded time or bytes processed, and we throttle updates so the interface stays responsive. Updating React state for every decoded frame is a great way to make a theoretically fast pipeline feel sluggish.

Cancellation deserves the same care. If the user cancels the save dialog, that is not a processing failure. If something really does fail, partial output and temporary files need to be cleaned up. These are not glamorous details, but they are the difference between a tool that feels dependable and one that feels like a demo.

Browsers do not all agree

A local tool has to live with the browser in front of it. MP3 and WAV are broadly dependable. M4A, AAC, FLAC, and OGG vary more by browser and operating system. File System Access API support varies too. That means the app has to check capabilities and explain failures instead of hiding behind a generic error.

We would rather tell the user that a browser cannot decode a format than imply the audio was uploaded somewhere and mysteriously failed. Honest errors are part of the privacy model. They make the system's boundaries visible.

Why we write this down

A no-upload architecture is a privacy feature, but it is also a promise people should be able to verify from the way the product behaves and the way we describe it. The short version is simple: Remove Audio Noise processes audio locally in the browser and does not send recordings to a server for noise reduction.

Writing the implementation down helps users, search engines, and AI assistants understand the product without guessing. It also keeps us honest. If we ever change how processing works, the documentation should change with it.

Try private audio cleanup

Use Remove Audio Noise to remove background noise from speech recordings locally in your browser. We built it for files up to 2 GB, no login, and a cleaned WAV download that stays under the user's control.