engenharick109 downloadsRecord voice notes as MP3 and insert the player right where you started recording: in a note, or inside an Excalidraw drawing.
Record a voice note and get a rectangle on your Excalidraw drawing that plays it.
The rectangle shows a self-contained HTML page with the audio inside — generated next to the MP3 and served by a small server the plugin runs on your own machine. It is always stopped: it never plays on its own, and it comes back when you reopen the drawing.
No ffmpeg, no Python, no cloud: the MP3 encoder ships inside the plugin.

One comment per idea, parked on the drawing itself.
Neither Excalidraw nor its plugin can record audio, and even embedding an existing audio file in a drawing is a manual workaround — issue #2278 is still open, and the suggested workaround is to add a card and drop an audio link into it. VoiceComment does that for you, with the recording included: one comment per idea, parked exactly where you were.
Every recording writes two files into your vault folder:
| File | What it is for |
|---|---|
VoiceComment 2026-01-31 18.20.33.mp3 |
the audio itself, usable in any other program |
VoiceComment 2026-01-31 18.20.33.html |
the page the rectangle shows — openable in a browser too |
and one element inside the drawing, which is what makes the rectangle come back.
Two guarantees, added up:
autoplay attribute.autoplayPolicy=document-user-activation-required — the drawing plugin itself requires a user click before any sound.Measured in the app after closing and reopening the drawing: the player comes back with the audio loaded and ready (readyState: 4), at currentTime: 0, paused: true, no autoplay. It only plays when you click it.
Settings → Community plugins → Browse → search "VoiceComment 2.0" → Install → Enable.
Add Engenharick/voicecomment to BRAT.
Download main.js, manifest.json and styles.css from the latest release, put them in <vault>/.obsidian/plugins/voicecomment/, and enable the plugin in Settings → Community plugins.
The plugin deliberately ships no default hotkey, so it never steals a key you already use — assign one in Settings → Hotkeys if you prefer the keyboard.
Two extra commands help when things move around:
| Setting | Description |
|---|---|
| Recordings folder | Vault folder for the MP3 and the HTML. Created if missing. |
| MP3 quality | 64 / 96 / 128 / 192 kb/s, mono. |
| Width / Height | Size of the plotted rectangle (470 × 200 by default). |
| Border colour / Background colour | Colours the drawing paints behind the page. transparent (default) keeps the rectangle colourless. |
| Port | Port of the local server (8781 by default), with a Restart server button. |
| Microphone icon | Show or hide the sidebar icon. |
| Diagnostic log | Opens the plugin log, which records every request the server answers. |
servidor: GET /… .html -> 200 is what proves the page loaded). A port change is the usual cause.microphone → PCM (WebAudio) → lamejs → MP3 ─┬─> <name>.mp3 (in the vault)
└── MediaRecorder ──────┘
└─> <name>.html (audio in base64)
↑
local server 127.0.0.1:8781 (this machine only) serves that folder
↑
an "embeddable" element in the drawing points to http://127.0.0.1:8781/<name>.html
(Excalidraw sends any protocol link to a webview with the no-autoplay policy)
MediaRecorder safety net. If the PCM path delivers nothing — a suspended AudioContext is the classic cause, and the timer keeps running anyway, which is misleading — the compressed capture is decoded with decodeAudioData and re-encoded. A recording is never lost.GET/HEAD, only from 127.0.0.1, and serves only files inside the recordings folder (no ../). Every request is written to the plugin log.powershell -File build.ps1 # main.js = src/lame.min.js + src/audiohtml.js, then installs into the vault
powershell -File build.ps1 -Vault "C:\path\to\vault"
node --check main.js
Checking it with the app open (Obsidian.exe --remote-debugging-port=9333):
node tools\verificar-retangulo.js 9333 "<path\to\an.mp3>" apagar voicecomment
node tools\limpar-teste.js 9333 # if a test died halfway: deletes only zz-teste files
verificar-retangulo.js records through the plugin's real path, plots, checks the server log for the page load, closes and reopens the drawing to prove the rectangle comes back — and deletes only the zz-teste- files it created. With a heavily loaded vault the reopen step can be slow: it fails soft, prints what it measured and still cleans up.
ExcalidrawAutomate API that makes the drawing part possible.LGPL-3.0 — see LICENSE.