omarchy-meeting-recorder README

The project's README from github.com/jankeesvw/omarchy-meeting-recorder. As one markdown file: README.md.

Meeting Recorder

A meeting recorder for Omarchy. It records your microphone and the computer audio as two tracks, and when you stop you get a transcript with speakers, chapters and a player. You can also drop in a recording you already have. Everything is transcribed on your own machine.

No bot joins your call, and no audio leaves your computer. It works with any meeting app, because it simply listens to what your computer plays and what you say.

The done screen in Tokyo Night: chapters on the left, the transcript on the right, a waveform player above it

Open the app, check that both meters move, and press Start recording. When you stop, whisper.cpp transcribes the meeting while a 90s animation keeps you company. You get the transcript with who said what, a player to listen back from any line, and chapters written by the coding agent you already use. Everything takes the colours of your Omarchy theme.

Built for Omarchy on Hyprland (GTK 4 and libadwaita, written in Rust).

Install

Meeting Recorder is in the Omarchy package repository:

yay -S omarchy-meeting-recorder

For now it is in the edge channel, so this works if you run Omarchy's edge packages; everyone else gets it with the next Omarchy release. Until then, this one line builds the same pacman package from the PKGBUILD in this repository (install.sh is ten lines, read it first if you like):

curl -fsSL https://raw.githubusercontent.com/jankeesvw/omarchy-meeting-recorder/main/install.sh | bash

Either way sudo pacman -R omarchy-meeting-recorder-bin removes it again.

Then open Meeting Recorder from the launcher. The first transcription downloads the whisper model (about 1.6 GB, once), and the app shows you how far along it is. It offers to put a live waveform in your bar the first time, and the package prints the Hyprland rules for a floating window (also below).

Prefer to build it yourself? See Build from source, or grab the binary from the latest release.

The transcribing animation: a neon sun over a scrolling grid, the progress bar and the lines as they are recognised, with the speakers' names

What it does

Checks the sound before you start

The app opens ready, not recording. The two meters are live from the start, a still line that thickens as sound comes in, so you can see that both your microphone and the computer audio arrive before the meeting begins. Type a name if you like (otherwise it becomes "Meeting 14:30"), pick the audio format and the transcript language, and press Start recording.

The ready page: meeting name, audio file, language, two meters that say Not recording, the Start recording button and Import an audio file, or drop one here

Records both sides of the call

Your microphone and whatever your computer plays are recorded as two separate tracks. The name, the audio format and the language can all still be changed during the call.

Recording: both meters moving, the clock, Pause and Stop recording  Paused: both waves frozen and dimmed with a PAUSED sign, Resume and Stop recording

Pause freezes both waves under a "❚❚ PAUSED" sign and stops the clock; nothing is written to either track until you press Resume.

Stays out of the way

Press Ctrl+M, or the button in the header bar, and the window shrinks to a strip with only the clock and the two waves. Drag the strip anywhere; the small button on its right, or Ctrl+M again, brings the full window back.

The compact strip: a red dot, the elapsed time, two small waves and an expand button

The bar widget shows the same while you record: a pulsing dot, a small waveform with the mic above the line and the computer audio below it, and the time. Paused it says "paused 01:23", and while the meeting is transcribed it shows the progress. Clicking it brings the recorder window back.

The bar widget recording, paused and transcribing

Transcribes on your own machine

When you stop, the window switches straight to the transcribing animation: it saves the audio, then whisper-rs transcribes the meeting, and the lines type themselves out with the speakers' names as they are recognised. It ends on 100% and DONE, and stays at least ten seconds, also for a short recording. Nothing is sent anywhere.

The transcribing animation at 77 percent with lines from Maya and Tom

Imports any recording

Drop an audio file on the window, or click Import an audio file: a phone memo, a call you recorded elsewhere, anything ffmpeg can read. Pick the language and how many people speak, or leave Speakers on Automatic, and the file is transcribed the same way. Since one file has no second track, the voices themselves are told apart, and each speaker gets a colour from your theme.

Dragging an mp3 from Nautilus onto the window: a dashed border and Drop to import  The Import audio dialog with Language and Speakers set to Automatic

An imported design review: three speakers, each in their own colour

