Using horch

Everything the app and its command line do, and how to drive them: from the first recording to the files it leaves on disk.

What horch is

horch is a meeting memory for your Mac. It records your meetings, transcribes them locally, and turns the confirmed transcripts into things you can use: prep briefings before you walk in, todos that file themselves, topic pages that track what moved, people pages that remember every promise, and a chat that answers from what was actually said.

Everything lives on your Mac as files and a local database. Audio never leaves the machine. The only network traffic is the one you opt into: an AI provider for summaries and chat (and you can keep even that local).

Every meeting moves through the same pipeline:

StatusWhat is happening
RecordingMicrophone plus the selected app's audio are being captured
TranscribingLocal transcription and speaker diarization are running
ReviewingThe draft transcript is waiting for you to confirm it
SummarizingThe summary is being generated
CompleteThe canonical Markdown files are written and indexed
FailedSomething needs your attention; the meeting can be retried

Nothing enters your library without the Reviewing step. horch only treats a transcript as truth after you confirmed it.

Install

  1. Download the DMG from horch.app/downloads and drag horch into Applications.
  2. Launch it. The first-run wizard walks you through setup in seven steps.

horch requires macOS 14 or later on Apple Silicon. The trial runs 30 days with everything enabled, no account required.

The first-run wizard
The first-run wizard

