Dev.to WebDev 🛠 Dev 👁 0 📖 16 min read

I tested the existing Chrome tab audio recorders. I had to build a proper one

The first version of this article was written for habr, a Russian technology publication, but its moderators rejected it for “using AI to write and edit the text.” So I rewrote it myself. I had honestly tried to protect

I tested the existing Chrome tab audio recorders. I had to build a proper one

The first version of this article was written for habr, a Russian technology publication, but its moderators rejected it for “using AI to write and edit the text.” So I rewrote it myself. I had honestly tried to protect readers from my own literary talent, but that attempt failed. You will now have to endure my jokes, questionable metaphors, and occasional bouts of verbosity. You can still close the page, though. You have been warned.

Now to the point. Some time ago, I needed a Chrome extension that could record audio from a browser tab. The task looked so simple that I had no intention of developing anything. Surely the Chrome Web Store already contained dozens of ready-made solutions. Pick one, press Record, and carry on with your life.

I installed several extensions, tested what they could do, and read their user reviews. Gradually, I came to the conclusion that the world apparently needed my intervention.

Some extensions were too basic. Others offered useful features but did not always deliver them reliably. Some lacked automation, some raised uncomfortable questions about whether a recording would survive, and some imposed limits whose purpose I could not understand. I will go through those problems below. In the end, I decided to build my own extension and called it Pulse: Free Tab Audio Recorder.

At first, I planned to make a convenient recorder with a few extra features. Then more ideas appeared. Then a few more. Eventually it became clear that the original plan could be discarded. That is a familiar development story: if someone claims their finished product matches the original specification perfectly, they may simply not have started building it yet.

An hour of recording, and nothing was saved. Wonderful

I will start with the kind of software that irritates me most: software that merely looks as if it is working. Imagine recording a one-hour lecture. The extension shows a recording indicator, the timer counts every minute correctly, and everything appears fine. An hour later, you click Stop and expect a file. Instead, you get an error. Or an export that never finishes. Or a browser crash. This is particularly delightful when the lecture was a one-off live stream.

At first, I assumed failures like this must be rare. Then I read the reviews.

The last review felt especially familiar. Keeping the entire recording until the very end and then trying to save it in one operation is, to put it mildly, risky. Until the user presses Stop, they have no way of knowing whether the recording can actually be saved.

The program holds an hour of captured audio hostage and promises to hand it over only after you click Stop. If the browser crashes first, the hostage is gone. Even meeting the captor’s demands does not guarantee a happy ending: according to the reviews, the export itself can fail too.

I decided not to leave users negotiating with kidnappers. Pulse saves audio locally in small chunks while recording is still in progress. If the browser closes unexpectedly, everything already written to disk remains there. Counter-Terrorists Win.

A little about the architecture

First, I had to deal with Manifest V3. Chrome may stop an extension’s background service worker whenever it considers the worker inactive. Entrusting a multi-hour recording to it would therefore be optimistic: eventually the browser might simply decide that the worker is no longer needed.

In Pulse, the service worker coordinates the process. It obtains access to the tab’s audio stream, starts and stops sessions, and passes commands around. The audio itself is handled in a special hidden document that Chrome allows extensions to create for tasks like this.

Chrome tab → Audio capture → Offscreen document → Encoding → IndexedDB

Audio travels from the tab into the offscreen document, where it is processed and encoded in the selected format. Finished chunks are written sequentially to a local IndexedDB database. If Chrome terminates unexpectedly, the data already written to disk does not disappear with the recording process.

Each chunk is stored together with its position and the current recording state. The audio data and its metadata are committed in the same transaction. This prevents Pulse from marking a chunk as saved when its write operation never actually completed.

The exact process depends on the format. For WebM, the browser itself provides chunks of encoded audio roughly once per second. MP3 and WAV use a separate audio pipeline and encoder.

I consider protection of already captured data a basic property of a recorder, not a premium feature for which users should thank the developer with tears in their eyes. Judging by some reviews, however, there is apparently something to be thankful for.

Twenty minutes ought to be enough for anyone

Another thing I discovered while studying competing extensions was the recording-duration limit.

