Recording¶
Two tracks, echo-cancelled later¶
Rex records the microphone and the system audio as two separate raw mono tracks (AAC, 48 kHz,
recording.m4a). Echo cancellation is applied in the transcription pipeline, not live: the mic
track is delayed by [audio] micDelayMs (default 150 ms) and run through WebRTC AEC3 against the
system track, so your speakers' playback of the other participants does not end up in your
transcript. Stop and re-transcribe with different AEC settings any time - the raw audio is kept.
The file is written fragmented ([recording] fragmentIntervalSec, default 5 s). If Rex or the Mac
dies mid-meeting, the file is still playable up to the last fragment and Rex marks the meeting
recovered and transcribes it on the next launch.
Starting a recording¶
- Menu bar › Record / Stop, or the timer item while recording.
- Top-bar prompt when a meeting is detected (below).
rex://record,rex://toggle(see Automation).rex record --title "Weekly sync"from a terminal (Ctrl-C stops).
Only one recording at a time. A second request is refused, never stacked.
Meeting detection¶
Rex watches Core Audio for the apps in [[detection.apps]] (Teams, Webex, Zoom by default)
starting to capture the microphone - playing audio alone is not a meeting. The detector polls
every 2 s; after 8 s of continuous mic use a bar appears at the top of the screen:
Meeting detected in Microsoft Teams - Weekly sync - Record · Ignore
- Record starts a recording named from the window title (
titleSource = windowTitle, needs Accessibility) or the app name, or from the calendar when[calendar] provideris on (titleSource = calendar). - Ignore hides the bar for the rest of that call.
autoDismissSec> 0 makes an unanswered bar disappear by itself; when the app releases the mic for longer thanendGraceSec(20 s) the bar goes away too.- If you are recording a detected meeting and the app releases the mic for
endGraceSec, the bar changes to Meeting ended - still recording with Stop and Keep. Rex only offers to stop; it never stops a recording on its own. - Per-app
rule = "ask" | "ignore";autois reserved and behaves likeask. - Nothing is detected while a recording is running. Rex never starts a recording silently.
Apps are matched by bundle id; an entry with an empty bundle id matches by name
(Teams → com.microsoft.teams2), which is what the Add button in Settings › Detection produces.
Calendar titles¶
With [calendar] provider = "outlookSnapshot", Rex reads New Outlook's local calendar-widget cache
(~/Library/Group Containers/UBF8T346G9.Office/Library/Application Support/Calendar Widget/store.json,
read-only; roughly five days around today). A meeting that is on the calendar right now (started up
to 10 min from now, or ended less than 15 min ago) names both detected and manually started
recordings. Settings › Detection › Calendar shows what it would pick at this moment. Nothing is sent
to Microsoft; there is no Graph access.
While recording¶
The top bar shows a red dot and the title; the menu-bar item shows the elapsed time. The capture path is kept free of anything that can crash: models are not loaded, the transcription queue waits, and retention does not sweep. Workflows still run — they are separate processes and cannot take the recording down. If the microphone disappears (USB unplug) the system track keeps recording and the event is logged.
After a recording¶
Transcription starts immediately (unless another job is running; then it queues). When it
finishes: a top-bar toast, a macOS notification with a sound ([notifications]), the
transcript-ready workflows, and auto-export if [export] auto = true.
Backfilling title and attendees¶
Both lookups run once, when a recording stops. For a meeting recorded before the providers were
enabled (or that missed its lookup), the toolbar's Refresh Details button — or
rex backfill <folder> — re-runs the calendar title lookup and the Teams attendance lookup and
updates meeting.json plus the Markdown frontmatter. A manual title is never overwritten, and
existing attendees are only replaced when the lookup finds a match. The Teams store carries the
full invite list for anything on the Exchange calendar — Webex and Zoom meetings included — via
its cached Outlook calendar event records. Limit: the Outlook title snapshot covers roughly five
days around today, so titles on much older meetings usually cannot be backfilled.