The wizard steps:

  1. Welcome. What horch is and what gets set up.
  2. Permissions. Microphone and Screen Recording are required to record (Screen Recording is how macOS grants access to another app's audio; horch captures audio only). Calendar, Notifications and Files & Folders are optional. Files & Folders only matters if you keep your workspace folder in Documents, Desktop or Downloads: macOS gates those, and asking here means the prompt does not interrupt you mid-meeting later.
  3. Calendars. Pick which calendars horch watches. Optional; skip it if you did not grant calendar access.
  4. Models. Downloads the transcription and diarization models. These run locally; nothing is sent anywhere.
  5. Workspace. Where your confirmed transcripts and notes are written as Markdown. horch picks ~/Documents/horch and creates it for you; change it here if you want them somewhere else.
  6. AI. Configure a summary and chat provider: a local model, an API key, or a subscription login. The picker states what your Mac has and warns before a model that needs more memory than it does. You can also pick "Not now" and set it up later; summaries, briefings and chat stay off until you do, and nothing else is affected.
  7. Ready. A setup summary, then the app opens.

Everything the wizard configures can be changed later in Settings, and the Setup Doctor (see Troubleshooting) re-checks all of it at any time. If anything is still missing, Today carries a "Finish setting up" card with the four things a meeting needs end to end (recording, transcription, AI, transcript folder) until they are all in place.

The main window

The main window on the Today tab
The main window on the Today tab

The toolbar carries six tabs: Today, Topics, Todos, People, Library, and Assistant. To the right sit the Ask control (⌘K) and the capture group: an auto-capture status dot and the record button. While recording, the capture group becomes a single stop pill with the source and elapsed time.

Calendar and the Setup Doctor are not tabs; they open from the Go to Pane menu or their shortcuts.

Keyboard shortcuts

ShortcutAction
⌘RNew recording
⇧⌘IImport audio
⌥SpaceQuick capture (global, works outside the app; configurable)
⌘KSearch and Ask palette
⇧⌘FFind in the current section
⌘FFind inside a transcript
⇧⌘1⇧⌘3Today, Todos, People
⇧⌘4Library, on the Notes shelf
⇧⌘5Library, on the Meetings shelf
⇧⌘6Assistant
⇧⌘7, ⇧⌘8Calendar, Setup Doctor
⌘1⌘5Switch workspace
⌘,Settings
⇧⌘APop the Assistant out into its own window

Record a meeting

The new recording sheet
The new recording sheet

Click the red record button in the toolbar (or press ⌘R, or use the menu bar item). Pick the source: horch records your microphone plus the audio of one selected app. Slack, Firefox, Safari, Chrome, Brave, and the macOS Phone app are supported sources.

While recording, the toolbar shows a stop pill with the source and elapsed time, and the menu bar item carries the recording dot, so you can stop from anywhere. When you stop, transcription starts immediately and the meeting appears in the Library with live progress.

Let the calendar start it

Settings > Calendar offers three modes:

ModeBehavior
ManualYou start every recording yourself
RemindA notification before each meeting, with a configurable lead time
Auto-startRecording starts by itself when a calendar meeting begins

The auto-capture dot in the toolbar shows whether auto-start is watching your calendar. Calendar attendees are used as suggestions during review; they are never assigned automatically.

Import existing audio

File > Import audio (⇧⌘I) takes either one mixed audio file or two separate tracks (microphone side and app side) and runs them through the same pipeline: transcription, review, summary.

Review and confirm

The review queue for a draft transcript
The review queue for a draft transcript

After transcription the meeting lands in Reviewing. This is the one manual gate in the pipeline: you decide what enters your library.

Review has two jobs:

Name the speakers. horch queues each detected speaker with a snippet you can play and suggestions drawn from the calendar event and your people directory. Press 1 or 2 to pick a suggestion, type for a type-ahead match, Space to replay the snippet, S to skip a speaker, U to undo. Your own microphone side is pre-filled from your local profile and stays editable. Speakers that are actually the same person can be merged.

Fix the text. Edit any turn's text, merge adjacent turns, or split a turn in two where the diarization got it wrong.

When it reads right, confirm. Confirmation publishes the canonical Transcribed.md into your workspace folder, kicks off the summary, and from then on the meeting counts as truth: search, chat, topics, todos, and people pages all build on confirmed meetings only.

If the transcript is wrong, read the recording again. The recording is the record; a transcript is one reading of it. Transcribe again in the meeting's overflow menu (the three dots) re-runs local transcription with your current models, keeping the meeting and its timestamps.

Library

Library is the archive: everything horch keeps, on three shelves. Meetings (recorded) holds every confirmed meeting and thread. Notes (yours) holds what you wrote or captured. Artifacts (what horch wrote) holds the Markdown documents a routine or a session produced. Each shelf row states its own voice, so what you are looking at is never ambiguous.

Meetings

A complete meeting in the Library
A complete meeting in the Library

A complete meeting opens on its Summary (editable), with the full Transcript one pill away: confirmed turns with speakers and timestamps, in-transcript search and speaker filters (⌘F), and audio playback anchored to the words. The page also carries the meeting's notes pad, the todos that came out of this meeting, and chips for the topics it moved.

From here you can rename a meeting (the title updates everywhere), export the transcript, ask the assistant about the meeting, and delete it with all horch-owned artifacts after a confirmation.

Transcribe again is available on a confirmed meeting too, for a transcript that turned out badly. It discards everything the old reading produced first (the transcript and its speaker names, the summary, the published Transcribed.md and Summary.md, and the todos and person facts extracted from the meeting), then reads the retained audio again and puts the meeting back in review so you can name the speakers before a new summary is written. The recording, the title and the timestamps are kept. The confirmation names what goes, including how many todos and facts are attached. It is unavailable if the recording was not retained.

Meetings are not the only row on this shelf. Capture conversation in the Library rail starts a thread: paste or type an async conversation (a Slack exchange, a chat log) message by message, name the participants through the same guided queue as a meeting review, and confirm it. Confirmed threads file into the same timeline as meetings and feed topics, todos, and people pages exactly the same way; the footer counts both ("74 meetings · 4 threads").

Notes

Press the global capture hotkey (⌥Space by default) anywhere on your Mac and a small popup takes a note: spoken (transcribed locally when you stop) or typed. Outside a meeting it defaults to voice; during a recorded meeting it defaults to typing and files into that meeting's notes. All of this is configurable in Settings > Capture.

The quick capture popup
The quick capture popup

The Notes shelf collects everything you wrote, in two panes: Processed shows cleaned-up note cards, Raw is the Markdown browser and editor for what has not been processed yet. Processing a note runs it through your AI provider to produce cleaned-up text and extract todos and links; the raw dump always stays, and a queue with Process and Retry works through the backlog. New note starts one from the shelf itself, and the section's own search narrows the list.

Notes are Markdown files in your workspace folder. Edit them in any editor; horch rescans the folder and reconciles external edits. A plain .md file dropped into your workspace, including into the artifacts/ folder below, is adopted as a Note without being moved.

Artifacts

A routine that leaves an Artifact writes a Markdown file, real on disk inside your workspace folder's artifacts/ subfolder, readable and editable without the app. An Artifact is a sibling of a Note with the opposite voice: a Note is what you said, an Artifact is what horch concluded. Any session can produce one too ("write that up"), not only a routine. A routine that leaves a one-line nudge writes no file: the nudge is a line on Today, not a kept document, and its text stays on the run record.

Ask the assistant in any session to write something up and it publishes an Artifact the same way a routine does, onto the same shelf, with its provenance reading from a session instead of naming a routine. Every write creates a new document: horch keeps every artifact and never rewrites one, so editing an old one is your job in your own editor, which is the point of keeping them as plain files.

An artifact page carries a provenance strip (the routine, the run, and Open session when one still resolves), a visible as of chip because it is a snapshot of the run's moment and not a live view, the file path with Show in Finder, and Edit to open the raw Markdown. An artifact edited outside the app is marked edited by you, because it is then no longer purely horch's voice.

An artifact is never a Receipt. Every claim horch makes cites a primary source: a meeting, a thread, or a note, never another artifact. That is a deliberate guarantee rather than an omission: if horch could cite itself, one misread quote would become the evidence for the next conclusion, and the chain would look sound at every link while resting on nothing. The assistant does not read your artifacts back when it answers you today. Runs are pruned after 90 days; artifacts are kept forever, so an old artifact can outlive the run that produced it and still name the routine that wrote it, even once Open session no longer has anywhere to go.

Today and briefings

The Today tab
The Today tab

Today is the landing surface: a short narrative over the day, the shape of the day as a timeline, the next meeting with its prep, what is due today, and what your last active day distilled to (with anything still waiting for review).

Meeting briefings are automatic. horch preps today and the next day ahead of time: a catch-up sweep on launch, a nightly tick at midnight, and a refresh whenever a newly confirmed transcript makes an existing briefing stale. You never have to ask for a briefing; when you open the meeting or Today, it is there. A briefing pulls together where you left it with these people, open todos that involve them, and relevant lines from your notes.

Topics

The Topics board
The Topics board

Topics are the threads that run across meetings: a project, a decision, a recurring theme. No topic exists uninvited: horch proposes themes it keeps hearing across your confirmed meetings, and the Triage queue is where you decide each one once: Track it (optionally renaming it), Merge it into an existing topic, Later, or Dismiss. Only tracked topics reach the board. Each proposal leads with its stake, what is actually unresolved and what it costs to leave the theme untracked, above the recurrence counts and the moment that tipped it. The raised-by faces are live: hover one for the full name, click it for that person's page.

The board shelves topics by health: Needs you (at risk or blocked), Moving (on track), and Steady & quiet, with parked topics hidden behind a count. Health is judged by the AI after each confirmed source, and it is never a bare label: every verdict says why the topic reads that way and lists what would move it: up to three concrete things you could do, each linked back to the moment it came from. When there is genuinely nothing you can do, it says so rather than inventing an action. You can override a health from a topic's health chip with a required one-line reason, and your override sticks until material new evidence arrives. Settings > Diagnostics also offers "Reassess topic health" to re-judge every tracked topic from its stored evidence on demand.

Each topic keeps a living case file:

  • a stands-at: where the thing currently stands, sentence by sentence,
  • a ledger: dated decisions, commitments, and risks, each backed by a receipt into the meeting it came from,
  • what is owed and by whom, open questions, and a 14-day momentum pulse.

Click a topic for its glance panel; the full page opens from there. The rail filters by health, and F focuses a filter field over titles and stands-at text. Topics never nag; there is no unread count to clear. A topic that goes quiet for weeks with nothing owed surfaces as a park candidate instead of lingering. Derivation tuning lives in Settings > Topics.

Todos

Triage with the inspector open
Triage with the inspector open

Todos collect themselves from four sources: things said in meetings, lines in your notes, chat, and ones you add by hand. Nothing lands in your lists uninvited: every extracted todo passes through Triage once, where you file it with one key: I owe it (I), Someone owes me (W, with an owner), or Not a todo (X, recoverable from Cleared). The inspector shows the extraction's due date, person, and verbatim quote so you can correct them before deciding.

One pool of todos, viewed through perspectives in the rail: Triage, I owe, Owed to me, and Everything, with Cleared (done and dismissed, restorable) at the bottom. Above the list, a 14-day forecast strip shows the due-date load; clicking a day filters the list to it. A filter field (F) narrows by person, topic, meeting, or source.

Selecting a todo opens the inspector: the one place a todo is edited. Due chips (Today, Tomorrow, +1d, +1w) plus a calendar picker for any date, the type toggle, people, and notes, all reachable from single keys while the inspector is open.

Quick-add parses natural language: call @ada about infra by fri ties the todo to Ada with a due date of Friday. @ opens a people type-ahead.

When a later meeting sounds like a todo got done, horch attaches the evidence and suggests it: "Check it off" completes it, "Keep open" dismisses the suggestion. Nothing completes itself.

The same commitment raised in three conversations is one todo carrying three mentions, each keeping the conversation it came from and the verbatim quote. The row shows the count and nothing else moves: a repeat is information, not urgency. Because the match can be wrong, every merge stays reviewable and reversible. A meeting and a thread list what they merged under Repeats on their own page, right where you confirmed them; a capture has no confirm step, so its merges wait in Triage next to the unsorted todos. Keep merged leaves the mention where it is; Separate lifts it back out into its own todo, quote and receipt intact, which then waits in Triage to be sorted.

People

A person page
A person page

People is a directory derived from your confirmed meetings; you never maintain it. A person's page collects every meeting you had with them, the open loops between you, and the memories scoped to them. Names come from your speaker confirmations during review, so the directory is exactly as good as your reviews.

Ask and the Assistant

The ⌘K palette
The ⌘K palette

⌘K opens the fastest door: type a question, press Return, and horch answers inline with citations that jump straight into the cited meeting. Arrow onto a search result instead and Return navigates to it. "Ask in chat" hands the question off to the full Assistant.

The Assistant tab is the long-form surface: every session over your whole library, everything horch runs by itself, and its continuity layer, all in one place. Its rail carries, top to bottom: New session, Recent (your sessions and routine runs in one timeline, newest first, a run marked with its own glyph so it reads apart from a plain session; three chips under the header switch between Sessions, Runs, and All, and it opens on Sessions, because a few built-in routines firing on every confirmed meeting will bury a week of your own sessions inside a day), Routines (the registry, covered below), a divider, then Soul, Diary, and Skills. ⇧⌘A pops the whole Assistant out into its own window: same surface, same live state, useful when you want it beside another app instead of behind a tab.

A session can search your confirmed meetings, read your notes, look at your todos and add new ones, and recall what you taught it. Only the retrieved, relevant excerpts are sent to your provider, never the library wholesale, and audio never leaves the Mac.

A few things make the Assistant yours over time, each managed from its own rail row, except scoped memories, which live on the page of the person or meeting they are about:

  • Scoped memory. Tell it to remember something about one person or one meeting and it persists as a fact, a preference, or a standing instruction, recalled only when that subject is pinned. There is no memory about you in general: that is what the Soul and the Diary below are for. Each one is managed where its subject lives, under From chat on the person's page or on the meeting's "Out of this meeting" rail, where you can edit or delete it. horch memory does the same from the terminal.
  • Skills. Reusable instruction sets (Agent Skills) the assistant can use. Curated built-ins ship with horch; add your own by writing a SKILL.md or dropping a skill folder onto Skills in the rail, and enable or disable each one.
  • Soul and Diary. Off by default, behind one switch in Settings > Privacy. Turn it on and horch asks a handful of questions about how you want it to behave, and writes the answers to a Soul it reads into every chat turn. From then on it keeps a private Diary of what it judged worth keeping, from chats and from meetings you confirm. Everything is plain Markdown on your Mac and nothing syncs. Every entry the Diary wrote is visible there, and you can correct one or delete it outright, so a wrong entry never keeps feeding what reads it next. A quiet line at the top of that rail row says what the layer has done since you turned it on: how many chat turns, confirmed meetings, and confirmed async captures it read, how many of each it kept something from, and when it last read and last wrote. Most of what it reads is meant to pass, so chances far outnumbering entries is the normal shape; that line is there so an empty Diary is never a mystery. Turning the switch off stops every write, the schedule, and the injection, and leaves every file where it is. The Dream routine, covered below, distills the Diary nightly, weekly, and monthly into Themes, and can propose a change to the Soul; proposals wait in the Soul row for you to accept or reject, and accepting is the only thing that changes the Soul.

Routines

A routine is one prompt horch runs for you by itself: a trigger, a prompt, what it is allowed to do, and where the result lands. One prompt, one run. There is no canvas, no branching, no steps, and no routine that starts another; if you want two things done, write two routines.

Routines have no tab of their own. Routines in the Assistant rail opens the registry: the whole list, in two groups. Built in holds the three routines horch has always run by itself, now visible instead of hidden: meeting Briefing, the assistant's Dream, and Topic curation. Yours holds the ones you wrote. Every row has a switch, and switching a built-in off actually stops it: no briefing is prepared, no Dream runs, no curation pass fires. The rail's own All, Waiting, and Failed views sit under the Routines row while the registry is open; the merged Recent timeline above it is the fastest answer to "what did horch just do".

Built-in prompts are editable, with one honest limit: your edit is added to horch's own instructions, not put in their place. Each routine builds its prompt in two parts, a fixed wrapper horch wrote and your template passed alongside it, so you can tell Dream what to weigh or tell Briefing what you always want called out, but you cannot overrule a built-in rule like "do not invent anything absent from the inputs". Their trigger and their output are fixed too: a built-in runs on its own machinery, so the page shows what it does rather than a schedule you can change. Dream absorbed what used to be its own tab: its inspector holds its config, its Kept Themes, and its runs, and a run's record carries a What it read section holding the verbatim input snapshot alongside the Themes that run kept, present even when the run failed partway through. Briefing is the opposite of a page: a briefing belongs to the meeting it prepared, so its inspector holds only its switch and its prompt, and clicking one of its runs, in the registry or the rail's Recent timeline, opens that meeting directly rather than a run record, once the meeting has actually been recorded.

Writing one

There is no new-routine button. You describe standing work in any session, in a sentence: "every Friday at 17:00, tell me honestly how the week went". Schedule words like "every", "daily", or "Fridays at" trigger the read-back immediately: the assistant answers with a draft card stating what it understood, field by field: name, Runs (the trigger), Prompt, Can (the capability), Leaves (the output). Event phrasing without a schedule word ("when a topic turns blocked, write up the options") gets one line first, "Keep this as a routine?", and the card only appears after you say yes. Reply to correct anything and the changed field shows a diff chip. Create routine saves it; nothing exists until you press it. Just answer once runs the same prompt right now, as an ordinary answer, and leaves the registry untouched, the escape hatch for over-detection.

When it runs

On a schedule. Daily, weekly or monthly at a local time. If your Mac was asleep at the hour, the run catches up at the next wake instead of being silently skipped, and the catch-up is bounded: a Mac that was off for a month owes one run, not four.

When something happens. Today that means a source you confirm (a meeting, a thread, or a processed note, optionally narrowed to one meeting series, attendees, or topics) and two todo signals: a todo going overdue, or a todo staying open for a number of days you pick.

Narrowing by a rule. Series, attendees and topics cover most routines, and some conditions none of them can state: only Experiment 1, 2, 3 or 5 syncs, any meeting whose title mentions hiring, but never a backfill. Describe one of those when you author the routine and the assistant writes it as a rule: a small condition over the source's kind and its title, series, attendees, or topics, joined with and/or/not. The rule is checked by horch before anything runs, so a source it excludes never starts a run at all. That matters more than it sounds: the alternative is putting the condition in the prompt, where only the model can read it, which means the routine fires on everything and then decides it should not have. The routine's RUNS line reads the rule back in plain language, and a RULE section on its page shows the rule itself, editable, with Remove rule to go back to matching everything the named fields admit.

Meeting-driven routines fire on your confirm, never when the meeting ends. That is the same rule as everywhere else in horch, and it is why a routine can sit in waiting: the meeting is recorded, its draft is ready, and the run is held until you confirm it. Waiting is always stated, never silent, in three places: the row's status, a box at the top of the routine's own page with Review transcript, and a waiting card on Today.

What it is allowed to do

Three rungs, one per routine, called the capability level:

RungWhat the run can reach
ReportReads horch: meetings, notes, threads, todos. Writes nothing back. The default
ProposeAlso writes drafts: todos land in Triage unsorted for you to file. Nothing becomes canonical without you
OperateExactly what the Assistant can do, the shell included

Operate deserves a plain sentence: it is the full assistant toolset, it runs unattended, and it can reach the network. horch does not restrict it further when nobody is watching; it marks it instead, in purple, never red, because Operate is reach, not error. The rung carries a purple badge on the row, a stronger description where you pick it, and a banner on every run record it produces, and that record lists the files the run read and wrote. Pick it when a routine genuinely needs to act; the assistant never proposes it for you.

Whatever a routine writes still goes through the normal gate. A routine-created todo arrives in Triage unsorted, marked with the routine and run that created it, and keeps the real receipt of the promise it came from.

Reading the results

A run that decides there is nothing to do leaves nothing at all: no run record, no card on Today, no artifact, not even a session. A routine whose condition a rule cannot fully state ("...and only when it reads like a real update") still has to start to make that call, and when the answer is "not this one", horch keeps no trace of having asked. A run you started yourself, with Run now or Run again, always answers: a button that can come back with silence is a broken button.

Finished runs reach you on Today, under the day's own material, in a From routines group, and only there. It is weighted by what it is: a report card with an excerpt and receipt chips, a one-line nudge with no card around it, a waiting card, or one gray line listing runs still ahead of you. Successful runs never notify you. Failure never appears on Today: it shows as the amber dot on the Assistant tab, a red row in the registry, and the run record itself with a Retry now, written in plain language.

Every run of a routine you wrote is a real Session: it reads your Soul and writes what it kept to the Diary when the continuity layer is on. Open it from the run record or from Today and keep talking to it with its whole context intact. A built-in's run is logged like any other but has no session of its own: it is its own pipeline doing what it always did. Run records are kept for 90 days; artifacts a run produced are kept forever regardless; the sessions follow normal session retention.

Two boundaries: routines run only while horch is open, on this Mac, and nothing they produce leaves horch. There is no Slack, email or webhook delivery, and the Companion neither writes nor runs routines.

AI providers

Transcription and diarization always run locally with the models installed during onboarding (Settings > Models). The AI provider only powers summaries, chat, note processing, briefings, and topics.

horch installs and manages its own isolated AI runtime (a horch-owned Pi runtime with its own profile). It never touches your system's tooling or credentials. Three ways to power it, in Settings > Provider:

  1. Local. horch manages a local model runtime (Ollama) and a curated model list, with a recommendation for your machine. Fully offline.
  2. API key. Anthropic, OpenAI, or Google. The key is validated and stored in the isolated profile.
  3. Subscription login. Sign in with an existing provider subscription through the isolated profile.

Workspaces

A workspace is one self-contained brain: its own meetings, notes, todos, topics, people, and settings. Keep one, or separate contexts (say, two jobs) into several. Switch with the workspace switcher in the sidebar or ⌘1 through ⌘5. The CLI follows the app's active workspace and takes --workspace <NAME> to target another.

Your files

horch is files first. Everything confirmed or written is plain Markdown in the workspace folder you picked during onboarding:

  • Transcribed.md per meeting: the canonical confirmed transcript.
  • Summary.md per meeting: the generated summary.
  • Your notes as individual .md files.
  • Artifacts as individual .md files under artifacts/, one new subfolder added inside the same workspace root; nothing existing moved to make room for it.

Where transcripts land inside the folder is a template (Settings > Storage) built from tokens like {date}, {calendar}, {title-slug}, and {meeting-id}.

The files are yours: sync them, version them, open them in Obsidian. If you edit a Markdown body externally, horch re-indexes the text for search; it never overwrites your edit, and external edits never corrupt the internal transcript data.

Recordings, the database, and internal state live in horch's Application Support directory and stay on the machine.

Backup and restore

Settings > Storage exports a single .tar.gz archive of your local data: the database, your Markdown files (meetings, notes, and artifacts), and retained audio payloads. Secrets (provider credentials) are never included. Restore accepts the same archive. The same operations exist as horch backup export <path> and horch backup restore <path>.

Settings reference

⌘, opens Settings, grouped like System Settings:

GroupPaneWhat lives there
MeetingsGeneralLaunch behavior, appearance, the command line tool
MeetingsRecordingSources, system-audio fallback, raw-audio retention
MeetingsCaptureQuick-capture hotkey, voice/typing defaults, meeting filing
MeetingsCalendarManual, remind, or auto-start mode; reminder lead time; watched calendars
IntelligenceModelsTranscription and diarization models, acceleration
IntelligenceProviderLocal model, API key, or subscription login for the bundled runtime
IntelligencePromptsCustom prompt templates for summaries and chat
IntelligenceTopicsTopic derivation tuning
IntelligenceAgent accessServe your memory to AI agents over MCP; one-click agent setup
DataStorageWorkspace folder, path template, backup and restore
DataPrivacyWhat is retained, what is sent, and to whom
DataSyncDevice sync, off by default
AccountLicenseTrial status, activation, license management
AdvancedDiagnosticsSetup Doctor, jobs, topic tools (recreate, reassess health), diagnostic bundles

The command line

Everything above is also a CLI. Install it from Settings > General > "Install command line tool" (an administrator prompt creates a symlink at /usr/local/bin/horch pointing into the app bundle, so app updates keep the CLI current). Then:

horch --help

Conventions that hold across the whole CLI:

  • Every read/write command takes --json for stable, scriptable output.
  • Every command takes --workspace <NAME> to target a workspace other than the app's active one.
  • horch help <command> or -h on any level prints the full usage.
# a taste
horch record start --source Slack
horch record stop
horch review show <meeting-id>
horch review confirm <meeting-id>
horch search "budget freeze" --limit 5
horch todo add "call @ada about infra by fri"
horch chat tui

Setup and health

CommandWhat it does
horch doctorCheck storage, database, credentials, models, and provider readiness
horch model listList verified transcription/diarization models with installed and active state
horch model setup-local --transcription <id>Install and activate the default local model configuration
horch model install / activateInstall or activate verified models by id
horch model activate-customActivate your own model files
horch ai setup / update / readinessInstall, update, or check the bundled Pi runtime
horch ai provider statusShow configured providers and the default provider/model
horch ai provider set-key <provider>Store an API key for anthropic, openai, or google (read from stdin, never argv)
horch ai provider sign-out <provider>Remove a stored credential
horch ai loginSubscription login through the isolated profile
horch ai local status / install / models / pullManage the local (Ollama) runtime and curated chat models
horch ai openOpen an interactive session in the bundled runtime
horch ai envPrint non-secret runtime and environment paths

Recording and the pipeline

CommandWhat it does
horch record start [--source <app>]Start a microphone plus app recording
horch record stop / statusStop the active recording; show what is recording
horch record recoverMark stale recordings failed so recording can start again
horch import --mixed <file>Import one mixed audio file
horch import --mic <file> --app <file>Import separate microphone and app tracks
horch meeting list / show <id>Browse persisted meetings
horch meeting transcribe <id>Run local transcription and diarization
horch review show <id>Print the draft transcript for review
horch review rename-speaker / merge-speakersName or merge draft speakers
horch review edit-turn / merge-turns / split-turnFix the draft text
horch review confirm <id>Confirm the draft and publish Transcribed.md
horch summary readiness / generate <id> / show <id>Check, generate, or print a meeting summary
horch meeting prep generate / regenerate / show <id>Manage a meeting's prep briefing
horch meeting rename --title <t> <id>Rename a meeting everywhere
horch meeting index --transcript <path> <id>Index an externally confirmed transcript for search
horch meeting delete <id>Delete a meeting and all horch-owned artifacts (asks; --yes to skip)
horch job list / show / cancel / retryInspect and control processing jobs
horch job recover-interruptedRecover jobs left running by a crash as interrupted

Working with your library

CommandWhat it does
horch search <query>Full-text search across confirmed meetings
horch chat tuiCross-meeting chat in the terminal
horch calendar view [--today <date>]The day's recorded and upcoming meetings
horch note add <text> [--meeting <id>]Capture a note into the inbox or a meeting
horch note list --view <inbox|ideas|reminders|meeting-notes|archive>List notes per view
horch note show / edit / archive / deleteManage one note
horch note process [<id> | --all-raw]Run AI processing on one note or the raw backlog
horch note rescanReconcile external edits to the Notes folder
horch todo list --lens <loops|everything|by_meeting|triage|cleared>Project the todo pool through a lens (triage backs the Dated and Waiting views)
horch todo add "<input>"Quick-add with @person and a due phrase (--preview to parse without creating)
horch todo edit / complete / reopenUpdate a todo
horch todo delete / restoreDelete a todo (prints a restore snapshot) and restore it
horch todo accept / keep-open <id>Resolve a sounds-done suggestion
horch people list [<query>] / show <id>Browse the people directory
horch memory listList every scoped memory
horch memory recall --scope <person|meeting> --scope-target <id> <query>Search one subject's memories
horch memory remember <text> --scope <person|meeting> --scope-target <id> [--kind]Persist a new memory about a person or a meeting
horch memory edit / delete <id>Change or remove a memory
horch workspace listList workspaces and mark the active one

Configuration and data

CommandWhat it does
horch settings transcript-workspace set/showThe folder confirmed Markdown is written to
horch settings transcript-path-template set/showThe path template ({date}, {calendar}, {title-slug}, {meeting-id})
horch settings prompts show/summary set/chat setPrompt templates for summaries and chat
horch settings calendar set --mode <manual|remind|auto-start>Calendar recording mode
horch settings capture setQuick-capture hotkey and defaults
horch backup export/restore <path>Backup archive out and in
horch diagnostics bundle <path>Metadata-only diagnostic bundle

Agent access (MCP)

Your AI agents can use horch's memory too. The running app serves an Agent surface over MCP: five read tools (horch_search, horch_meeting_get, horch_person_get, horch_todos_list, horch_topic_get), two writes (horch_capture_add, horch_todo_set_status), and a health check. An agent on your Mac, say Claude Code working in a repo, can ask what was decided in a meeting, trace a todo back to who said it, or file a capture into your inbox.

Three properties make this safe to trust:

  • Every claim carries a Receipt: the source meeting, timestamp, speaker, and verbatim quote, so the agent cites your meetings instead of paraphrasing from thin air.
  • Same-machine only, with one deliberate exception to "nothing listens": the surface is a localhost-only, token-protected HTTP endpoint served only while horch is running. It is unreachable from the network, every request needs the access token from Settings, and nothing leaves the machine. Close horch and it is gone.
  • Writes are limited to adding a capture and checking off a todo. No agent can edit your meetings, transcripts, facts, or summaries.

Connecting an agent

Settings > Agent access detects the agents installed on your Mac (Claude Code, Cursor, Windsurf, VS Code, opencode, pi, Codex) and connects any of them with one click: horch writes a single horch entry into that agent's own MCP config, carrying the endpoint URL and your access token. Where the agent supports skills (Claude Code, opencode, pi, Codex), the click also installs the connecting-meeting-context skill, which teaches the agent the tool surface and the Receipt model. Codex reads the token from the HORCH_AGENT_TOKEN environment variable; the pane has a copyable export line for your shell profile.

For any other MCP client, register a streamable HTTP server manually (URL and token are both copyable in Settings > Agent access):

{ "mcpServers": { "horch": { "url": "http://127.0.0.1:46724/mcp", "headers": { "Authorization": "Bearer <your token>" } } } }

Clients that only speak stdio (Claude Desktop's JSON config, older tools) can bridge with a generic shim, for example npx mcp-remote http://127.0.0.1:46724/mcp --header "Authorization: Bearer <your token>".

One boundary worth knowing: full verbatim transcripts are returned only when the agent explicitly asks for them (horch_meeting_get with verbosity: detailed). Summaries, receipts, and excerpts flow freely; the word-for-word record never leaves by default.

Updates

horch checks for updates and installs them in place (Sparkle). "Check for Updates" lives in the app menu. Release history and direct downloads are on horch.app/downloads. Updating the app also updates the installed CLI, since the command is a link into the app bundle.

License

The trial runs 30 days from first launch with everything enabled; a quiet pill in the toolbar shows what is left. After buying, the key arrives by email; activate it under Settings > License. One license covers 2 Macs at the same time, includes 1 year of updates, and the versions you have keep working forever. Details on pricing.

Troubleshooting

  • Setup Doctor (⇧⌘8, or Settings > Diagnostics) re-checks permissions, storage, database, models, credentials, the provider, and the transcript folder, and offers fixes for whatever is red. The same checks run as horch doctor (add --json for scripting).
  • A model download failed while you were away: the toolbar keeps a "Model download failed" pill until you deal with it. Click it to see why and try again.
  • Something failed with a "Copy details" button: the message says what happened and the button beside it goes where it can be fixed. "Copy details" puts the underlying technical error on the clipboard for a bug report.
  • A recording will not start because a previous one looks active: horch record recover marks stale recordings failed.
  • A meeting is stuck or failed: open it in the Library for the failure state and retry, or use horch job list and horch job retry <id>. After a crash, horch job recover-interrupted cleans up jobs left in a running state.
  • The horch command stopped working after the app was moved or deleted: horch detects the broken link at launch and offers to repair it, or reinstall it from Settings > General.
  • Reporting a problem: horch diagnostics bundle <path> creates a metadata-only archive (no audio, no transcript text) you can attach, and the Support link in the footer reaches us.