Gives you a transcript you can listen to

The done screen puts the transcript on the right: the time, the speaker and the text in their own columns, one paragraph per turn. Above it sits a player with a waveform of both sides, your side above the line and the other side below it. Click or drag in the waveform to seek, or click any line to play from there. The line that is playing is highlighted and the transcript scrolls along.

On the left: the meeting name and one row per speaker, which you can rename at any time (the folder, the transcript and the manifest follow, and your own name is remembered for next time), the chapters, Copy transcript (also Enter), Open folder, New recording, and the language to transcribe again in.

The done screen while playing: the current chapter selected and the current line highlighted

Lets you fix it where you read it

Hover a line and three buttons appear: edit the text in place, give the line to the next speaker, or delete it. A deleted line comes back with Undo.

Hovering a line: edit, next speaker and delete

Editing a line in place

Chapters by your default agent

When Omarchy has a default coding agent set (omarchy default agent, for instance Claude Code or Codex) and the meeting is three minutes or longer, the agent divides the transcript into chapters once it is done. They show up as a list on the left, as headings in the transcript and as markers on the waveform (hover for the title), and transcript.md gets a ## Chapters list at the top, so a copied transcript carries them too. The Chapters header on the done page makes them again.

Close-up of the chapters list with the current chapter selected

Chapters are an extra, not a requirement: without an agent the button is simply not there and everything else works the same. The agent runs without any tools. It gets the transcript and the instructions, and can only answer with text.

Runs your own actions

Put a few scripts of your own under Actions on the done page: store the transcript in your notes, publish it, mail it around. They go in ~/.config/omarchy-meeting-recorder/config.toml, each with a name for the menu and a command. Until there is one, the button is Add actions… and explains how. See Actions.

Wears your Omarchy theme

The app reads the palette of the current theme (colors.toml): the background, the accent, and the theme's own colours for the speakers, the waves and the animation. Switch themes while it is open and it follows.

The done screen in Tokyo Night, Osaka Jade, Catppuccin Latte, Gruvbox, Kanagawa and Everforest

The done screen on Catppuccin Latte

Keeps your recording safe

If the app quits while it records (a crash, a logout, a power cut), the next start finds the unfinished recording and offers to save it as a meeting, keep it for later, or discard it.

Unfinished recording found, with Save, Later and Discard

Handy to know

What it writes to disk

Every meeting is a plain folder in ~/Documents/Meetings, named <YYYYMMDDHHMM> <name>, so they sort by date:

Nautilus showing four meeting folders

Inside, the audio in the format you picked, the transcript, a .meeting-recorder file that opens the meeting in the app when you double-click it, and (hidden) .tracks, the two separate tracks the app keeps so it can transcribe the meeting again:

The inside of a meeting folder with hidden files shown: audio.ogg, Launch sync.meeting-recorder, transcript.md and .tracks

Both tracks are always recorded separately, and each is levelled to the same speech loudness when it is saved, so a quiet microphone and a loud call end up equally easy to hear. The format can be switched until the moment you press stop.

How it works

The model

The default is whisper's large-v3-turbo. To use another, set it in ~/.config/omarchy-meeting-recorder/config.toml:

model = "small"   # tiny, tiny.en, base, base.en, small, small.en, medium, medium.en, large-v3, large-v3-turbo, or a path to a .bin file

The command-line transcribe and transcribe-file take --model instead. When the configured model is not on disk yet, the start screen says so, with its size, and a Download button:

The banner: The speech model (tiny, 75 MB) is needed to transcribe, with Download

The app looks for ggml-<model>.bin, for instance ggml-large-v3-turbo.bin, in ~/.local/share/omarchy-meeting-recorder/models/. If you use voxtype and it already downloaded that model to ~/.local/share/voxtype/models/, that copy is used. Otherwise it is downloaded (about 1.6 GB for large-v3-turbo) from Hugging Face. Finding speakers downloads the speaker model on first use (about 120 MB) to nemotron-3-diarization/ in the same directory: the int8 ONNX export of Nemotron 3 Diarization from the Hugging Face ONNX community, pinned to one revision. The model is NVIDIA's, under the OpenMDW license. ONNX Runtime is compiled into the binary, so nothing else is needed at runtime.