Twenty minutes. I tried to imagine a situation in which this would make sense as a universal limit. It is too long for a song, too short for a lecture, and rather absurd for a webinar. Apparently all useful knowledge stops at minute twenty-one.

I did not add an artificial duration limit to Pulse. Need five minutes? Fine. Three hours? Also fine. Record as much as your computer can handle. The real limits are the available storage and the computer’s resources.

If storage runs out, that is where my powers end. I can write software, but I have not yet learned to conjure extra gigabytes out of thin air. Pulse can at least give you advance warning: when Chrome estimates that less than 500 MB remains available to the extension, Pulse displays a warning and estimates how many minutes are left at the current format and quality.

Can it do that by itself?

I am a fairly lazy person—in the sense that I dislike performing actions a computer can handle perfectly well on its own. If I need to record a lecture, I do not want to keep checking whether it has started, whether playback has stopped, whether a long pause has begun, or whether it is time to finish the recording. The machine has a processor. Let the robots handle the repetitive work.

That is why Pulse includes several kinds of automation.

You can delay the start by a few seconds or tell Pulse to begin only when sound appears in the tab. Recording can also stop automatically after a chosen duration, when the page changes, or after a prolonged period of silence.

There is also Smart Pause. It can pause a recording automatically in two ways.

The first responds to silence: when sound disappears for the chosen interval, recording pauses. When sound returns, recording resumes.

The second follows the media player. If a user pauses a YouTube video, Pulse pauses the recording too. When playback resumes, the recording follows immediately. Pulse does not have to wait for the silence detector’s delay because it reacts directly to the player state.

Unfortunately, the same synchronization logic cannot work equally well on every website. Media players differ, and some require site-specific handling. Pulse currently supports this behavior on YouTube, VK, and Instagram. I can add other websites and social platforms if there is enough demand.

Disconnecting the internet, because why not?

After I implemented automatic pausing and resuming, one beta tester decided to see what happened when the internet connection dropped. He opened a music video on YouTube, started recording, and disconnected the network. Playback stopped. Then he restored the connection, waited for the video to continue, and finished the recording.

He found a problem: the join between the two audio segments was clearly audible. He reported it, and I had to investigate.

Simply pausing the recorder at the same time as the player was not enough. A pause event and the actual end of audible output do not always occur at exactly the same moment. The player may already report that it has stopped while a small amount of audio still remains in the stream. If recording stops immediately, the end of a word or musical phrase gets cut off.

Resuming has a similar problem. The player may already be running while the sound reaches the extension slightly later. Joining two segments at unfortunate sample positions can also create a sudden amplitude jump that the ear hears as a click.

I had to work on the boundaries. For MP3 and WAV, Pulse retains a short tail of recent audio instead of cutting the stream as soon as it receives a pause event. It continues analysing the signal until the sound has actually faded. When recording resumes, Pulse checks the beginning of the next segment and, when necessary, applies a very short crossfade.

Automatic silence detection created a separate issue. A detector needs a little time to notice that sound has appeared. Without compensation, the beginning of a word or musical note may be lost. Pulse therefore keeps a short pre-roll buffer of the latest input. When sound appears, that buffered audio is included so the beginning is preserved.

WebM required a different approach because the audio has already been encoded and the join cannot be repaired at the sample level in the same way. I introduced a short delay into the recording pipeline and synchronized the pause and resume commands with it. This places the boundaries closer to the actual beginning and end of the sound.

This took a fair amount of trial and error: change the algorithm, record test fragments, listen closely to every join, and change it again.

After the fixes, the tester repeated the network-disconnection experiment. This time he could not tell where the join was. He tested it on music, where this kind of defect is especially noticeable.

Audio quality, or why some developers add a fireplace

The next group of reviews puzzled me. Users complained about crackling, clicks, and other unwanted sounds in their recordings.


I have a theory. Perhaps the developers wanted to make listening more comfortable: an evening, a cup of tea, favourite music, and a fireplace crackling quietly in the background. Unfortunately, their users failed to appreciate the artistic vision.

I decided not to repeat that bold experiment. If someone wants the sound of a fireplace, they can open the appropriate YouTube video themselves. I spent a great deal of time on audio quality in Pulse, including the removal of unwanted clicks around pause and resume boundaries.

