This is the full developer documentation for Loofah # Loofah > A local-first knowledge vault for notes, meetings, transcripts, and agent-created research. [Download for macOSApple Silicon · Signed and notarized↓](https://github.com/bart6114/loofah/releases/download/updater/Loofah_latest_aarch64.dmg) Loofah started as the meeting notetaker I wanted: local transcription, ordinary files, and no service getting between me and my notes. It has since become the place where I keep more of my working knowledge. A session can start as a recorded meeting, an imported recording or transcript, a note you write, or Markdown an agent creates from another tool. That means research, project context, decisions, and useful material from elsewhere can live beside meeting notes in one searchable vault. Agents can create sessions, add to notes, tag them, and attach source files through the CLI without editing vault internals. The app still records your microphone and system audio without sending a bot into the call. It’s [free as in beer 🍺](https://en.wikipedia.org/wiki/Gratis_versus_libre): there is no account, subscription, cloud backend, or telemetry. Your vault stays on your Mac and remains useful outside the app. If you want generated summaries, connect your own hosted provider or a local model. [Try your first meeting](/quickstart)Install the app, download a transcription model, and make a short test recording. [Record a meeting](/meetings)Create a note and click Record. [Build your knowledge vault](/notes)Keep standalone notes, research, meeting context, and agent-created material together. [Connect an agent](/agents/overview)Search the vault and store useful work through local interfaces. ## Common questions [Section titled “Common questions”](#common-questions) [Can I use it offline?](/offline)Yes. Download the models before you disconnect. [Where is my data?](/data-and-privacy)Notes, transcripts, and attachments are stored as files in your local vault. [Can I import a recording?](/import-recordings)Import audio, SRT, or VTT files. [Can I change the summary?](/customize-summaries)Use a template or edit the Auto prompt. [See all common questions →](/help) ## A meeting workflow [Section titled “A meeting workflow”](#a-meeting-workflow) 1. Create a note. 2. Click **Record**. 3. Write anything you want to remember in **Memos**. 4. Click **Stop listening** and review the transcript. 5. If you configured Intelligence, review the generated summary. Note For a quick check, open the **Welcome to Loofah** note, click **Record**, and say a few sentences. For work that does not start with a meeting, create a standalone note in the app or ask an agent to store its result with `loofah sessions new`. See [Notes and knowledge](/notes) and [Agent access](/agents/overview). # CLI for agents > Use loofah to search the local knowledge vault and create notes from agent work or external sources. Pass the global `--json` flag when software consumes CLI output. A successful response contains `schema_version`, `command`, `data`, and, for paginated commands, `pagination`. ## Find the session first [Section titled “Find the session first”](#find-the-session-first) ```bash loofah --json sessions list --query "weekly planning" --limit 10 loofah --json sessions get SESSION_ID ``` List filtering matches titles and IDs without regard to case. For full-text search across notes, summaries, and transcripts, use `sessions search`. If several sessions match the user’s request, ask which one they mean. ## Read only what you need [Section titled “Read only what you need”](#read-only-what-you-need) ```bash loofah --json sessions note SESSION_ID --kind note loofah --json sessions note SESSION_ID --kind summary ``` Use `sessions get` when you also need metadata or action items. ## Transcripts [Section titled “Transcripts”](#transcripts) ```bash loofah --json sessions transcript SESSION_ID ``` This returns the complete speaker-labeled transcript in one response. Transcripts can be large, so do not request one unless the task needs it. ## Check the setup [Section titled “Check the setup”](#check-the-setup) ```bash loofah --json doctor ``` The report includes the CLI version, a `ready` flag, the resolved vault path, path health, and the number of sessions. It exits with status 1 when `ready` is false, while still writing the report to standard output. For a non-default vault, use `--vault-path DIR` or `LOOFAH_VAULT_PATH`. ## Store agent work [Section titled “Store agent work”](#store-agent-work) ```bash loofah --json sessions new --title "Weekly planning" --note notes.md --author claude-code loofah --json sessions new --title "Research: payment providers" --note research.md --tag research --author claude-code --skill research-assistant loofah --json sessions note SESSION_ID --append notes.md loofah --json sessions attach SESSION_ID source-deck.pdf loofah --json import recording.m4a --transcribe --author claude-code loofah --json transcribe SESSION_ID ``` `sessions new` creates a session and prints its ID; `--note` seeds the note body from a file or stdin (`-`). The session can stand alone as a note, with no recording or transcript. This lets an agent store a research brief, extracted deck insights, project context, or other useful output from any source it is authorized to access. The agent performs the source integration and supplies Markdown; `loofah` provides the stable write path into the vault. `sessions note --set` replaces the note body and `--append` extends it; both also accept `-` for stdin. `sessions attach` stores a source artifact beside the note. `import` creates a session from an audio file, and `--transcribe` chains on-device transcription. `transcribe` replaces the session’s existing transcript, so run it only when the user wants that. **Always pass `--author ` when creating a session** (`sessions new`, `import`) — it marks the note as not written by the vault owner, and the app surfaces that. Use one stable name, such as `claude-code`. When a reusable skill produced the result, also pass `--skill `. Write your own notes as new sessions; when editing an existing note, never change its authorship. Only store content when the user asks. Respect the permissions and privacy boundary of the source tool, and do not send vault content elsewhere merely to re-import it. Note On-device transcription requires macOS on Apple Silicon and the on-device Soniqo model configured in the desktop app. The CLI never downloads models — open the desktop app once to download it. ## Export only when asked [Section titled “Export only when asked”](#export-only-when-asked) ```bash loofah sessions export SESSION_ID --format markdown --output session.md loofah sessions export SESSION_ID --format json --output session.json ``` Export refuses to replace an existing file. Pass `--force` only when the user has approved overwriting that exact path. See the [CLI reference](/reference/cli) for the full command contract. # MCP for agents > Connect an MCP client to the local knowledge vault over stdio. The MCP server is part of the `loofah` executable. It communicates through standard input and output. It does not open a network port or send vault data to a hosted service. It is read-only: to create sessions, edit notes, attach source artifacts, or import and transcribe audio, use the [CLI](/reference/cli). The MCP tool names retain `meeting` for compatibility, but they can also return standalone knowledge sessions that have no recording or transcript. ## Configure a client [Section titled “Configure a client”](#configure-a-client) ```json { "mcpServers": { "loofah": { "command": "loofah", "args": ["mcp"] } } } ``` Use the absolute path to `loofah` if the client cannot find it on `PATH`. Restart the client after changing its MCP configuration. For a custom vault path: ```json { "mcpServers": { "loofah": { "command": "loofah", "args": ["--vault-path", "/path/to/vault", "mcp"] } } } ``` ## Recommended order [Section titled “Recommended order”](#recommended-order) Start with `list_meetings` or `search_meetings`. Pass a returned `id` to `get_meeting`. Call `get_meeting_transcript` only if the meeting detail does not contain enough evidence. `get_meeting_transcript` returns the complete transcript as `[HH:MM:SS] Speaker: ...` lines. See the [MCP reference](/reference/mcp) for exact parameters and resource URIs. # Agent access > Let agents search your local knowledge vault and store useful work through the CLI. Loofah has two local interfaces for agents. Both work on the same knowledge vault. MCP is read-only; the CLI can also create and edit sessions. A session may be a recorded meeting or a standalone note containing research, decisions, project context, or material brought in from another tool. | Interface | Use it when | Output | | --------- | ------------------------------------------- | ----------------------------------------------- | | MCP | The client can run a local stdio MCP server | Structured tool results and resources | | CLI | The agent can run shell commands | JSON with `--json`, or readable terminal output | ## A reliable workflow [Section titled “A reliable workflow”](#a-reliable-workflow) 1. List recent sessions or search with a short phrase. 2. Take the session ID from the result. Do not guess it. 3. Read session details before fetching a transcript. 4. Fetch the transcript only when the notes and summaries are not enough. 5. When the user asks to keep new work, create a session with clear authorship, useful tags, and the source artifact when appropriate. MCP is usually easier for reading because the client receives tool schemas directly. Use the CLI when MCP is not available, or when the task needs to create or edit a session — MCP cannot write. Every vault also carries a copy of the [vault guide for agents](/agents/vault/) at its root as `AGENTS.md`, so agents that land in the folder without this documentation still learn the layout and the rules. ## What each interface can write [Section titled “What each interface can write”](#what-each-interface-can-write) Use these interfaces instead of crawling the vault. They apply the same rules for canonical notes, summaries, speaker names, and transcript rendering. MCP cannot write: no MCP tool creates or edits a note, action item, or session. The CLI can: `sessions new` creates a standalone note, `sessions note --set` and `--append` edit a note body, `sessions attach` keeps a source file with the note, `import` turns an audio file into a new session, and `transcribe` replaces a session’s transcript. `sessions export` writes only to the file you pass with `--output`, and replaces an existing file only when `--force` is passed. Agents creating sessions must always pass `--author ` so the note is marked as not written by the vault owner. ## Bring knowledge in from other tools [Section titled “Bring knowledge in from other tools”](#bring-knowledge-in-from-other-tools) The CLI is intentionally source-agnostic. If an agent is authorized to read a document, research result, issue tracker, knowledge service, or generated deck, it can turn the useful content into Markdown and store it as a new session. There is no separate importer to build for every source. For example, after researching a topic or extracting the important findings from a deck, an agent can run: ```bash loofah --json sessions new --title "Research: customer onboarding" --note findings.md --tag research --author claude-code loofah --json sessions attach SESSION_ID onboarding-research.pdf ``` This keeps the synthesized note searchable while preserving the source artifact beside it. The agent must still follow the source tool’s permissions and should only write when the user asks it to. [Use the CLI](/agents/cli)Run commands with JSON output. [Use MCP](/agents/mcp)Connect a local stdio server. # Loofah skill > Install the repository skill that teaches agents to use loofah safely. The public skill gives compatible agents a simple workflow: 1. Use connected Loofah MCP tools for reading when available. 2. Fall back to `loofah --json` when MCP is unavailable. 3. Resolve session IDs from list or search results. 4. Read session details before requesting the full transcript. 5. Write only through the CLI — create standalone knowledge notes, edit note bodies, attach source artifacts, import audio, and transcribe it — because the MCP server is read-only. 6. Never crawl or modify vault files directly. ## Source [Section titled “Source”](#source) The maintained package is [`skills/loofah`](https://github.com/bart6114/loofah/tree/main/skills/loofah). It includes references for setup, CLI commands, MCP tools, and errors. ## Install it [Section titled “Install it”](#install-it) For an agent that loads skills from the filesystem, copy the complete `skills/loofah` directory into that agent’s skills directory. Keep the directory name `loofah` so its relative links continue to work. Note Skill locations differ between clients. Follow your agent’s installation instructions and copy the whole directory, not just `SKILL.md`. The skills under `.agents/skills` are contributor workflows for this repository. They are not part of the public `loofah` skill. # Vault guide for agents > The standing AGENTS.md every vault carries: what Loofah is, how the vault is structured, and how to work with it. Loofah (loofah) is a local-first knowledge and note-taking app that began with meeting transcription. Its **vault** can hold recorded meetings, standalone notes, imported material, and work an agent creates from other authorized sources. The vault is a plain folder of Markdown and JSON files and the only source of truth — there is no database or cloud copy. A copy of this page is kept at the vault root as `AGENTS.md`. Full, current documentation lives at — machine-readable indexes at and . ## Vault structure [Section titled “Vault structure”](#vault-structure) ```text / AGENTS.md this file (auto-regenerated) config.json app configuration settings.json app settings tags.json tasks.json people.json events.json calendars.json templates/ humans/ organizations/ .trash/ soft-deleted files, kept by date; recoverable sessions// one session per directory; may be a meeting or standalone note _meta.json identity + metadata; its presence marks a session notes.md the user's note (legacy vaults: _memo.md) transcript.json speaker-labeled transcript tasks.json session tasks audio.mp3|wav|ogg the recording, with audio.peaks.json waveform cache enhanced/.md AI-generated documents (summaries) attachments/ files embedded in the note ``` Ownership rules: * Inside a session directory the app owns exactly the names above. **Any other file is a user attachment: leave it alone**, and never claim unknown files as app content. * Dot-prefixed files (`.tmp-*`, `.DS_Store`, `.trash/`) are never content. * Do not create or rename files under the app-owned names; use the CLI to write. ## Authorship [Section titled “Authorship”](#authorship) `_meta.json` may carry an optional `author` field. When it is absent the note was written by the vault owner; when set (a free-form name such as `claude-code`) the note was written by someone else, and the app marks it as not written by the owner. Next to `author`, an optional `skill` field records the skill (a named, reusable instruction set such as `meeting-summarizer`) the author ran to produce the note, if any. Rules for agents: * **Always pass `--author ` when creating a session** with `loofah sessions new` or `loofah import`. Pick one stable name (for example `claude-code`) and keep using it. * **If a skill produced the note, also pass `--skill `** so the session records which skill was used. Use the skill’s stable name; omit the flag when no skill was involved. * Write your own notes as **new** sessions with `--author` set. When asked to edit an existing note, never add, change, or remove its `author` or `skill` — editing the owner’s note does not make it yours. ## Reading session data [Section titled “Reading session data”](#reading-session-data) Use Loofah’s typed, read-only interfaces for session data. Do not use `find`, `grep`, `rg`, filesystem crawling, or direct SQLite queries to find or read sessions. Prefer the loofah MCP tools when they are available: * `list_meetings` to resolve a session ID * `get_meeting` for notes, summaries, and action items * `get_meeting_transcript` for the full speaker-labeled transcript The MCP tool names retain `meeting` for compatibility even when the session is a standalone note. If MCP is unavailable, use the loofah CLI with `--json`: (`meetings` is a compatibility alias for `sessions` while deprecation is phased in.) ```sh loofah --json sessions list --query "planning" loofah --json sessions get SESSION_ID loofah --json sessions transcript SESSION_ID ``` The CLI discovers Loofah’s vault from the platform application-data directory, following the `vault_path` redirect in its `global.json` when the vault has been relocated. Use `--vault-path ABSOLUTE_VAULT_DIR` only when the user explicitly provides a non-default vault path; do not crawl the filesystem to find one. Never guess a session ID. Fetch a transcript only when notes and summaries do not contain the needed context. ## The loofah CLI [Section titled “The loofah CLI”](#the-loofah-cli) Run `loofah doctor` first to verify the CLI can reach the vault (it also repairs a missing or stale `AGENTS.md`). Always pass `--json` for machine-readable output. | Command | Purpose | | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | `doctor` | Check CLI and vault access without changing data. | | `sessions list` | List sessions, optionally filtered with `--query`. | | `sessions search` | Full-text search across titles, notes, summaries, and transcripts. | | `sessions get` | Metadata, note, summaries, and action items for one session. | | `sessions new` | Create a standalone note and print its id; pass `--author` when writing as an agent, plus `--skill` when a skill produced the note. | | `sessions note` | Show a session’s note, or edit it with `--set` / `--append`. | | `sessions transcript` | The full speaker-labeled transcript. | | `sessions tag add` | Add tags to a session, registering new ones in the vault. | | `sessions tag remove` | Remove tags from a session. | | `sessions path` | Print the absolute path of a session directory. | | `sessions attach` | Store a file as a note attachment and print its id. | | `sessions export` | Export a session to Markdown or JSON. | | `import` | Import an audio file as a new session or into an existing one. | | `transcribe` | Transcribe a session’s audio with the configured on-device model. | | `mcp` | Run the read-only MCP server over stdio. | | `tags list` | List every tag registered in the vault. | Per-command flags are documented at . # CLI reference > Commands and global options available in the Loofah CLI. ## Global syntax [Section titled “Global syntax”](#global-syntax) ```text loofah [--base DIR] [--vault-path DIR] [--json] ``` | Option | Environment variable | Behavior | | ------------------ | -------------------- | -------------------------------------------------------------- | | `--base DIR` | `LOOFAH_BASE` | Use `DIR` as the vault directory. | | `--vault-path DIR` | `LOOFAH_VAULT_PATH` | Use an explicit vault directory. | | `--json` | None | Emit a versioned JSON response or machine-readable JSON error. | `--vault-path` takes precedence over `--base`. Without either option, the CLI uses Loofah’s platform application-data directory, following the `vault_path` redirect in its `global.json` when the vault has been relocated. ## Session commands [Section titled “Session commands”](#session-commands) `meetings` remains a compatibility alias for `sessions`. Plain-text invocations emit a deprecation warning when the alias is used; `--json` output remains machine-readable. | Command | Options | Result | | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `sessions list` | `--query TEXT`, `--limit 1..200`, `--offset NUMBER`, `--tag NAME`, `--untagged` | Meetings ordered by the application query layer. Defaults to 20 results. `--tag` filters to meetings carrying that tag (case-insensitive); repeatable, and all given tags must match. `--untagged` keeps only meetings without tags and cannot be combined with `--tag`. Each meeting’s JSON includes its normalized `tags`. | | `sessions search [QUERY]` | `--speaker TEXT`, `--kind title\|note\|summary\|transcript`, `--limit 1..50`, `--offset NUMBER` | Full-text hits across titles, notes, summaries, and transcript words, newest meetings first. Requires a query and/or `--speaker`; `--speaker` limits hits to meetings where that person spoke. `--kind` is repeatable and defaults to all. | | `sessions get ID` | None | Metadata, canonical note, summaries, and action items. | | `sessions new` | `--title TEXT` (required), `--note FILE`, `--created-at RFC3339`, `--started-at RFC3339`, `--ended-at RFC3339`, `--tag NAME`, `--author NAME`, `--skill NAME` | Creates a meeting note in the vault and prints its id. `--note` seeds the note body from `FILE`, or from stdin when `FILE` is `-`. `--created-at` backdates the meeting on the timeline and in its folder name — useful when importing historical notes; `--started-at` and `--ended-at` set the meeting’s start and end. All three take an RFC 3339 timestamp such as `2024-05-01T09:00:00Z` (offsets are normalized to UTC); invalid values are rejected before anything is written. `--tag` is repeatable and both tags the meeting and registers new tags in the vault’s tag list. `--author` records who wrote the note in the meeting’s metadata; when writing on behalf of someone other than the vault owner (an agent, for example `claude-code`), always set it — the app marks such meetings as not written by the owner. Left unset, the note counts as the vault owner’s own. `--skill` additionally records the skill used to produce the note (for example `meeting-summarizer`); it requires `--author` and is omitted when no skill was involved. | | `sessions note ID` | `--kind note\|summary\|all`, `--set FILE`, `--append FILE` | The selected note documents. Defaults to `note`. With `--set` or `--append` (mutually exclusive, and incompatible with `--kind`), replaces or extends the note body from `FILE` or stdin (`-`); fails when the meeting does not exist. | | `sessions transcript ID` | None | The full transcript as `[HH:MM:SS] Speaker: ...` lines, one per speaker turn. | | `sessions tag add ID TAG...` | None | Adds one or more tags to the meeting and registers new ones in the vault’s tag registry. Tags are normalized (trimmed, `#` stripped, lowercased) and stored deduplicated and sorted; adding a tag the meeting already has is a no-op. Prints the meeting’s resulting tag list. | | `sessions tag remove ID TAG...` | None | Removes one or more tags from the meeting. Removing an absent tag is a no-op, and removed tags stay in the vault’s tag registry. Prints the meeting’s resulting tag list. | | `sessions path ID` | None | Prints the absolute path of the meeting’s session directory. | | `sessions attach ID FILE` | `--name NAME` | Stores `FILE` as a note attachment of the meeting and prints the resulting attachment id. `--name` overrides the stored filename (defaults to the file’s name). Notes reference attachments as `![alt](attachments/)` with the id URL-encoded; the printed attachment id is authoritative — it may differ from the input name when an existing attachment of the same name forces a deduplicated one. | | `sessions export ID` | `--format markdown\|json`, `--output FILE`, `--force` | A complete meeting export, including transcripts. Defaults to Markdown on stdout. Existing files require `--force`, which is only valid together with `--output`. | ## Tags command [Section titled “Tags command”](#tags-command) ```bash loofah tags list ``` Lists every tag registered in the vault’s `tags.json`, one name per line (`--json` returns each tag’s `id` and `name`). The registry is append-only: tags stay listed after the last meeting carrying them loses the tag. ## Import command [Section titled “Import command”](#import-command) ```bash loofah import recording.m4a --title "Weekly sync" loofah import recording.m4a --transcribe loofah import recording.m4a --into MEETING_ID ``` Creates a meeting from an audio file and prints its id. The audio is converted to the vault’s 16 kHz MP3 format, exactly as the desktop app’s import does, so a running app picks the meeting up automatically. Accepts `wav`, `mp3`, `ogg`, `mp4`, `m4a`, `flac`, `webm`, and `aac` files; `--title` defaults to the audio file’s name. `--created-at`, `--started-at`, and `--ended-at` take RFC 3339 timestamps (normalized to UTC, rejected before anything is written when invalid) and set the new meeting’s metadata — `--created-at` backdates it on the timeline and in its folder name, which is what you want when importing a historical recording. `--author NAME` records who created the meeting; agents importing on a user’s behalf should always set it, and `--skill NAME` additionally records the skill used, if any (see `sessions new`). Because they describe a new meeting, all of these are rejected together with `--into`. With `--into MEETING_ID`, the audio is imported into that existing meeting instead of creating a new one — for example a note created earlier with `sessions new`. The meeting keeps its title (`--title` is rejected together with `--into`), and the command fails without touching anything when the meeting does not exist or already has a recording; the CLI never replaces existing audio. With `--transcribe`, the imported audio is transcribed immediately (see the transcribe command below). When transcription fails after a successful import, the command still reports the meeting id — plain output prints the id, `--json` adds a `transcript_error` object to `data` — and exits non-zero. ## Transcribe command [Section titled “Transcribe command”](#transcribe-command) ```bash loofah transcribe MEETING_ID ``` Transcribes the meeting’s audio recording on-device with the speech-to-text model configured in the desktop app and replaces the meeting’s transcript, exactly as the app’s own batch transcription does. Prints the new transcript id (`--json` returns the meeting id plus a `transcript` object). Progress is written to stderr. The app’s audio retention setting is honored: with retention set to “none”, the recording is deleted as soon as the transcript is saved, just like in the app. The command fails with a clear message and a non-zero exit code when the meeting or its audio is missing, when no speech-to-text model is configured, when the configured provider or model is not supported by the CLI (only on-device `soniqo-*` models are), or when the model has not been downloaded yet — the CLI never downloads models, so open the desktop app once to download it. On-device transcription requires macOS on Apple Silicon. ## JSON response contract [Section titled “JSON response contract”](#json-response-contract) Successful `--json` responses contain: | Field | Meaning | | ---------------- | -------------------------------------------------- | | `schema_version` | CLI JSON contract version. Currently `1`. | | `command` | Stable command identifier such as `meetings.list`. | | `data` | Command result. | | `pagination` | Page metadata when the command is paginated. | Pagination includes `offset`, `limit`, `returned`, optional `total`, and optional `next_offset`. ## Doctor command [Section titled “Doctor command”](#doctor-command) ```bash loofah --json doctor ``` Checks the resolved vault path and read access to its sessions without changing meeting data. It exits with status 0 when `ready` is true and status 1 when `ready` is false. Inside a vault it also restores the root [`AGENTS.md` agent guide](/agents/vault/) when the file is missing or stale. ## MCP command [Section titled “MCP command”](#mcp-command) ```bash loofah mcp ``` Starts the read-only MCP server over stdio. Do not write other output to the server’s stdout. ## Help and version [Section titled “Help and version”](#help-and-version) ```bash loofah --help loofah sessions --help loofah sessions list --help loofah --version ``` # Errors and exit codes > Interpret CLI failures by exit code and error code, and recover safely. Without `--json`, CLI errors are written to standard error as human-readable text beginning with `error:`. With `--json`, errors contain `schema_version` and an `error` object with `code`, `message`, and `exit_code`. | Exit code | Error code | Meaning | Recovery | | --------- | ------------------ | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | `0` | None | Success | Consume stdout. | | `1` | `operation_failed` | Vault read, write, or transcription failure, an unsupported import format, or an unhealthy `doctor` report | Check the reported action or inspect the diagnostic report and confirm app and CLI compatibility. | | `2` | `not_found` | Meeting, audio file, or other requested data not found | List meetings again and use a returned ID, or verify the file path you passed. | | `3` | `vault_not_found` | Vault not found at the resolved path | Start Loofah once or pass `--vault-path`. | | `4` | `output_exists` | Export output already exists | Choose another path or explicitly pass `--force` to replace the file. | Invalid arguments use the `invalid_arguments` error code with Clap’s nonzero exit code. MCP reports missing meetings as invalid parameters. Vault and serialization failures are internal MCP errors. Never recover by editing vault files directly; go through the CLI’s write commands or the desktop app. When a write command fails after creating a meeting, the error names the new meeting id — finish the job against that id instead of retrying from scratch (for example `loofah sessions note ID --set` after a failed note write, or `loofah transcribe ID` after a failed `import --transcribe`). The MCP server remains read-only. # MCP reference > Tools, resources, limits, and transport details exposed by Loofah MCP. Run the server with `loofah mcp`. It uses the MCP `2024-11-05` protocol over stdio. Every tool is read-only, non-destructive, idempotent, and local-only. ## Tools [Section titled “Tools”](#tools) ### `list_meetings` [Section titled “list\_meetings”](#list_meetings) | Parameter | Type | Default | Notes | | ---------- | ------- | ------- | ------------------------------------------------------------------ | | `query` | string | None | Case-insensitive title or meeting ID substring. | | `limit` | integer | `20` | Clamped to `1..200`. | | `offset` | integer | `0` | Number of results to skip. | | `tags` | array | None | Only meetings carrying every one of these tags (case-insensitive). | | `untagged` | boolean | `false` | Only meetings without any tags. Cannot be combined with `tags`. | Each returned meeting includes its normalized `tags`, its `author` (`null` when the vault owner wrote the note; otherwise the name of the agent or other writer that created it), and its `skill` (`null` unless a skill was used to produce the note). ### `search_meetings` [Section titled “search\_meetings”](#search_meetings) Full-text search across meeting titles, notes, summaries, and transcript words. At least one of `query` and `speaker` is required. | Parameter | Type | Default | Notes | | --------- | ------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `query` | string | None | Case-insensitive terms; every whitespace-separated term must occur. | | `speaker` | string | None | Person ID or name substring. Limits results to meetings where that person spoke; the query matches anywhere in those transcripts. Without `query` it lists those meetings. | | `kinds` | array | all | Any of `title`, `note`, `summary`, `transcript`. Ignored when `speaker` is set. | | `limit` | integer | `20` | Clamped to `1..50`. | | `offset` | integer | `0` | Number of hits to skip. | Hits are ordered by meeting recency and carry `meeting_id`, `kind`, and a `snippet` around the first match. Transcript hits add the resolved `speaker`, `speaker_id`, and `start_ms`, which lines up with the `[HH:MM:SS]` timestamps in `get_meeting_transcript`’s text. At most three transcript hits per meeting are returned. ### `get_meeting` [Section titled “get\_meeting”](#get_meeting) Accepts required string `meeting_id`. Returns meeting metadata (including its normalized `tags`, its `author` — `null` for the vault owner’s own notes — and its `skill`, `null` unless a skill produced the note), the canonical note, summaries, and action items. Transcript words are intentionally separate. ### `get_meeting_transcript` [Section titled “get\_meeting\_transcript”](#get_meeting_transcript) | Parameter | Type | Default | Notes | | ------------ | ------ | -------- | ----------------------------- | | `meeting_id` | string | required | A returned Loofah meeting ID. | Returns `meeting_id` and `text`. The text uses one `[HH:MM:SS] Speaker: ...` line per speaker turn, timed from the start of the meeting. Speaker names come from the people registry, and unknown voices fall back to `Speaker N`. Word-level detail, including IDs, timestamps, and channels, is available through `loofah sessions export --format json`. ## Resources [Section titled “Resources”](#resources) | URI | MIME type | Content | | ------------------------------------------- | --------------- | --------------------------------------- | | `loofah://meetings/{meeting_id}` | `text/markdown` | Meeting detail without transcript text. | | `loofah://meetings/{meeting_id}/transcript` | `text/plain` | The full speaker-labeled transcript. | Resource listing returns recent meeting resources in pages of 20. Its cursor is a numeric result offset. Previously issued `fmtr://meetings/...` resource URIs remain readable for client compatibility; new resource listings use `loofah://`. # Install the CLI > Install loofah and connect it to your local vault. The `loofah` executable contains both the command-line interface and the MCP server. ## Install with one command [Section titled “Install with one command”](#install-with-one-command) On macOS or Linux, run: ```bash curl -fsSL https://loofah.io/install.sh | bash ``` The script downloads the latest release binary for your platform, verifies its checksum, and installs it to `~/.local/bin/loofah`. It also installs `fmtr` as a compatibility alias for existing scripts and MCP configurations. It never asks for `sudo`. Set `LOOFAH_INSTALL_DIR` to install somewhere else; the previous `FMTR_INSTALL_DIR` name remains accepted. Supported platforms: * macOS on Apple Silicon and Intel * Linux on x86\_64 and arm64 (glibc 2.35 or newer — Ubuntu 22.04, Debian 12, RHEL 9, or later; musl-based distributions such as Alpine are not supported) Note On-device transcription (`loofah transcribe`) runs only on Apple Silicon Macs. Every other command and the MCP server work on all supported platforms. To upgrade, re-run the script. To uninstall, delete the binary: ```bash rm ~/.local/bin/loofah ~/.local/bin/fmtr ``` If the install directory is not on `PATH`, the script adds it to your shell profile (`~/.zshrc`, `~/.bashrc`/`~/.bash_profile`, or fish’s `config.fish`) — restart your shell afterwards. If your shell still cannot find `loofah`, add it manually: ```bash export PATH="$HOME/.local/bin:$PATH" ``` Caution Tarballs downloaded from the GitHub releases page with a browser are not notarized, so macOS Gatekeeper blocks them. Use the install script instead — it is the supported download path. ## Install it from the desktop app [Section titled “Install it from the desktop app”](#install-it-from-the-desktop-app) On macOS, open **Settings → Developers** and click **Install**. The app installs the bundled command at `~/.local/bin/loofah` — the same path the install script uses, so whichever ran last wins. Both ship the same binary. Note The app uses `loofah-dev` and `loofah-staging` for development and staging builds, so those channels do not overwrite the stable command. ## Build it from source [Section titled “Build it from source”](#build-it-from-source) You can install the CLI directly from the repository: ```bash git clone https://github.com/bart6114/loofah.git cd loofah cargo install --locked --path apps/cli loofah --version ``` Cargo normally writes commands to `~/.cargo/bin`. Add that directory to `PATH` if needed. There is no Homebrew formula or Windows package yet. ## Connect to the vault [Section titled “Connect to the vault”](#connect-to-the-vault) Open the desktop app at least once before using the CLI. By default, `loofah` looks in Loofah’s application-data directory. If you moved the vault in the app, the CLI follows the `vault_path` value in `global.json`. You can override the path for one command: ```bash loofah --vault-path /path/to/vault --json sessions list ``` Or set it in the environment: ```bash LOOFAH_VAULT_PATH=/path/to/vault loofah --json sessions list ``` `--base /path/to/vault` is an older equivalent, but `--vault-path` is clearer and takes precedence when both are present. The CLI reads and writes the vault: `loofah sessions new`, `loofah import`, and `loofah sessions note --set` create and edit meeting data in the same format the desktop app writes, and `loofah transcribe` replaces a meeting’s transcript. The MCP server stays read-only. See the [CLI reference](/reference/cli) for every command. # Transcription and summaries > Set up local transcription and, if you want it, AI-generated summaries. Loofah has two separate model settings: * **Transcription** turns audio into text on your Mac. * **Intelligence** writes summaries and note titles. It can use a local model or a provider you configure with your own API key. Open **Settings → Transcription** or **Settings → Intelligence** to change the active model. ## Transcription [Section titled “Transcription”](#transcription) Transcription is on-device only. Download a model from **Settings → Transcription**, wait for it to finish, then select it under **Model being used**. A model marked **Live** can show text during a meeting. The streaming model supports English. If your language selection is not supported live, the app falls back to transcription after the recording. Models marked **After recording** always wait until you stop. A downloaded on-device Soniqo model also powers transcription from the terminal: `loofah transcribe MEETING_ID` uses it without opening the app. The CLI never downloads models itself, so complete the download here first. See the [CLI reference](/reference/cli). ## Speaker detection [Section titled “Speaker detection”](#speaker-detection) Recordings that are transcribed after the fact — imported files and models marked **After recording** — also get automatic speaker detection: the transcript separates who said what, and you can name each speaker by clicking their label. Live transcription does not separate speakers. Speaker detection runs on your Mac and is included with on-device transcription. Its small model downloads automatically the first time it is needed; the **Speaker detection** row in **Settings → Transcription** shows its status and offers a **Retry** if the download failed. ## Intelligence [Section titled “Intelligence”](#intelligence) You do not need an Intelligence model to record, write notes, or transcribe. Configure one only if you want generated summaries and titles. For a hosted provider, open **Configure Providers**, add the API key, then select one of that provider’s models. The API key is stored in the macOS login Keychain. You can also run summaries locally with LM Studio or Ollama. ## LM Studio [Section titled “LM Studio”](#lm-studio) 1. Install [LM Studio](https://lmstudio.ai/download) and download a model. 2. Start its local server on port `1234` and enable CORS. 3. Open **Settings → Intelligence → Configure Providers → LM Studio**. 4. Select the LM Studio model under **Model being used**. ## Ollama [Section titled “Ollama”](#ollama) 1. Install [Ollama](https://ollama.com/download). 2. Start it and download a model: ```bash ollama serve ollama pull llama3.2 ``` 3. Open **Settings → Intelligence → Configure Providers → Ollama**. 4. Select the Ollama model under **Model being used**. ## What leaves your Mac [Section titled “What leaves your Mac”](#what-leaves-your-mac) Recording and transcription stay local. A local Intelligence provider also keeps summary processing on your Mac. If you select a remote Intelligence provider, the app sends the prompt and meeting context needed for that request to that provider. See [Data, privacy, and retention](/data-and-privacy) for more detail. # Meeting detection and controls > Get a reminder when a call starts and stop recording when it ends. Loofah does not start recording on its own. It can notice sustained microphone use, show a reminder, and stop an active recording after the meeting app releases the microphone. ## Turn on meeting reminders [Section titled “Turn on meeting reminders”](#turn-on-meeting-reminders) Open **Settings → Notifications** and enable **Microphone detection**. Choose how long the microphone must be active before the notification appears. The available delay is between 5 seconds and 2 minutes. You can exclude apps that use the microphone but should not trigger a meeting reminder. The same page has a setting to respect macOS Do Not Disturb. ## Stop when the call ends [Section titled “Stop when the call ends”](#stop-when-the-call-ends) Open **Settings → App → Meetings** and enable **Stop when meeting ends**. This uses microphone activity from the meeting app to decide when to stop. This is a convenience, not something to trust blindly. If you switch devices or use an app with unusual microphone behavior, check that the recording is still active. ## Keep the controls visible [Section titled “Keep the controls visible”](#keep-the-controls-visible) Enable **Show floating bar** under **Settings → App → Meetings**. A small recording control stays available while the app is listening. # Release notes > Everything that changed in each Loofah release. Every notable Loofah release, newest first. These are the same notes the app shows in its “What’s new” view. Releases that only contain internal changes are not listed. ## Version 0.30.2 August 24, 2026 ## Fixes * Exporting a note to PDF no longer prints someone else’s product name on the cover page. The small line at the bottom said “Exported from Char”, left over from the project this app grew out of, and now reads “Exported from freemeetingtranscriber.com”. Nothing else about the exported file changes, so any PDF you share from here on carries the right name ## Version 0.30.0 August 23, 2026 ## New * A note can now record the skill that produced it, alongside the name of the agent that wrote it. Since 0.28.1 a note created by an agent has carried an author; now it can also say which named, reusable instruction set (a “meeting-summarizer”, say) the agent ran to write it, so a vault full of agent-written notes tells you not just who made each one but how * Agents set this with a new `--skill` flag on `fmtr meetings new` and `fmtr import`, next to the `--author` flag they already pass. The guidance agents read in your vault now asks them to fill it in whenever a skill was involved, and to leave it alone when they are editing a note rather than creating one, so your own notes stay unmarked * Looking a note up with `fmtr` (or through the MCP server your agents connect to) shows the skill next to the author, both in the readable output and in the JSON, so an agent can find every note a particular skill produced ## Version 0.29.5 August 23, 2026 ## Fixes * Vaults kept on a network mount or a synced folder (Google Drive, rsync, a NAS) no longer take minutes to open. The app checks a vault’s session folders when it starts and again when you come back to the window, and it now reads them in parallel instead of one at a time, which is where nearly all of that waiting went on a high-latency drive. Vaults on your local disk behave exactly as before, and the app still finds the same notes in the same order * Installing `fmtr` with the one-line installer now adds the install folder to your PATH itself when it is missing, writing to the right startup file for zsh, bash, or fish instead of only printing instructions for you to follow. Open a new terminal after installing and `fmtr` is there. Re-running the installer will not add the line twice, and any other shell still gets the instructions to do it by hand * Creating a note from the command line (`fmtr meetings new`, and importing an audio file) is quick again on a network-mounted vault. Each creation used to sweep the whole vault twice before writing anything, so the wait grew with the number of notes you had ## Version 0.29.2 August 23, 2026 ## New * `fmtr`, the command-line companion that lets you and your AI agents read and edit the notes in your vault, now installs with one command on macOS and Linux: `curl -fsSL https://freemeetingtranscriber.com/install.sh | bash`. It picks the right binary for your machine, checks it against a published checksum, and puts it in `~/.local/bin` without ever asking for your password. Run the same command again to upgrade, and delete the file to remove it. Installing from Settings > Developers still works and gives you the same binary in the same place * Linux machines and Intel Macs can run `fmtr` now. Until this release the only ways to get it were the bundled copy inside the macOS app or building it yourself. On-device transcription still needs an Apple Silicon Mac, but every other command, and the MCP server, work on all supported platforms * `fmtr --help` now points at the `AGENTS.md` file at the root of your vault, so the guidance your agents follow when they work with your notes is easier to find ## Version 0.28.1 August 22, 2026 ## New * Tags can now contain a slash, so `#clients/acme` and `#clients/globex` sit under a shared `clients` heading. The sidebar’s “By tag” view shows them as a nested list: a parent heading counts every note anywhere beneath it (a note carrying two tags in the same branch is still counted once), and each level opens and closes on its own, so you can open `clients` to see its sub-headings without opening all of them. The parent heading appears even if you only ever use the full path, and “open or close everything” still covers the whole tree. Tags you already have keep working exactly as before, and so does whichever set of tags you left open * A slash tag is highlighted as one tag while you type it in a note, and AI summaries can suggest nested tags too. Links and URLs in your notes are still left alone * Notes that were not written by you now say so. When a note was created by an agent working in your vault, the note header shows a small pill with the name it was created under, and the note’s row in the sidebar gets a bot icon, so a glance at the list tells you which notes are yours. Your own notes look exactly as they did ## Version 0.26.1 August 21, 2026 ## New * Grouping the sidebar by tag now starts with every tag closed, so switching over gives you a list of your tags with the number of notes in each, and you open only the ones you want to look through * A new button sits next to the “By date” / “By tag” toggle and opens or closes every tag at once. The app now remembers which tags you left open rather than which you left closed, so tags start closed after this update, including any tag you create from here on ## Fixes * Switching the sidebar to “By tag” no longer stalls for seconds in a large vault. Only the tag headings are drawn when you switch, and the notes inside a tag are drawn when you open that tag * The sidebar no longer rebuilds itself every minute while you are grouped by tag, and notes in the timeline no longer each check separately whether a summary is being written for them, so scrolling and everyday use stay smooth ## Version 0.25.0 August 21, 2026 ## New * About is now a proper window inside the app instead of a system message box. It opens with the app icon, the version you are running, and a build number you can click to copy when you want to report something * Underneath that, About now shows your vault in numbers: how many notes and recordings you have, how many words have been transcribed, and how long you have spent in meetings, along with AI summaries written, tasks completed, tags in use, and the disk space your recordings take up. If your vault spans more than one year, a small bar per year shows how much of it happened when, and the month you started shows in the corner. It reads what the app already keeps in memory, so it opens straight away even on a large vault ## Fixes * Notes with an image sitting in the same paragraph as text now open normally. Previously a Markdown note where the image line follows a text line with no blank line between them (common in notes written elsewhere and brought into your vault, for instance from Bear) failed to open at all, showing “The editor failed to render.” instead of the note. Images anywhere in a note, including inside lists and checklists, are now placed on their own line, and saving the note keeps them where you put them ## Version 0.24.1 August 21, 2026 ## Fixes * Notes with an image sitting in the same paragraph as text now open normally. Previously a Markdown note where the image line follows a text line with no blank line between them (common in notes written elsewhere and brought into your vault, for instance from Bear) failed to open at all, showing “The editor failed to render.” instead of the note. Images anywhere in a note, including inside lists and checklists, are now placed on their own line, and saving the note keeps them where you put them ## Version 0.24.0 August 21, 2026 ## New * File attachments in a note now have a folder button that reveals the file in Finder, so you can get to the original without leaving the app * The app no longer holds every transcribed word of every meeting in memory. A transcript is read from disk when you actually open it, so memory use stays flat as your vault grows instead of climbing with every recording you make * Opening a note with Cmd+K is quicker in a large vault. With an empty search box the dialog now lists your 50 most recent notes instead of building a row for every note you own, and typing a few characters is the way to older ones. A closed dialog also stops doing work in the background every time something in your vault changes * The sidebar timeline and the other parts of the app that follow your notes now ask only for the handful of fields they display, rather than the whole of every note. Saving a note or finishing a transcript costs a lot less behind the scenes, which shows up as a smoother app once you have a few thousand notes * “Rebuild index” in Settings now reads notes in parallel and finishes considerably faster on a big vault. If one note fails to read, the rest still rebuild and the problem is reported at the end, instead of the rebuild stopping partway through * The bundled `fmtr` command line tool can now edit tags. `fmtr meetings tag add ...` and `fmtr meetings tag remove ...` write tags the same way the app does (trimmed, lowercased, without the leading `#`), and new ones are registered in the vault’s tag list that the app suggests from * `fmtr meetings list` gained `--tag `, repeatable so a meeting has to carry all of them, and `--untagged` for the ones with none. Both `list` and `get` now show each meeting’s tags * New `fmtr meetings path ` prints the folder a meeting lives in, and `fmtr tags list` prints every tag your vault knows about * `fmtr doctor` now checks the `AGENTS.md` file the app keeps at the top of your vault, and rewrites it if it is missing or out of date. It only does this in a folder that really is a vault, so pointing doctor at an ordinary folder still leaves it untouched ## Fixes * Hashtags containing a dash are now highlighted in full in the editor. `#org-design` used to light up only the `#org` part. A trailing dash is still left out, so “#org- and” tags just `org` * Selecting a file attachment in the editor no longer paints a stray selection band underneath the card ## Version 0.23.0 August 21, 2026 Your notes are now saved as notes.md The file holding the note you write used to be called `_memo.md`. It is now `notes.md`. Nothing changes inside the app, and existing notes are still read from the old name, so you lose nothing by upgrading. The first time you edit a note, it is rewritten as `notes.md` and the old file moves to your vault's trash where you can still recover it by hand. If you keep your vault in a synced folder shared with another Mac, update the app on every machine, because older versions only look for `_memo.md` and would show an edited note as empty. ## New * The note you write is now stored as `notes.md` in the note’s folder, instead of `_memo.md`. It reads like what it is when you open your vault in Finder, in Obsidian, or in any other Markdown editor * Files you put into a note’s folder yourself are now left strictly alone. The app knows exactly which files are its own (the note, the transcript, the recording, its summaries and attachments) and ignores everything else, so a Markdown file you drop next to a note no longer turns up in the app as if it were a generated summary * The bundled `fmtr` command line tool can now backdate a meeting. `fmtr meetings new --title "Kickoff" --created-at 2024-05-01T09:00:00Z` places it on that date on your timeline and in its folder name, and `--started-at` and `--ended-at` set when it ran. `fmtr import` takes the same three, which is what you want when importing a recording you made months ago. A timestamp that does not make sense is rejected before anything is written * `fmtr meetings new` takes a repeatable `--tag`, so a meeting can arrive with its tags already on it. New tags are registered in the vault’s tag list, the same one the app suggests from * New `fmtr meetings attach ` stores a file as an attachment of a meeting and prints the id to reference it by, with `--name` to store it under a different filename. Together with the timestamp flags, that makes it possible to bring a note archive from another app across with its dates and its attached files intact ## Version 0.21.0 August 18, 2026 ## New * Changing your storage location now looks at the folder you picked and offers only what makes sense for it. An empty folder asks whether you want to move your vault there, copy it there, or start a brand new empty vault, laid out as three choices you select before confirming, instead of a row of buttons that meant different things depending on the folder * Picking a folder that is already a vault (one of ours, or an Obsidian vault) now offers a plain switch. Nothing is moved, copied, or deleted, your current vault stays exactly where it is, and you can switch back the same way. That makes it practical to keep more than one vault on disk, for instance a work one and a personal one, and hop between them * Starting a new empty vault leaves your existing one untouched, so you can try a fresh start without giving anything up * Picking a folder that already has unrelated files in it no longer mixes your vault in with them. The app creates a “Free Meeting Transcriber” folder inside it and shows you the exact path it will use before you confirm, so your vault always lands in a directory of its own ## Fixes * The “Rebuild index from files” button no longer overflows its column in Settings. It now simply reads “Rebuild index” * The “Now” chip on the sidebar timeline is a touch lighter, with thinner text and arrow, so it sits more quietly against the notes around it ## Version 0.20.1 August 17, 2026 ## New * Changing where your vault lives now offers a real Move, not just a Copy. Move relocates your files and cleans up the old location, while Copy leaves the originals behind, and both are offered side by side so you can pick. Moving is only offered into an empty folder, since mixing your vault into a folder that already has files in it would leave nothing safe to clean up * Relocating your vault is now coordinated with the app instead of happening underneath it. Anything still being written is flushed first, writing is held until the move finishes, and the app declines to relocate while a recording is running rather than moving files out from under it. Your trash comes along too, so notes you deleted are still recoverable at the new location * PDF exports now include the images in your note and summary rather than dropping them, at the width you set in the editor. An image that cannot be read or is in a format the exporter does not handle is simply left out instead of failing the whole export * Right-clicking a note in the sidebar has a new “Rename Folder to Match Title” action. The automatic naming only runs once, when a note first gets a real title, so this is how you bring a folder back in line after renaming the note later. It is unavailable while that note is recording * The export dialog’s “Memo” option is now called “Note”, matching what the rest of the app calls it, and exported files use “Note” as the heading ## Fixes * The export dialog is wider and less cramped, so the format and content options have room to breathe ## Version 0.18.2 August 17, 2026 Your session folders now have readable names Session folders in your vault used to be named after a long random ID. They are now named after the meeting date, the note title, and a short ID, so the vault makes sense when you open it in Finder. Existing folders are renamed for you the first time you launch this version, and nothing inside your notes changes. If you keep your vault in a synced folder shared with another Mac, update the app on every machine before opening it again, because older versions do not recognize the new folder names. ## New * Notes can now carry tags. A row of tag chips sits under the note title on every view, and typing in it suggests tags you have used before, so related meetings end up under the same label instead of a slightly different spelling each time * Tags that a generated summary picked up were already being saved but had nowhere to appear. They now show up as chips on the note along with the ones you add yourself * The sidebar can group your notes by tag instead of by date. Each tag becomes a section you can collapse, sorted alphabetically with untagged notes at the end, and the app remembers which view and which collapsed sections you left it on * A quieter, more neutral look throughout the app. The warm cream and amber surfaces give way to near neutral tones in both light and dark mode, the custom display font is replaced by your system’s own, and text is tighter and calmer to read. The amber accent stays * The audio player is now a small pill in the header next to the view tabs, and it is available on every view rather than only on the transcript, so you can listen back while reading your own notes or the summary. On a narrow window it folds down to a single play button * The sidebar shows “New note” and “Search notes” as labeled rows rather than bare icons, and the note tabs always show their names. The “Memos” tab is now called “Note” ## Fixes * When your spoken language cannot be handled live but the after-the-fact model can handle it, the app now says so plainly, explaining the transcript will arrive once the recording ends. It used to show a warning implying the language would not be transcribed at all. Languages that neither model supports still get the full warning * Moving or copying your vault to another location now brings your people and task lists with it. They were being silently left behind before * Renaming or moving a note’s folder in Finder no longer leaves playback and attachments pointing at where the folder used to be * Starting a recording at the moment a new note first gets its title now reliably writes into that note’s folder * Opening the app and browsing notes no longer rescans the whole vault repeatedly, which keeps things responsive with thousands of notes * The bundled command line tool reports the app’s real version instead of always saying 0.1.0 ## Version 0.15.0 August 14, 2026 ## New * The notification that appears when the app notices you’re in a meeting now says what each button does. The main button reads “Start recording” instead of “Yes”, and the option to stop being asked about that app reads “Always ignore” next to the app’s name and icon. Previously both buttons said “Yes” while answering completely different questions, so it was easy to silence an app when you meant to record * That notification now shows the app’s own logo, making it clear at a glance which app is asking ## Fixes * Searching your notes now matches whole words. A search for “david” used to turn up notes that merely contained the letters d, a, v and i somewhere, because every one, two and three letter fragment was being indexed separately, which buried the results you actually wanted under noise * Snippets under each result now highlight the words you searched for rather than scattered fragments of them, and typing part of a word still matches as you go, so “plan” keeps finding “Planning session” * Your search index rebuilds by itself the first time you open this version, so the improved results apply to notes you already have ## Version 0.14.1 August 14, 2026 ## New * The open-note dialog now looks inside your notes instead of only matching titles. Something you typed in a memo, a line from a generated summary, or a phrase somebody said in a transcript will all surface the note it belongs to, so you can find a meeting by what was discussed even when you don’t remember what you called it * Each result shows a short snippet of the matching text under the title, with the words you searched for picked out, so you can tell which note is the one you want before opening it * Notes whose titles match still come first, and partial words keep working while you type, so “plan” still finds “Planning session” * The Developers tab in Settings is now called Agents, matching what it is actually for: connecting the command line tool so AI agents can work with your notes ## Fixes * Copying a transcript from a note now works. It had been failing with a copy error and leaving your clipboard untouched * The command line tool no longer falls behind after an in-app update. It used to stay stuck at whatever version you first installed it from until you reinstalled it by hand, and it now follows the app automatically ## Version 0.13.1 August 13, 2026 ## Fixes * Opening a note whose summary was never generated now lands on your memo instead of an empty summary page. A note only opens on the summary when that summary actually has content, so your own notes are what you see first. If you had deliberately left a note on its summary view, it still opens there ## Version 0.13.0 August 12, 2026 ## New * Recordings that are transcribed after the fact, imported files and models marked “After recording”, now get automatic speaker detection. The transcript is split by speaker instead of running as one block, so a call with several people reads as a conversation. Live transcription still does not separate speakers * Click a speaker label in the transcript to name that speaker, and every stretch of that voice picks up the name. Names come from your existing people, or you can type a new one * When a side of the call has several detected voices, the first rename offers to apply the name to the rest of that side too. It is off by default, and it tells you how many other speakers it would cover, so a multi-person call doesn’t quietly collapse into a single name * Speaker detection runs entirely on your Mac and is included with on-device transcription. Its model is small and downloads by itself the first time it is needed. A new Speaker detection row in Settings, Transcription shows whether it’s ready and offers a Retry if the download didn’t finish * Re-transcribing a meeting that already has named speakers now asks first, since a new transcript replaces the old one and the names go with it ## Fixes * Renaming a speaker no longer damages the transcript. Previously a rename wiped the per-word timing information, which made transcripts of two-sided recordings re-render as the two sides shredded into each other. Transcripts that were already scrambled this way now render correctly again * Renaming a speaker in a long transcript no longer leaves the view frozen on the old text until you reopen the note, and the new name shows up on the label right away instead of after a pause * Live transcripts no longer merge distinct voices to match the number of people the app thinks are in the meeting, so a provider that hears four speakers keeps four * When no Intelligence provider is set up yet, the summary view keeps showing the note title and the speakers row above the setup message instead of replacing the whole view ## Version 0.12.2 August 10, 2026 ## New * Images you put in a memo now appear as a row of thumbnails just below the title when you’re looking at the summary, so a screenshot or a diagram you pasted stays in sight without switching back to the memo * Clicking a thumbnail opens the memo and scrolls to that image * Images resolve as soon as you paste them, so a freshly pasted screenshot shows up in the strip right away ## Version 0.11.2 August 10, 2026 ## New * `fmtr import recording.m4a --into ` imports an audio file into a meeting you already created, instead of always making a new one. That makes a memo-first flow possible: start the meeting and jot your notes, then bring the recording in afterwards and add `--transcribe` to transcribe it in the same step. Importing never overwrites audio, so it stops with a clear message if that meeting already has a recording ## Fixes * Images and file attachments you paste into a note now stay in the note. Previously a freshly pasted image was written to the note file without its attachment, so it vanished the next time the note loaded. They are now stored as a reference that travels with your vault, so the same note opens correctly on another machine too * Pasted images in a memo reach vision-capable models again, so summaries can take what’s in a screenshot or diagram into account * Editing a note’s date and then clicking somewhere else, into the memo for instance, now saves the new date instead of quietly dropping it. Clicking away without changing anything just closes the editor, and Cancel still cancels ## Improvements * The button on notifications now reads “Open” instead of the full app name, which the notification already shows above it ## Version 0.9.1 August 10, 2026 ## New * The `fmtr` command line tool that ships with the app can now write to your vault, not just read from it. Install it from Settings, Developers, and your coding agent can create meetings and fill in notes for you. Anything it writes shows up in the app right away, no restart needed * `fmtr meetings new --title "Weekly sync"` creates a meeting and prints its id, optionally seeding the note body from a file or from whatever you pipe in * `fmtr meetings note --append` adds to an existing note, and `--set` replaces the body outright * `fmtr import recording.m4a` turns an audio file you already have into a new meeting. It converts the audio exactly the way the app’s own import does, so the meeting behaves like anything you recorded in the app. wav, mp3, ogg, mp4, m4a, flac, webm, and aac files are accepted, and the title defaults to the file name * `fmtr transcribe ` transcribes a meeting’s audio on your own machine with the same on-device model the app is set to use, and `fmtr import --transcribe` does the import and the transcription in one step. Download the model in the app first, since the CLI never fetches one itself. Note that transcribing replaces whatever transcript the meeting already had * Transcribing from the command line respects your audio retention setting just like the app does, so with retention set to “none” the recording is deleted as soon as the transcript is saved ## Version 0.8.1 August 7, 2026 ## New * The floating bar while recording is redesigned. At rest it’s a small pill drawing a live trace of what it hears, and hovering it grows the pill leftward to reveal the elapsed time and the stop button, so the bar stays put where you left it * The bar now sits on a frosted background that picks up whatever is behind it, in both light and dark appearance * The session header no longer shows a plain “Stop” while your recording is still being transcribed. It reads “Transcribing” with a spinner, and clicking it stops transcription * Once a recording is stopped, the header shows “Finalizing” until the transcript is written, instead of offering a record button that wasn’t ready yet ## Fixes * The floating pill no longer jumps sideways for a frame when you move your pointer onto it quickly, and the stop button stays visible and in the same spot the whole time * In fullscreen, the sidebar header no longer leaves an empty gap where the macOS traffic lights would normally be ## Changes * The live transcript overlay and its expand button on the floating bar are temporarily hidden while the bar is reworked. Recording and transcription are unaffected, and the overlay will return ## Version 0.7.1 August 7, 2026 ## New * Speaker names now stick. Renaming a speaker in the transcript saves that person, so the name survives re-renders and shows up as a suggestion the next time you rename someone in any meeting, no retyping required * Summaries now use the real names you assigned instead of “Speaker 1” and “Speaker 2” * The people in a meeting now appear as pills right under the note title, on the summary, memo, and transcript screens alike * The transcript screen picked up the editable date and the same title size as the other views, so all three headers now read the same way: date, title, participants * The `fmtr` command line tool and its MCP server now ship inside the app. Install them from Settings, Developers, and point your coding agent at your own meetings * `fmtr` can search across your meetings (titles, notes, summaries, and transcripts, optionally filtered to a given speaker), and it now returns a whole speaker-labeled transcript in one go instead of in pages ## Improvements * The waveform in the Transcript view appears immediately instead of after a pause while the recording loaded * The menu bar icon is noticeably larger, since it no longer carries invisible padding that macOS was shrinking it into ## Fixes * Renaming a speaker no longer blanks the transcript for a moment or scrolls you away from where you were. Only the labels you changed repaint ## Version 0.5.1 August 5, 2026 ## New * The note’s date now appears right above the title and can be edited inline with a click — no more hunting for it behind the record button ## Fixes * The “System” appearance option now actually follows your macOS light/dark setting instead of always staying light * The transcript view now shows the note title in the same spot as the other views, above the audio player, and you can edit it there too * The red “now” line in the sidebar no longer appears when there’s nothing upcoming in the timeline ## Version 0.5.0 August 5, 2026 ## New * The note’s date now appears right above the title and can be edited inline with a click — no more hunting for it behind the chevron on the record button, which is now purely a recording control ## Version 0.4.4 August 5, 2026 ## Fixes * Transcripts made with the on-device model no longer scramble the two speakers’ sentences into each other: speaker turns now stay whole, and existing notes are fixed too — just reopen them * Meetings in languages the live model doesn’t support (like Dutch) no longer produce gibberish during the call; they’re now transcribed right after the meeting with the more capable model ## Improvements * Tidied up the summary-generating placeholder ## Version 0.4.0 August 3, 2026 ## Improvements * Audio imports now run in the background: the dialog hands progress off to a sidebar toast, and reopening it mid-import makes clear that closing is safe ## Fixes * Clicking an import-finished notification no longer starts a new recording; it opens the imported note instead * The updater now recovers when a downloaded update is superseded by a newer release, instead of getting stuck on a version mismatch ## Version 0.3.2 August 3, 2026 ## Fixes * Widen the sidebar’s minimum width so header buttons never clip ## Version 0.3.1 August 3, 2026 ## Batch audio import * Drop a folder of audio files into the app, review the list, and import them in one go * Each file is transcribed and summarized sequentially into its own memo ## Fixes * Show release notes in the “What’s new” dialog after updating # Customize meeting summaries > Choose a summary template or change the prompt used by Auto. Summary generation is optional. When you use it, you can either let Auto decide the structure or choose a template with fixed sections. ## Use a template [Section titled “Use a template”](#use-a-template) Open a meeting and use the picker beside **Summary**. You can create templates for decisions, action items, one-on-ones, or any other structure you use regularly. Selecting another template does not change a summary that already exists. Regenerate the summary when you want to apply the new selection. ## Change the Auto prompt [Section titled “Change the Auto prompt”](#change-the-auto-prompt) 1. Open **Templates**. 2. Select **Auto**. 3. Edit the prompt and click **Save**. This is the complete system prompt used by Auto. The **Current date** and **Language** buttons insert variables that are filled in when the prompt runs. The app supplies meeting notes, transcript text, session details, and participants separately. Removing those words from the prompt does not stop that context from being sent to the selected Intelligence provider. The custom prompt only affects Auto. Named templates keep their own sections. Use **Reset to default** to restore the built-in prompt. ## Add names and jargon [Section titled “Add names and jargon”](#add-names-and-jargon) Open **Settings → Dictionary** to add names, acronyms, product names, and other terms that transcription often misses. Dictionary terms help recognition, but they do not change which spoken languages a model supports. See [Languages](/languages) when a meeting uses more than one language. # Data, privacy, and retention > See where your knowledge vault lives and when its content can leave your Mac. Loofah has no account or cloud backend. Its vault on your Mac is the source of truth for standalone notes, meeting notes, transcripts, attachments, and agent-created material. Meeting recording still happens without adding a bot to the call. ## Files in the vault [Section titled “Files in the vault”](#files-in-the-vault) The app stores notes, transcripts, attachments, settings, retained recordings, people, and templates as files in the vault. The default vault is in the app’s data directory. You can change its location under **Settings → App → Storage**. You can inspect and edit the vault with other tools. The app watches for external changes and refreshes its in-memory index. If the app is about to overwrite a version it did not write, it first moves that version into the vault’s `.trash/` folder. Downloaded transcription and speaker-detection models are also local, but they are managed separately from meeting files. ## Remote Intelligence providers [Section titled “Remote Intelligence providers”](#remote-intelligence-providers) Transcription and speaker detection run on your Mac. Session content only leaves the app when you ask a remote Intelligence provider to generate a summary or title. That request includes the prompt and the context needed to produce the result. API keys are stored in the macOS login Keychain. Review a provider’s retention and training policy before using it with sensitive meetings. For fully local summaries, use LM Studio or Ollama. See [Use the app offline](/offline). ## Audio retention [Section titled “Audio retention”](#audio-retention) Open **Settings → App → Meetings → Audio file retention** and choose one of these values: * **Don’t save** * **1 day** * **3 days** * **1 week** * **1 month** * **Forever** Removing retained audio does not remove the memo, summary, or transcript. To copy a recording before it expires, open the meeting’s **•••** menu and choose **Show in Finder**. ## Telemetry [Section titled “Telemetry”](#telemetry) This fork does not send usage analytics or telemetry. The **Share usage data** control is still visible in Settings, but the analytics plugin is a local no-op in this build. Caution Recording-consent rules vary by location. Make sure you have permission before recording. # Common questions > Quick answers and links to the relevant guide. [Does it join the call?](/meetings)No. It records microphone and system audio on your Mac. [Can I use it offline?](/offline)Yes. Download the transcription model first, and use LM Studio or Ollama for local summaries. [Where is my knowledge stored?](/data-and-privacy)In files inside your local vault. There is no cloud backend. [Can I import an old recording?](/import-recordings)Yes. Import common audio formats, SRT, or VTT. [Can recording start automatically?](/automatic-capture)No. The app can remind you when it detects microphone use, but you decide when recording starts. [Can I change the summary format?](/customize-summaries)Yes. Use a template or edit the prompt used by Auto. [What about multilingual meetings?](/languages)Add the spoken languages in Settings. Model support determines whether transcription can run live. [How do I export a session?](/notes#export-a-session)Export the memo, summary, transcript, or any combination of them. If the app is not behaving as described, try [Troubleshooting](/troubleshooting). If that does not help, [open a GitHub issue](https://github.com/bart6114/loofah/issues). # Import audio or a transcript > Create a note from an audio recording, SRT file, or VTT file. You do not have to record a conversation in Loofah. You can bring in audio recorded elsewhere or start with an existing subtitle file. ## Import one audio file [Section titled “Import one audio file”](#import-one-audio-file) 1. Create a **New Note** or open an empty note. 2. Open the **•••** menu and choose **Upload audio**. 3. Select the recording and leave the app running while it is processed. You can also drop one audio file onto an open note. Supported file extensions are WAV, MP3, OGG, MP4, M4A, FLAC, WebM, and AAC. Audio imports use the selected on-device Transcription model. Note You can also import from the terminal: `loofah import recording.m4a --transcribe` creates the meeting and transcribes it without opening the app, when the selected Transcription model is an on-device Soniqo model. See the [CLI reference](/reference/cli). ## Import several recordings [Section titled “Import several recordings”](#import-several-recordings) 1. Open an empty tab and choose **Import Audio**. 2. Drop audio files or a folder into the dialog. Dropped folders are scanned recursively. You can also use **Choose files**. 3. Clear the checkbox for anything you do not want to import, then click **Import**. Each file gets its own note. The app processes the queue one file at a time. Use the sidebar progress item to reopen the queue, inspect a failure, or retry it. The note date comes from available recording metadata or the file’s modification date. A summary is generated when an Intelligence model is configured and the transcript is long enough. ## Speaker names [Section titled “Speaker names”](#speaker-names) Imported audio is scanned for distinct speakers while it is transcribed. Click a speaker label in the transcript to name that speaker; on a first rename you can also choose to apply the name to the other detected speakers on that side of the call. Speaker detection is included with on-device transcription and needs no setup — see [Transcription and summaries](/ai-setup#speaker-detection). ## Import a transcript [Section titled “Import a transcript”](#import-a-transcript) 1. Create a **New Note** or open an empty note. 2. Open the **•••** menu and choose **Upload transcript**. 3. Select a WebVTT (`.vtt`) or SubRip (`.srt`) file. The timed text becomes the note’s transcript. No audio file is created. If an Intelligence model is configured, the app also tries to generate a summary. ## If nothing happens [Section titled “If nothing happens”](#if-nothing-happens) Check the file extension and make sure a downloaded Transcription model is selected for audio imports. For summaries through LM Studio or Ollama, make sure the local server is running. See [Transcription and AI](/ai-setup) for model setup or [Troubleshooting](/troubleshooting) for common problems. # Languages > Set the language for summaries and the languages spoken in meetings. Loofah keeps summary language and spoken languages as separate settings. ## Set the main language [Section titled “Set the main language”](#set-the-main-language) Open **Settings → App → Language & Region** and choose **Main language**. This language is used for generated summaries and titles. It is also included in the list passed to transcription. Changing it does not translate an existing transcript. Regenerate a summary if you want an older meeting summarized in the new language. ## Add spoken languages [Section titled “Add spoken languages”](#add-spoken-languages) Use **Additional spoken languages** when people may switch languages during a meeting. The app passes the full selection to the transcription model. Language support depends on the downloaded model. The live streaming model supports English. When your selected languages are not supported live, the app records first and transcribes after you stop. The model picker warns you when a model cannot handle the selected languages. ## Names and specialist terms [Section titled “Names and specialist terms”](#names-and-specialist-terms) Language settings do not teach the model names or company jargon. Add those under **Settings → Dictionary**. Use [Customize meeting summaries](/customize-summaries) to control summary structure and wording. # Record meetings > Record and transcribe a meeting without adding a bot to the call. ## Start recording [Section titled “Start recording”](#start-recording) Create a **New Note**, or open an existing empty note, then click **Record** in the top-right corner. Loofah captures your microphone and system audio on your Mac. It does not join the call as a participant. Caution Make sure you have permission to record. Consent rules vary by location. ## While the meeting is running [Section titled “While the meeting is running”](#while-the-meeting-is-running) Write your own notes in **Memos**. Those notes are included as context if you generate a summary later. The **Transcript** view shows text during the meeting when the active model and language support live transcription. Otherwise, transcription runs after you stop recording. Turn on **Show floating bar** in **Settings → App → Meetings** if you want compact controls while the main window is out of the way. ## Finish or resume [Section titled “Finish or resume”](#finish-or-resume) Click **Stop listening**. The app finishes any pending transcription and generates a summary when an Intelligence model is configured and the transcript is long enough. You can resume the same note from the recording control if the conversation continues. ## Start from an existing file [Section titled “Start from an existing file”](#start-from-an-existing-file) On an empty note, open the **•••** menu and choose **Upload audio** or **Upload transcript**. See [Import audio or a transcript](/import-recordings) for the supported formats. You can also import from the terminal: `loofah import recording.m4a --transcribe` creates the meeting and transcribes it without opening the app. See the [CLI reference](/reference/cli). For microphone reminders and automatic stopping, see [Automate meeting capture](/automatic-capture). # Notes and knowledge > Keep standalone notes, meeting context, and agent-created research in the same local vault. The vault is not limited to recorded meetings. Every entry is a **session**, and a session can be a standalone note or a meeting with a recording and transcript. Use sessions for research, project context, decisions, reference material, or anything else you want to keep locally and find again. A session can contain: * **Memos** you or an authorized agent write. * **Summary** documents generated by the configured Intelligence model. * **Transcript** text from a recording or imported subtitle file. * **Attachments** referenced from the memo. Memos and summaries are editable. In the transcript, click a speaker label to assign or change the speaker. ## Create a standalone note [Section titled “Create a standalone note”](#create-a-standalone-note) Choose **New Note** and start writing. You do not need to record audio or add a transcript. The note is stored as a session, so it appears in the same timeline and search results as meeting notes. Agents can create the same kind of note through the CLI. This makes it practical to bring in material from any tool the agent is authorized and able to read: the agent turns the useful result into Markdown, records its authorship, and creates a session in the vault. ```bash loofah --json sessions new \ --title "Research: local speech models" \ --note research.md \ --tag research \ --author claude-code \ --skill research-assistant ``` The CLI does not connect to or scrape those source tools itself. The agent supplies the Markdown through a file or stdin. If the original deck, report, or other artifact should travel with the note, the agent can add it with `sessions attach`. Note You can also edit the memo from the terminal: `loofah sessions note ID --set FILE` replaces it, and `--append` adds to it. See the [CLI reference](/reference/cli). ## Change the summary format [Section titled “Change the summary format”](#change-the-summary-format) Use the picker beside **Summary** to choose Auto or one of your templates. Changing the selection does not rewrite an existing summary. Regenerate it to apply the new format. See [Customize meeting summaries](/customize-summaries) for templates, the Auto prompt, and dictionary terms. ## Export a session [Section titled “Export a session”](#export-a-session) 1. Open the **•••** menu in the meeting header. 2. Choose **Export**. 3. Select PDF, text, Markdown, or Org. 4. Choose whether to include the memo, summary, transcript, or any combination of them. The app writes the file to Downloads and reveals it in Finder. # Use the app offline > Prepare local models before you disconnect. You can record meetings and work with notes without an internet connection. Transcription also works offline once its model has been downloaded. ## What works offline [Section titled “What works offline”](#what-works-offline) * Create and edit notes. * Record and play meeting audio. * Export existing memos, summaries, and transcripts. * Transcribe with a downloaded on-device model. * Separate speakers in imported and after-recording transcripts, once the speaker-detection model has been downloaded. * Import and transcribe recordings from the terminal with `loofah import` and `loofah transcribe`, when the selected model is an on-device Soniqo model. * Generate summaries through a local LM Studio or Ollama server. A remote Intelligence provider still needs internet access. ## Prepare transcription [Section titled “Prepare transcription”](#prepare-transcription) 1. Open **Settings → Transcription**. 2. Download a model. 3. Select it under **Model being used**. 4. Make a short test recording before you disconnect. Do the download in advance. The model files are not bundled with the app. The speaker-detection model downloads automatically in the background the first time it is needed. Before you disconnect, check that **Settings → Transcription → Speaker detection** shows **Ready**. ## Prepare local summaries [Section titled “Prepare local summaries”](#prepare-local-summaries) Set up [LM Studio](https://lmstudio.ai/download) or [Ollama](https://ollama.com/download), download a language model, and select it in **Settings → Intelligence**. The local server needs to be running, but it does not need an internet connection once the model is available. If you want a meeting to remain fully local, check that the active Intelligence model belongs to LM Studio or Ollama. Transcription is already local. # Your first meeting > Set up Loofah and test it before your next call. The easiest way to learn the app is to make a short test recording. 1. **Install the app** Download the signed Apple Silicon build from the [latest release](https://github.com/bart6114/loofah/releases/download/updater/Loofah_latest_aarch64.dmg). You can also build it from the [source repository](https://github.com/bart6114/loofah). 2. **Allow audio access** Allow **Microphone** so the app can hear you. Allow **System audio** so it can hear the other people on a call. 3. **Download a transcription model** Pick an on-device model during setup. The app can continue while the model downloads, but transcription will not work until the download is complete. 4. **Set up summaries, if you want them** Connect a local server such as LM Studio or Ollama, or enter an API key for a supported provider. You can skip this and still record and transcribe meetings. 5. **Make a test recording** Open the **Welcome to Loofah** note, click **Record**, and say a few sentences. Click **Stop listening**, then check **Memos**, **Summary**, and **Transcript**. The Summary view only has content when an Intelligence model is configured and there is enough transcript to summarize. ## Record a real meeting [Section titled “Record a real meeting”](#record-a-real-meeting) Create a note, click **Record**, and leave the app running while the meeting is in progress. Loofah captures your microphone and system audio without joining the call. If either side of the conversation is missing, start with [audio troubleshooting](/troubleshooting#audio-is-missing). # Troubleshooting > Check the usual causes of missing audio, transcripts, and summaries. ## Audio is missing [Section titled “Audio is missing”](#audio-is-missing) Open **Settings → Permissions** and check both audio permissions: * **Microphone** captures your voice. * **System audio** captures the other people on the call. If macOS shows either permission as denied, use the button beside it to open System Settings. Restart Loofah after changing the permission. ## The transcript is not live [Section titled “The transcript is not live”](#the-transcript-is-not-live) Open **Settings → Transcription** and inspect the selected model. A model marked **After recording** does not produce text until you stop. The live streaming model supports English, so other selected languages also cause the app to transcribe after recording. If no transcript appears at all, confirm that the model download finished and that it supports the selected spoken languages. See [Languages](/languages). ## No summary appears [Section titled “No summary appears”](#no-summary-appears) Summaries need an Intelligence model and enough transcript text. Open **Settings → Intelligence** and select a model. For LM Studio or Ollama, make sure the local server is running and the selected model is available. See [Transcription and summaries](/ai-setup). ## A recording disappeared [Section titled “A recording disappeared”](#a-recording-disappeared) Check **Settings → App → Meetings → Audio file retention**. The app can remove audio immediately or after a set period while keeping the note and transcript. See [Data, privacy, and retention](/data-and-privacy#audio-retention) for the available values. ## An imported file does nothing [Section titled “An imported file does nothing”](#an-imported-file-does-nothing) Audio imports accept WAV, MP3, OGG, MP4, M4A, FLAC, WebM, and AAC. Transcript imports accept SRT and VTT. For audio, make sure a downloaded Transcription model is selected. See [Import audio or a transcript](/import-recordings). ## Get more help [Section titled “Get more help”](#get-more-help) [Open a GitHub issue](https://github.com/bart6114/loofah/issues) and include the app version, what you expected, and what happened. For CLI and MCP failures, use the [error reference](/reference/errors).