Actions

Your own scripts, picked from the Actions menu on the done page: store the transcript in Obsidian, publish it, mail it around. Each is a name and a command in ~/.config/omarchy-meeting-recorder/config.toml; the command gets the meeting folder and the meeting's details, and what it prints last shows up in the app, with an Open button for a link.

Clicking Actions on the done page: the view zooms in on the menu with Store transcript in Obsidian and Publish as public transcript

docs/actions.md explains it all, with two complete examples (Store transcript in Obsidian, and Publish as public transcript, where your default agent writes the summary) and a section for your agent, so you can ask it to write actions for you.

Testing

bench/ holds a small test suite: recordings of calls with people talking at once, echo through speakers, two people at one mic, music in the background and silence, plus a real meeting from the AMI corpus. bench/run.py runs the app over them and scores the transcript and the speakers; CI runs it on every pull request and posts the scores there. See bench/README.md.

Privacy

The audio, the transcript and everything else stay on your computer. The only thing that leaves it is the transcript text for the chapters, and only when you have set a default agent: it goes to that agent's service, the one you already chose and pay for. No agent, no chapters, nothing sent. Actions are yours: they send whatever your scripts send, and only when you pick one.

Requirements

Build from source

cargo build --release
ln -s "$PWD/target/release/omarchy-meeting-recorder" ~/.local/bin/omarchy-meeting-recorder
ln -s "$PWD/data/omarchy-meeting-recorder.desktop" ~/.local/share/applications/
mkdir -p ~/.local/share/mime/packages
ln -s "$PWD/data/omarchy-meeting-recorder.xml" ~/.local/share/mime/packages/
update-mime-database ~/.local/share/mime
xdg-mime default omarchy-meeting-recorder.desktop application/x-omarchy-meeting

The last three lines register the .meeting-recorder file type, so a double-click opens the meeting in the app. File managers that go through GIO (Nautilus) pick that up right away; restart Nautilus if it still opens the file as text. xdg-open, which most launchers and terminals use on Hyprland, looks at the contents with file instead and sees JSON, so it opens the file in your text editor. Install perl-file-mimeinfo (yay -S perl-file-mimeinfo) and xdg-open goes by the registered type too.

The default build includes whisper.cpp's Vulkan backend and uses a compatible GPU when available. With no usable GPU it falls back to the CPU. GPU support accelerates speech-to-text; speaker identification still runs on the CPU. Processing time depends on the model, audio and hardware, and can be substantial for long recordings on CPU.

On Arch, the default build needs vulkan-headers and shaderc. The installed binary needs vulkan-icd-loader, plus the Vulkan driver appropriate for your GPU to use acceleration. Existing CPU-only release binaries do not gain GPU support from installing a driver: rebuild or install a release compiled with Vulkan enabled. Restart the recorder after replacing its binary, once any recording or processing has finished.

For a CPU-only binary without Vulkan build or runtime dependencies:

cargo build --release --no-default-features

To check which support was compiled into a binary:

omarchy-meeting-recorder --version

This reports build support, not whether a particular transcription actually ran on a GPU. The vulkan feature remains available explicitly for build scripts using --no-default-features --features vulkan.

The window floats nicely with a Hyprland rule on its class:

o.window("^com\\.jankeesvw\\.OmarchyMeetingRecorder$", { float = true })
o.window("^com\\.jankeesvw\\.OmarchyMeetingRecorder$", { size = { 480, 700 } })
o.window("^com\\.jankeesvw\\.OmarchyMeetingRecorder$", { center = true })

Bar widget

The plugin directory is an Omarchy Quattro bar widget. It stays hidden until a recording starts. Installed as a package, the app offers to add it the first time you open it. From source, link it yourself:

ln -s "$PWD/plugin" ~/.config/omarchy/plugins/jankeesvw.meeting-recorder
omarchy-shell shell rescanPlugins
omarchy plugin enable jankeesvw.meeting-recorder
omarchy bar move jankeesvw.meeting-recorder --section right

The shell discovers plugins asynchronously. If enabling immediately after a rescan says the plugin is not known, wait until omarchy-shell shell listPlugins includes jankeesvw.meeting-recorder, then run:

omarchy plugin enable jankeesvw.meeting-recorder --section right

This also recovers a failed first-start “Add to Bar” attempt in version 1.0.2, which leaves the widget linked but does not offer again on restart.

Command line

Command What it does
omarchy-meeting-recorder Open the recorder, ready to record
omarchy-meeting-recorder <folder or .meeting-recorder file> Open a saved meeting on the done page
omarchy-meeting-recorder start Start recording in the open window, for a keybinding
omarchy-meeting-recorder pause Pause or resume the running recording
omarchy-meeting-recorder stop Stop the running recording
omarchy-meeting-recorder compact Switch the recording window between full and compact
omarchy-meeting-recorder new-window Open another window, or the app when it is not running
omarchy-meeting-recorder watch Stream the recorder state as NDJSON, for the bar widget
omarchy-meeting-recorder transcribe <mic> <computer> [--language xx] [--model name] Transcribe two tracks and print the transcript as Markdown
omarchy-meeting-recorder transcribe-file <audio> [--speakers N] [--language xx] [--model name] Transcribe one file, telling the voices apart, and print the transcript as Markdown
omarchy-meeting-recorder ask "<prompt>" < text Run a prompt over stdin through the default agent, without tools (ask --agent shows which agent that is)
omarchy-meeting-recorder action "<name>" <meeting folder> Run one of your actions on a meeting, as the done page does; without arguments it lists them

For example:

omarchy-meeting-recorder transcribe mic.ogg computer.ogg --language en > transcript.md
omarchy-meeting-recorder transcribe-file interview.mp3 --speakers 2 > transcript.md

Any format ffmpeg can read works. --language takes auto (the default), en, nl, de, fr, es, it or pt.

The screenshots

The meetings in the screenshots and clips are invented and were voiced with piper. demo/ has the scripts and a step-by-step guide to shoot them again.

License

MIT

omarchy-meeting-recorder (jankeesvw/omarchy-meeting-recorder)

Searching Database…

What is this?Meeting Recorder is a desktop app for Omarchy that records your microphone and computer audio as two separate tracks, then produces a transcript with speaker labels, chapters and a built-in player.
Is this a general Linux audio tool or specific to one setup?It's a native GTK 4/libadwaita desktop app written in Rust, built specifically for the Omarchy Linux distribution running Hyprland, not a generic cross-distro recorder.
What does it need to run, besides Omarchy itself?It needs the Omarchy/Hyprland desktop environment, and the first transcription downloads the whisper large-v3-turbo model (about 1.6 GB) once; chapters additionally need a coding agent like Claude Code or Codex configured as Omarchy's default agent.
Is it ready to install right now?It currently ships only through Omarchy's edge channel, so non-edge users have to wait for the next Omarchy release or build it manually from the PKGBUILD in the meantime.
Does it work on any Linux desktop, or only Omarchy?It's built exclusively for Omarchy on Hyprland; there's no indication it supports other Linux distributions or desktop environments.
What platform does it run on?Linux only, specifically the Omarchy distribution running the Hyprland Wayland compositor.
Does any audio or transcript data leave my machine?No. Recording, transcription and speaker diarization all run locally; nothing is uploaded anywhere.
How does it tell speakers apart in an imported recording that has no second track?For imported single-track files it runs NVIDIA's Nemotron 3 Diarization locally via ONNX Runtime, which can separate up to eight speakers even when they talk over each other, and auto-detects or lets you fix the speaker count.
How does the chapter feature work?If Omarchy has a default coding agent set (like Claude Code or Codex) and the meeting is at least three minutes, the recorder runs that agent headlessly with all tools disabled to split the transcript into chapters shown in the sidebar, transcript headings and waveform markers.
Can I fix mistakes in the transcript?Yes, hovering a line lets you edit the text in place, reassign it to another speaker, or delete it (with undo), directly in the done screen.
What happens to my recordings if the app crashes mid-meeting?Both audio tracks are continuously written to a cache directory while recording, so on the next launch the app finds the unfinished recording and offers to save, keep, or discard it.
Creator
jankeesvw
Size
20.3 MB
Stars
388
Age
23d
Commits · 90 Days