Here is another review:

For this user, 128 kbps was not enough. The extension also stopped offering MP3 for long recordings and left WebM as the only option.

Another user specifically needed WAV:

Pulse therefore supports three formats: MP3, WAV, and WebM. MP3 can be recorded at up to 320 kbps. WAV is available for people who need lossless PCM audio. MP3 is useful when file size and compatibility matter. WebM is one of the formats Chrome can record directly without an additional encoder.

Of course, saving an already compressed source as WAV will not restore information that was previously lost. Nor will 320 kbps MP3 turn a poor source into a studio recording. At least the extension does not need to make the sound worse.

Naming a file so you can find it later

Another category of requests seemed entirely reasonable.

A file name looks like a minor detail until you record browser audio regularly. A month later, you have several dozen files, all called something like this:

  • recording_1.mp3
  • recording_2.mp3
  • recording_final.mp3
  • recording_final_final.mp3

The last one naturally contains anything except the recording you are looking for.

Pulse lets users configure file-name templates. A name can include information about the recording so that files are easy to distinguish later. This becomes particularly useful when recording several tabs at once, which brings me to the next feature.

A developer can spend a month refining an audio algorithm, and the feature that delights users most may still be sensible file names. Fortunately, one is allowed to be proud of both.

One tab is good. Three are better

Some Pulse features appeared only after development had already begun. Recording several tabs simultaneously was one of them. The original workflow was ordinary: open a tab, click Record, and receive one audio file.

Then I needed to capture sound from several tabs at once, so I added it. Pulse can now run multiple independent recordings in parallel. Every tab is saved separately and produces its own audio file.

Under the hood, each tab gets its own recording session with an audio stream, encoder, timers, and settings. All sessions still run inside a single offscreen document because Chrome does not allow an extension to create a separate one for every tab.

I also had to ensure that simultaneous commands from different tabs could not interfere with each other. If two sessions report state changes at nearly the same time, one must not overwrite the other. Pulse therefore serializes those state updates.

Recording several tabs revealed another problem. If every tab plays through the speakers, working at the computer becomes difficult—especially when each speaker is talking in a different language. So I added the option to record a tab without hearing it through speakers or headphones.

A Chrome behavior made this possible. When an extension captures tab audio, the browser stops routing that audio to the output device automatically. If the user should still hear it, the extension must route the captured stream back to the speakers itself.

Pulse makes that routing optional. If the user wants to listen, the audio goes to the speakers or headphones. If not, monitoring stays off while recording continues. The setting does not change the quality of the saved audio.

As a result, you can record a lecture in one tab and listen to music in another. No microphone is involved: Pulse receives the audio directly from the browser tab, so room conversations, keyboard noise, and other domestic sound effects do not enter the file.

The interface evolved too. Extensions normally open in a small popup, which is enough for a simple action. With several recordings running, repeatedly reopening that popup becomes inconvenient. Pulse can therefore be pinned to Chrome’s side panel and remain visible while the user works.

An interface that does not require another degree

Building an extension with two buttons is easy: Start and Stop. Add an attractive icon, describe the interface as “intuitive,” and declare the task complete.

The opposite extreme is equally available: implement dozens of features, place every setting on one screen, and create something halfway between an aircraft cockpit and a nuclear power station control room.

I did not want users to choose between simple but primitive and capable but impenetrable.

My brief to the designer was therefore straightforward: a newcomer should understand how to record audio quickly, while an experienced user should still be able to find the advanced controls. I think we came reasonably close.

Evaluating your own interface is difficult, of course. I helped design it, discussed every decision, and requested changes, so every button appears obvious to me.

Then a user arrives and looks for an obvious feature in a place you never imagined. A tester finds a path through the interface that nobody on the team considered. If the product breaks, the interface did not protect the user well enough.

The first temptation is to blame the person who could not find the button directly in front of them. I am not going to pretend that thought never occurs to me.

Eventually, however, the unpleasant conclusion remains: when users do not understand an interface, the developer or designer has probably failed somewhere—especially when several users struggle in the same place.

That is why feedback from people seeing Pulse for the first time is particularly valuable.

