{"id":49170417,"url":"https://github.com/rororowyourboat/murmur","last_synced_at":"2026-04-22T18:05:08.193Z","repository":{"id":345589378,"uuid":"1185220678","full_name":"rororowyourboat/murmur","owner":"rororowyourboat","description":"Record, transcribe, and summarize meetings locally via PipeWire + FFmpeg. Plugin architecture with faster-whisper, pyannote, and Ollama support.","archived":false,"fork":false,"pushed_at":"2026-03-19T20:31:33.000Z","size":320,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-20T10:39:41.171Z","etag":null,"topics":["cli","ffmpeg","meeting-recorder","pipewire","python","transcription","whisper"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rororowyourboat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-18T11:07:19.000Z","updated_at":"2026-03-19T20:27:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rororowyourboat/murmur","commit_stats":null,"previous_names":["rororowyourboat/murmur"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/rororowyourboat/murmur","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rororowyourboat%2Fmurmur","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rororowyourboat%2Fmurmur/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rororowyourboat%2Fmurmur/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rororowyourboat%2Fmurmur/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rororowyourboat","download_url":"https://codeload.github.com/rororowyourboat/murmur/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rororowyourboat%2Fmurmur/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32148247,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T17:06:48.269Z","status":"ssl_error","status_checked_at":"2026-04-22T17:06:19.037Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","ffmpeg","meeting-recorder","pipewire","python","transcription","whisper"],"created_at":"2026-04-22T18:05:07.473Z","updated_at":"2026-04-22T18:05:08.187Z","avatar_url":"https://github.com/rororowyourboat.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# murmur\n\nRecord system audio from meetings (Zoom, Google Meet, Teams, etc.) on Linux using PipeWire + FFmpeg.\n\n## Why\n\nNo-fuss local meeting recording — hit a keyboard shortcut when a call starts, hit it again when it ends. Audio is saved locally, no cloud services or meeting bots needed.\n\n## Goals\n\n- **Simple toggle workflow** — one shortcut key to start/stop recording, with desktop notifications\n- **Universal** — captures any audio playing through your speakers/headphones, works with any meeting app\n- **Local-first** — recordings stay on disk at `~/Recordings/meetings/`, no uploads\n- **Low overhead** — just FFmpeg recording a PipeWire monitor source\n- **Future: transcription** — pipe recordings through Whisper or a transcription API for searchable meeting notes\n\n## How it works\n\n1. Discovers PipeWire audio sinks via `wpctl`\n2. Attaches to the **monitor source** of your default output device (captures everything you hear)\n3. Records via FFmpeg's PulseAudio input (`pipewire-pulse` compatibility layer)\n4. Saves audio file + JSON metadata (timestamps, source, duration)\n\n## Requirements\n\n- Linux with PipeWire + `pipewire-pulse`\n- FFmpeg\n- `wpctl` (WirePlumber)\n- `notify-send` (for desktop notifications from toggle)\n- Python 3.14+ / uv\n\n## Install\n\n```bash\n# Core only (recording, toggle, watch, devices)\nuv pip install murmur\n\n# With TUI dashboard\nuv pip install murmur[tui]\n\n# With AI summarization (DSPy + LiteLLM)\nuv pip install murmur[ai]\n\n# With transcription (faster-whisper)\nuv pip install murmur[transcribe]\n\n# Everything\nuv pip install murmur[all]\n\n# Or run from the project directory\nuv run murmur --help\n```\n\n## Usage\n\n```bash\n# List audio output devices\nmurmur devices\n\n# Start recording (interactive, Ctrl+C to stop)\nmurmur start\nmurmur start --tag standup --format mp3\n\n# Toggle recording on/off (for keyboard shortcuts)\nmurmur toggle\n\n# Check recording status\nmurmur status\n\n# List saved recordings\nmurmur list\n```\n\n## Meeting detection\n\nMurmur can watch for meeting apps (Zoom, Google Meet, Teams, etc.) using your microphone and notify you — or automatically start recording.\n\n```bash\n# Get notified when a meeting app grabs your mic\nmurmur watch\n\n# Auto-record when a meeting is detected\nmurmur watch --auto-record\n\n# Auto-record with mic input (dual-channel: system left, mic right)\nmurmur watch --auto-record --mic\n\n# Faster polling (default: 5s)\nmurmur watch --interval 3\n```\n\nWorks by polling PipeWire for `Stream/Input/Audio` nodes — detects Chrome, Firefox, Zoom, Teams, Slack, Discord, WebEx, Skype, and more. When the app releases the mic, you get a second notification and auto-recording stops.\n\n## Keyboard shortcut\n\n**Super+Shift+R** toggles recording on/off with a desktop notification.\n\nSet up via GNOME custom shortcuts — runs `murmur toggle` in the background.\n\n## Recordings\n\nSaved to `~/Recordings/meetings/` with naming convention:\n\n```\nmeeting_standup_2026-03-18_14-30-00.flac\nmeeting_standup_2026-03-18_14-30-00.json   # metadata\n```\n\n## Configuration\n\nOptional TOML config at `~/.config/murmur/config.toml`:\n\n```toml\n[recording]\noutput_dir = \"~/Recordings/meetings\"\nformat = \"flac\"\n\n[watch]\ninterval = 3\nauto_record = true\napps = [\"chrome\", \"firefox\", \"zoom\", \"teams\", \"slack\", \"discord\"]\n\n[transcribe]\nauto = true          # auto-transcribe after recording\nmodel = \"base\"       # whisper model size\nlanguage = \"en\"\n\n[summarize]\nauto = true          # auto-summarize after transcription\nmodel = \"llama3\"     # ollama model\nollama_url = \"http://localhost:11434\"\n\n[diarize]\nhf_token = \"hf_...\"  # hugging face token for pyannote\n```\n\n## Plugins\n\n| Plugin | Command | What it does | Install |\n|---|---|---|---|\n| **watch** | `murmur watch` | Detect meeting apps using the mic, notify + auto-record | built-in |\n| **memory** | `murmur memory` | Personal context for LLM summaries | built-in |\n| **tui** | `murmur tui` | Live dashboard with artifact viewer + generation | `murmur[tui]` |\n| **summarize** | `murmur summarize \u003cfile\u003e` | DSPy structured summarization → `.summary.md` | `murmur[ai]` |\n| **transcribe** | `murmur transcribe \u003cfile\u003e` | Whisper transcription → `.txt` + `.srt` | `murmur[transcribe]` |\n| **diarize** | `murmur diarize \u003cfile\u003e` | Speaker diarization → `.rttm` + `.diarized.txt` | `murmur[diarize]` |\n\n## Development\n\n```bash\n# Set up dev environment\nmake install\n\n# Run all checks (lint + format + test)\nmake check\n\n# Individual targets\nmake lint          # ruff check\nmake format        # ruff format (auto-fix)\nmake format-check  # ruff format --check (CI mode)\nmake test          # pytest\nmake fix           # ruff check --fix\n```\n\n## Roadmap\n\n- [ ] Automatic transcription (Whisper local / Deepgram API)\n- [ ] Speaker diarization\n- [x] Auto-detect meeting apps and start recording\n- [ ] Web UI for browsing/searching recordings\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frororowyourboat%2Fmurmur","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frororowyourboat%2Fmurmur","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frororowyourboat%2Fmurmur/lists"}