Voice Notes, a lightweight voice messages plugin (webapp-only, ~70 KB)

Hi everyone,

We use self-hosted Mattermost for our team chat and we wanted voice messages… the original mattermost-plugin-voice has been abandoned since 2022 and doesn’t record on modern servers, so I wrote a new plugin from scratch and we’ve been using it daily.

A few things that might make it interesting:

  • webapp-only (no Go server component), the tarball is ~70 KB
  • MP3 is encoded while you record, so there’s no wait when you stop
  • you can listen and seek before sending, or send directly while recording
  • inline player with the real waveform of the recording, click/drag seek, 1×/1.5×/2× speed
  • it renders posts from the old plugin too (same custom_voice post type)

Recording works on web and desktop (the mobile apps can play the notes as regular MP3 attachments, but plugins can’t record there). MIT licensed, needs MM ≥ 10.

One-line install:

mmctl plugin install-url https://github.com/osbren-corp/mattermost-plugin-voice-notes/releases/latest/download/voicenotes.tar.gz

Feedback and issues are welcome :folded_hands:

Welcome to the Mattermost community, BraisonCrece, and thank you for sharing this plugin with everyone!

Nice work filling a gap that’s been open since 2022, and the webapp-only approach keeping it to ~70 KB is a smart call. Encoding MP3 during recording so there’s no wait on stop is a nice touch too. The backward-compat rendering of the old custom_voice posts is what’ll really help people migrate off the abandoned one. Curious how it handles longer notes memory-wise, and whether Firefox’s MediaRecorder quirks caused you any trouble. Will give it a try.

Thanks, that means a lot. On memory for longer notes, encoding to MP3 on the fly keeps the buffer from ballooning since it’s not holding raw PCM the whole time, though very long recordings still climb, so I chunk them to keep it manageable. And yeah, Firefox’s MediaRecorder was a headache, its mimeType handling differs from Chrome so I had to feature-detect and fall back rather than assume webm/opus. The old custom_voice backward-compat rendering was the whole point really, easing migration. Let me know how the tryout goes!