The interface is currently available in nine languages. Pulse was designed for more than a Russian-speaking audience from the beginning.

Why record audio from a local video?

While reading reviews of other extensions, I found another request.

People sometimes need audio not only from websites but also from local files opened in the browser. Perhaps they have an MP4 video and only need its audio track. The usual solution is a separate converter, but the user can also open the video in Chrome, start playback, and record the sound with Pulse.

Chrome requires the user to grant the extension access to local file URLs separately. That is a browser restriction rather than a Pulse setting.

This does not replace a proper converter. Recording happens in real time, so extracting audio from a two-hour video still takes two hours. For a small clip and a one-off task, however, it works perfectly well.

ChatGPT as a voiceover tool

Some time ago, I needed voiceovers for video tutorials about another extension I built: BlockIt, which hides or removes unwanted elements from websites. Incidentally, making those tutorials reinforced another lesson: it is better to make software understandable from the beginning than to make the developer write instructions and the user study them.

Back to the voiceover. I needed the tutorials in several languages. I translated the scripts with ChatGPT and then decided to use its Read Aloud feature. ChatGPT—and DeepSeek as well—can read an assistant response aloud. I only needed a way to save the resulting audio.

That is where Pulse became useful. I started Read Aloud, captured the tab audio, and received a ready-to-edit file. I then used it while assembling the tutorial videos.

This allowed me to avoid a specialised paid text-to-speech service.

What comes next?

I had planned to stop after implementing the existing features, but while collecting material for this article I found another interesting review.

A request to use picture-in-picture while recording tab audio
A user wants picture-in-picture to remain available while the tab is being recorded.
The request concerns picture-in-picture mode, where a video continues in a small always-on-top window while the user works in another application. The reviewer could not use that mode while recording audio.

It is a useful idea. Will it appear in a future Pulse release? We will see.

For now, I want to understand how much demand there is for Pulse. If enough users arrive with real requests, that will show which direction is worth pursuing.

Free, paid, and available to bargain hunters

I also found this review while studying competing extensions:

The frustration is understandable. Paying $30 for software that barely differs from free alternatives is hard to justify—especially if its main feature works only intermittently. At that point, even a coconut-milk latte begins to look like the more sensible investment.

I chose a freemium model for Pulse. The free version remains a useful recorder in its own right, while Pro adds controls that save time and automate repetitive work.

Pulse Free

Core recording, free and without a duration limit

  • Record one tab to MP3, WAV, or WebM
  • Quality up to 256 kbps
  • Chunked saving while recording is in progress
  • Delayed start using a timer
  • Preset stop intervals: 30 minutes, 1 hour, or 2 hours
  • Buffering time is excluded from the recording automatically

Pulse Pro

Automation and several independent recordings

  • Record several tabs simultaneously
  • Record without playing the tab through speakers or headphones
  • Smart Pause based on silence or the media-player state
  • Start recording when sound appears
  • Custom stop conditions and exact durations up to 24 hours
  • Custom file-name templates and quality up to 320 kbps

Get Pulse Pro free for life

The first 1,000 users to activate Pulse Pro receive a free lifetime licence, with no subscription or bank card required.

To claim yours, install Pulse, click “Get Pulse Pro free” in the extension settings, and sign in with Google. Activation takes about a minute.

Note: Installing Pulse alone does not reserve a licence. You need to complete the activation.

Get Pulse

Instead of a conclusion

The result is a Chrome extension that records tab audio to MP3, WAV, or WebM without an artificial duration limit. It can capture several tabs at the same time, save each one to a separate file, and do so without forcing the user to listen to every recording.

I paid particular attention to automation. Pulse can start and stop under selected conditions, skip prolonged silence, and follow playback on YouTube, VK, and Instagram. To prevent an hour-long recording from disappearing after an unexpected browser failure, Pulse writes audio to disk in small chunks while recording is still in progress.

I tried to fit all of that into an interface that does not require a manual. Users will decide how successful that attempt was.

Could I have built something simpler? Absolutely.

Could I have spent less time developing it? Without question.

But then it would have been just another extension that records audio.

I wanted to build a proper one.

You can explore Pulse, see its interface, and learn more about its features on the project page: Pulse on FormaCode.dev.

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.