<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Nico</title>
    <description>The latest articles on Forem by Nico (@d3sox).</description>
    <link>https://forem.com/d3sox</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F509967%2F9affbecf-f943-4be6-8fad-8ff0e49c7dfb.png</url>
      <title>Forem: Nico</title>
      <link>https://forem.com/d3sox</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/d3sox"/>
    <language>en</language>
    <item>
      <title>Built an app that provides various audio tweak tools and runs entirely in the browser</title>
      <dc:creator>Nico</dc:creator>
      <pubDate>Mon, 08 Dec 2025 16:22:26 +0000</pubDate>
      <link>https://forem.com/d3sox/i-built-a-browser-only-audio-toolkit-bhn</link>
      <guid>https://forem.com/d3sox/i-built-a-browser-only-audio-toolkit-bhn</guid>
      <description>&lt;h2&gt;
  
  
  🎧 Why I Built This
&lt;/h2&gt;

&lt;p&gt;I often needed quick &amp;amp; dirty audio utilities. Add a burst of noise to a track, retag WAVs with metadata from another file, extract album covers, convert formats, trim silence, or generate clean waveform PNGs.&lt;/p&gt;

&lt;p&gt;Desktop tools (like Kid3 or FFmpeg-GUI) exist… but they were to overkill and not good adjusted for my use cases, so I had to switch apps constantly.&lt;/p&gt;

&lt;p&gt;So I made &lt;strong&gt;Browser Audio Tools&lt;/strong&gt;: A &lt;strong&gt;Bun + TypeScript + React&lt;/strong&gt; app that runs ffmpeg locally in a Web Worker. Everything stays on your machine.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 What It Can Do
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Add Noise + Concat&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Useful when you need to slightly alter a track’s fingerprint (e.g., avoiding auto-takedowns on platforms when you already own the rights).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pink or white noise&lt;/li&gt;
&lt;li&gt;Duration &amp;amp; volume controls&lt;/li&gt;
&lt;li&gt;Concat automatically&lt;/li&gt;
&lt;li&gt;Output bitrate selection&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Extract Cover Art&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Pulls the embedded album image from any supported file. Saves as JPEG.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Retag WAV into MP3&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Have a pristine WAV render but metadata only in an MP3?&lt;br&gt;
Load both → the app copies all tags + artwork → exports a clean 320 kbps MP3.&lt;/p&gt;

&lt;p&gt;Great for tidying metadata from downloaded sources (yt-dlp, SoundCloud, etc.).&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;4. Convert Between Formats&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Supported input: &lt;strong&gt;WAV, FLAC, AIFF, MP3, OGG, M4A (AAC), …&lt;/strong&gt;&lt;br&gt;
Supported output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lossy: &lt;strong&gt;MP3, OGG, M4A (AAC)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Lossless: &lt;strong&gt;WAV, FLAC, AIFF&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With controls for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bitrate&lt;/li&gt;
&lt;li&gt;Sample rate&lt;/li&gt;
&lt;li&gt;Channels&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;5. Retag MP3 (No Re-Encoding)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Fix ID3v2 tags instantly, Title, Artist, Album, Artwork, and more&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;6. Audio Trimming (Visual UI)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Select the region on a waveform or type times manually.&lt;br&gt;
Options include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Silence removal using ffmpeg’s &lt;code&gt;silenceremove&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Export to any supported format&lt;/li&gt;
&lt;li&gt;Keep only the selected region&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;7. Waveform Generator&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Create clean, customizable PNG waveform renders for your track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bar width/gap/height&lt;/li&gt;
&lt;li&gt;Opacity &amp;amp; background color&lt;/li&gt;
&lt;li&gt;Preset color themes&lt;/li&gt;
&lt;li&gt;Export transparent PNG for overlays&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;8. Multi-File Processing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Batch convert or batch extract covers. Results come back as a ZIP.&lt;br&gt;
Uses the &lt;strong&gt;multi-threaded ffmpeg core&lt;/strong&gt; for faster per-file execution.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠 Under the Hood
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bun + React + TypeScript&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/@ffmpeg/core-mt" rel="noopener noreferrer"&gt;&lt;strong&gt;@ffmpeg/ffmpeg&lt;/strong&gt;&lt;/a&gt; with the &lt;strong&gt;multi-threaded wasm core (&lt;a href="https://www.jsdelivr.com/package/npm/@ffmpeg/core-mt" rel="noopener noreferrer"&gt;&lt;code&gt;@ffmpeg/core-mt&lt;/code&gt;&lt;/a&gt;)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;All processing inside a &lt;strong&gt;Web Worker&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;~30 MB ffmpeg bundle cached after first load&lt;/li&gt;
&lt;li&gt;Zero back-end; the whole site is static&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you open DevTools, you can see the ffmpeg worker doing all the heavy lifting.&lt;/p&gt;


&lt;h2&gt;
  
  
  🌐 Try It Out
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://browser-audio-tools.d3sox.me" rel="noopener noreferrer"&gt;https://browser-audio-tools.d3sox.me&lt;/a&gt;&lt;br&gt;
👉 &lt;strong&gt;GitHub repo:&lt;/strong&gt; &lt;a href="https://github.com/D3SOX/browser-audio-tools" rel="noopener noreferrer"&gt;https://github.com/D3SOX/browser-audio-tools&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  💻 Contributing
&lt;/h2&gt;

&lt;p&gt;It’s MIT-licensed and set up to be easy to run locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bun &lt;span class="nb"&gt;install
&lt;/span&gt;bun run dev
bun run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to contribute tools, presets, UI improvements, or advanced filters, PRs are welcome!&lt;/p&gt;




