Skip to content

Limitations

What ScribeKit does not do, stated plainly. Nothing here is a bug report; these are consequences of decisions, and several of them are deliberate.

Platform and distribution

  • macOS 26.5 or later, and Apple Silicon. Earlier macOS versions are not supported and will refuse to launch the build. Apple Silicon is the only architecture ScribeKit has been built and validated on; the project produces a universal binary, but Intel is untested.
  • No signed or notarized application. v0.2.0 is a source release: there is no disk image and no download to install, and ScribeKit must be built from source. Signed distribution is deferred. See Releases.
  • The on-device speech model must already be installed for the recognition language. ScribeKit does not download models and has no network fallback.

Not built

  • No continuation of an interrupted meeting. An unfinished meeting is preserved and can be marked as interrupted; ScribeKit does not append a later capture run to it. Start a new meeting to carry on recording and transcribing. This is a decision, not an omission: a retained recording cannot be reopened and written to without replacing it, a meeting killed while capturing has recorded no captured length for a later run to continue its offsets from, and continuing honestly would mean a second audio file per session — which changes what a session directory is, what session.json names and how review playback finds the audio for an offset. See Recovery.
  • No speaker labels. A transcript does not say who spoke. Apple's frameworks provide no speaker diarization, and the Apple-native approaches that were measured could not separate more than two voices, or two similar ones, reliably enough to show. ScribeKit also never identifies people by voice. See Speaker Diarization Research.
  • No editing, renaming or deleting. Transcript history is read-only; the files are yours to manage in the Finder. Export writes an exact copy of a transcript where you choose, and there is no Share menu, PDF or other format.
  • Integrity checking is evidence, not protection. The checksum ScribeKit records sits beside the transcript in an ordinary file, so editing both makes a changed transcript verify. Meetings recorded before checksums existed, and meetings ScribeKit stopped during, cannot be verified at all. A transcript's recording is not checksummed.
  • No search over your notes. History's search runs over titles, transcripts and source names.
  • No filesystem watcher. History reads the folder when it opens, when you refresh, and when a meeting finishes.

Security and durability

  • Nothing is encrypted. The transcript, the session record and any retained recording are ordinary files in the folder you chose, as private as that folder is.
  • Not crash-proof. A finalised span reaches the file as soon as it is recognised, so it survives the app exiting; surviving a power loss depends on the flush that happens every 25 appends and at Stop, so an abrupt power cut can cost the appends since the last flush.
  • A start that fails after the transcript was created leaves the folder behind, holding a transcript with a header and no speech. ScribeKit does not delete folders it created.
  • A damaged or newer-format record is left exactly as it is. ScribeKit never repairs, rewrites or deletes one.
  • A session written by an earlier ScribeKit has no record, so it is not recognised as unfinished, and it has no identity for notes or marks to attach to. Its transcript is unaffected.

Capture

  • The captured set is fixed when capture starts. So are the title, save folder, language and retention mode; their controls are disabled while a meeting runs.
  • The permission is the screen recording one. ScreenCaptureKit has no audio-only stream, so the filter names a display. No screen output is added, so no frame is delivered or processed.
  • A captured application that quits mid-capture leaves the stream alive delivering silence for it. Nothing is substituted, and the next start reports it as unavailable.
  • Only applications owning an ordinary on-screen window are listed, so a menu-bar-only or windowless application is not offered as a source.
  • The application list is refreshed on appearance and on demand, not as applications start and quit.
  • Audio in an unexpected format is refused rather than resampled, because a file's format is fixed when it is created.
  • There is no button that opens the System Settings pane. macOS exposes no supported API for opening a specific privacy pane, so ScribeKit names the path in words rather than hard-coding an undocumented URL.
  • Nothing watches for the permission to be granted. ScribeKit checks when you press Refresh and not otherwise; there is no polling and no notification to subscribe to.
  • A permission never asked for and one refused look the same. ScribeKit reports that access is unavailable rather than claiming which it was.

Microphone

See Microphone Transcription.

  • One capture mode per meeting. A meeting transcribes the selected applications or the microphone, never both, and the mode cannot change while it runs. There is no mixing, no speaker separation and no identification.
  • One microphone per meeting. The input is fixed when a meeting starts — System Default is resolved to a device then — and a meeting never follows the Mac to another one. A meeting whose microphone is disconnected, rerouted, reformatted or stopped by macOS ends as interrupted; it is not restarted, even on the same device once it is reconnected, because the stretch in between would be a hole in the transcript with no marker for it.
  • Output changes are judged by evidence, not yet by observation on every kind of hardware. Connecting headphones or switching the default input leaves a meeting listening when Core Audio and the audio engine report its input unchanged and still running. If macOS stops the audio engine for an output change, the meeting ends as interrupted rather than restarting. The rule was checked by hand on one M1 Mac before v0.2.0; other Macs and other devices have not been observed.
  • Two microphones with one name look alike. The picker lists inputs by the name macOS gives them; two identical USB microphones are two rows with the same name.
  • No microphone audio is kept. Retention applies to App Audio meetings only; a Microphone meeting writes a transcript and nothing else.
  • Channels are averaged to mono. A multi-channel interface's channels are mixed evenly before recognition, so a microphone on one channel of a two-channel interface reaches the recogniser at half its level.
  • Not observed on hardware. Sleep and wake, screen lock and permission revoked mid-meeting have not been observed.
  • Loss inside the audio engine is not visible. The tap hands audio to the pipeline as it arrives and the recogniser's backlog reports what it drops; audio the engine itself never delivered cannot be counted.

