Skip to content

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] provider is 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 than endGraceSec (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"; auto is reserved and behaves like ask.
  • 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 (Teamscom.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.