&lt;h2&gt;
  
  
  🙏 Thanks &amp;amp; What’s Next
&lt;/h2&gt;

&lt;p&gt;This project aims to be a &lt;strong&gt;focused, audio-specific toolkit&lt;/strong&gt;, not a catch-all converter.&lt;br&gt;
For general media conversions, check out the excellent open-source &lt;strong&gt;VERT&lt;/strong&gt; project (&lt;a href="https://vert.sh" rel="noopener noreferrer"&gt;vert.sh&lt;/a&gt; / &lt;a href="https://github.com/VERT-sh/VERT" rel="noopener noreferrer"&gt;github.com/VERT-sh/VERT&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;If you have any ideas for additional tools, open an issue or just leave a comment here.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Give it a try, bookmark it, or star the repo, every bit helps!&lt;/strong&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/D3SOX/browser-audio-tools" rel="noopener noreferrer"&gt;https://github.com/D3SOX/browser-audio-tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy processing! 🎶&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>My first big open source project with a friend</title>
      <dc:creator>Nico</dc:creator>
      <pubDate>Tue, 01 Jun 2021 22:29:59 +0000</pubDate>
      <link>https://forem.com/d3sox/my-first-big-open-source-project-with-a-friend-5a2</link>
      <guid>https://forem.com/d3sox/my-first-big-open-source-project-with-a-friend-5a2</guid>
      <description>&lt;p&gt;Today I wanted to make a little blog post (also my first one) about my first big open source project.&lt;/p&gt;

&lt;h1&gt;
  
  
  The beginning
&lt;/h1&gt;

&lt;p&gt;It started with me switching full time to Linux. (arch btw)&lt;br&gt;
I was wondering if there was a soundboard for Linux and found that there were no good alternatives to the Windows counterparts.&lt;/p&gt;

&lt;p&gt;Often when I realize something like this I think something like: "How can it be that no one really created this?".&lt;/p&gt;

&lt;p&gt;That combined with the fact that I had been planning to get into C++ for a while, then led me to start the project.&lt;/p&gt;

&lt;h1&gt;
  
  
  First functional version
&lt;/h1&gt;

&lt;p&gt;After a little research I found out that it's fairly easy to implement a soundboard on Linux with PulseAudio modules.&lt;/p&gt;

&lt;p&gt;Here is a screenshot from the first version:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fftmj8w60xlra1trclgcc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fftmj8w60xlra1trclgcc.png" alt="Old version" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wrote it with C++ and Qt5 as widget toolkit. I had a little help from a friend who was still using Windows at the time and is more proficient in C++ than I am.&lt;/p&gt;

&lt;p&gt;It used system calls to the PulseAudio CLI and another CLI program called &lt;code&gt;mpg123&lt;/code&gt; to play the sounds.&lt;/p&gt;

&lt;h1&gt;
  
  
  Collaboration
&lt;/h1&gt;

&lt;p&gt;Then I collaborated with him and made a new version which was a major rewrite and looked like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1sz0553cxkmjdcwcqe3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1sz0553cxkmjdcwcqe3.png" alt="QML Version" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I did most of the UI work with QML and he did the backend stuff. This was also the first version to support Windows with VB-Cable.&lt;/p&gt;

&lt;p&gt;Up until that point the logo looked like this. This was my first attempt on creating a logo using &lt;a href="https://inkscape.org/" rel="noopener noreferrer"&gt;Inkscape&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fir890uuos1pq2fj647du.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fir890uuos1pq2fj647du.png" alt="Old Logo" width="65" height="65"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Next-gen version
&lt;/h1&gt;

&lt;p&gt;At some time we both agreed that we want to change the UI framework again because we were not so happy with QtWidgets and QtQuick.&lt;/p&gt;

&lt;p&gt;When I created the first version I was more into coding with languages like Java, Kotlin and despised JavaScript a bit back then.&lt;br&gt;
However, by then I was a fan of Web development and JavaScript/TypeScript frontend frameworks and we decided to use a web based UI.&lt;/p&gt;

&lt;p&gt;He coded a webview library which uses WebView2 on Windows and Webkit2GTK on Linux. I created the new UI using Vue.js and Vuetify.&lt;/p&gt;

&lt;p&gt;This is how the current version looks like:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82vnbkja5rsjih5jcc2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82vnbkja5rsjih5jcc2b.png" alt="Screenshot" width="800" height="467"&gt;&lt;/a&gt;&lt;br&gt;
(We've come a long way 😮)&lt;/p&gt;

&lt;p&gt;We also created a new logo using &lt;a href="https://www.canva.com/" rel="noopener noreferrer"&gt;Canva&lt;/a&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8647o5pmz75pq6ftzyxj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8647o5pmz75pq6ftzyxj.png" alt="New Logo" width="65" height="65"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  This version also introduces major new features like an integrated downloader and pass-through which can be used as a workaround to share an applications' sound on Linux.
&lt;/h5&gt;

&lt;h1&gt;
  
  
  Closing words
&lt;/h1&gt;

&lt;p&gt;Thank you for reading my post! I've never written a blog article before, so criticism is very much welcome.&lt;/p&gt;

&lt;h1&gt;
  
  
  Links
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;See our &lt;a href="https://soundux.rocks/" rel="noopener noreferrer"&gt;current website&lt;/a&gt; which I created using Nuxt.js + Vuetify&lt;/li&gt;
&lt;li&gt;Our future plans can be found on our &lt;a href="https://github.com/Soundux/Soundux/issues" rel="noopener noreferrer"&gt;GitHub issue page&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>vue</category>
      <category>cpp</category>
    </item>
  </channel>
</rss>