Recognition

  • An on-device language model must be installed. Languages whose model is absent are listed but cannot be selected, and ScribeKit does not install them.
  • The language is fixed for a run and is never detected automatically.
  • Recognition consumes 16 kHz audio, so 48 kHz capture is resampled on the capture queue.
  • Falling more than about three seconds behind capture drops the oldest audio to keep memory bounded, and the lost time is reported as a gap.
  • A sustained backlog is reported as one incident, not one marker per loss. The marker states the range the incident spanned and, separately, how much audio it cost; it is written when the incident ends, so it appears in the document a moment after the trouble does.
  • A recogniser that stops by itself is restarted at most twice. Audio arriving during a restart is counted as a gap. One that cannot be brought back ends the meeting.

Timing

  • The transcript's timeline starts when the meeting starts, and audio offsets are measured from the first captured frame, which arrives a moment later — so a timestamp can be under a second early.
  • Clock times use a fixed twelve-hour English format and the Mac's current time zone; neither follows the system locale, so a transcript reads the same wherever it is opened.
  • A pause is a boundary in the recording, not a silence in it. The moment a pause ended is audible as a cut, and the recording alone does not tell you how long the pause lasted. The transcript does.
  • Duration and Captured are not derived from each other. One is the meeting's wall-clock length, the other the length of the recording.

Audio files

  • A recording that fails mid-meeting ends the meeting. ScribeKit will not keep transcribing while quietly leaving a hole in a file you asked for.
  • A crash leaves a different thing in each format. A partly written audio.caf plays up to the moment ScribeKit stopped; a partly written audio.m4a does not open at all. ScribeKit repairs neither.
  • One folder, one level deep. History does not search your Mac for transcripts, does not follow a folder you moved a session out of, and does not remember meetings from a folder you have since replaced.
  • Substring matching only. No fuzzy matching, no stemming, no synonyms: a search for closures does not find closure, a misheard word is found only by searching for what the recogniser wrote, and a phrase split across two finalised spans is not matched.
  • ScribeKit's own writing is not searched — the header, minute headings, gap markers, the interruption notice and the footer.
  • Whole transcripts are held in memory while History is open, so its cost grows with the folder. Measured in a debug build: 200 one-hour meetings — 48,000 spans, 7.9 MB — load in 0.82 s, for a 17 MB memory increase; in an optimised build a keystroke's search over the same size takes at most 20 ms. A folder several times larger would justify an on-disk index; nothing smaller does.
  • Filtering is by capture mode only. There is no date filter. A transcript with no session record has no known mode and is listed only under All.
  • Transcript find covers speech only. Transcription gaps, pauses and interruption notices are not find targets and are not shown in the preview; open the transcript to see them. Flagged review passages can be jumped to from Review.
  • The preview shows 50 passages at a time. It moves to the current find match or a revealed passage; it is not a scrolling reader of the whole transcript.

Save folder

  • A moved folder is followed only when macOS reports its bookmark as stale. A deleted folder, or one whose disk is absent, has to be chosen again.
  • The unfinished-session scan looks only at immediate children of the save folder, at launch or when a folder is chosen. No recursive walk, no timer.
  • If the folder cannot be restored, ScribeKit says it could not check for an unfinished meeting rather than looking anywhere else.
  • Readiness is a snapshot, not a subscription. It is recomputed when the screen appears, when you act on a control, and when the runtime changes — a disk reappearing or a model finishing its install is noticed at the next Try Again, Refresh or Check Again, not on its own.
  • The readiness and ending copy is proved by tests, not by a real refusal. No permission was actually denied, no disk actually pulled, and no model actually uninstalled on this Mac to produce these states; they are reached through injected failures. A running build has since been inspected on a Mac where all four prerequisites were satisfied, which confirms the satisfied path and nothing else.

Accessibility

  • VoiceOver has been heard along one representative path only. In Interval 25 a person drove setup, an active meeting with Pause and Resume, History, review and notes with VoiceOver on and recorded what they heard. Anything outside that path is still unheard, and ScribeKit claims no conformance to any accessibility standard.
  • Reaching every control by Tab needs macOS Keyboard navigation turned on. That setting is off by default on macOS. Without it, ⌘1, ⌘2, ⌘F and the arrow keys still work; with it, Start, Pause, Resume, Stop, the notes editor and Save are all reachable.
  • The tab bar is reached with ⌘1 and ⌘2, not with Tab.
  • The Help menu holds only Export Diagnostics…. ScribeKit has no network entitlement and does not open external links, so it does not link to its documentation site from inside the app.

Process and CI

  • ScribeKit keeps running when its last window closes, so quitting is explicit — the menu bar item, the application menu, or ⌘Q.
  • Quitting waits for the meeting to finish properly rather than racing a deadline, so a quit takes as long as closing the transcript and audio file takes. A force quit is still a crash.
  • CI runs build and unit tests only — no linting, formatting, coverage or UI tests.

Diagnostics

  • A diagnostic report is a snapshot, not a history. It describes what is true when you ask for one; nothing is stored, so it says nothing about a meeting before the last one.
  • readiness and storage are absent when the main window has not been open in this launch. ScribeKit has not evaluated them, which is not the same as their being unready.
  • A report carries no transcript or recording byte counts. Reading them would mean opening access to your folder to stat a canonical artifact, which is more than a support field is worth.
  • Application names and window titles are never reported. A report says how many applications were discovered and how many were selected, and nothing about which.
  • ScribeKit does not collect the unified log or crash reports. Console and log are the tools for those; see Diagnostics & Support.