Native macOS meeting transcription.
Capture the applications you pick or a microphone, transcribe on your Mac, keep a Markdown transcript you own.
The current release is v0.2.0, published as source. It adds microphone transcription, microphone input selection, History filtering and find within a transcript to v0.1.0's selected-app workflow. There is no prebuilt signed or notarized download. You build it yourself. Nothing about that is a network requirement: ScribeKit runs entirely on your Mac either way.
ScribeKit runs quietly while you work in other applications. You pick what it listens to — the applications you select, or one microphone — it recognises the speech on this Mac with Apple's on-device speech models, and it appends a timestamped Markdown transcript into a folder you chose — readable in any editor while the meeting is still running.
Choosing a microphone, starting a Microphone meeting, live transcription, stopping, then finding the meeting in History with the source filter and search, and stepping through matches with find.
- Captures the apps you pick, through ScreenCaptureKit — not the whole system. Details
- Or transcribes a microphone — the Mac's default or one you choose — while you work in other apps, keeping no audio. One source per meeting: never App Audio and a microphone together. Details
- Transcribes on this Mac with Apple's
SpeechAnalyzerandSpeechTranscriber, against a locally installed model, with no network fallback. Details - Writes Markdown you own.
transcript.mdis appended to as speech is finalised, so it is readable in any editor while the meeting is still running. Details - Keeps running behind the window. The meeting belongs to the application, not the window; closing the window keeps capturing and releases the interface, and a menu bar item can stop it. Details
- Pauses and resumes, with separate wall-clock and captured-media clocks so an offset always names the same second of the recording. Details
- Recovers interrupted meetings. A meeting the process did not survive is found on the next launch, finalised as far as it can be, and kept. Details
- Reads meetings back through a read-only history, local substring search, uncertainty review against retained audio, and Markdown notes kept in a sidecar of their own, with filtering by source and find within a transcript. Details
- Retains audio only if you ask. None by default; optionally raw
.cafor compressed.m4a. Details - Exports a local diagnostic report when something goes wrong — counts and states only, written where you choose, uploaded nowhere. Details
![]() |
![]() |
| Setup — choosing the microphone, with readiness before anything is recorded | History — source filter, search, and find within a transcript |
selected applications
↓ ScreenCaptureKit
audio capture
↓ SpeechAnalyzer / SpeechTranscriber, on this Mac
on-device recognition
↓
meeting session directory
├── transcript.md the canonical transcript
├── audio.m4a only if you asked for it
└── .scribekit/ session record, review marks, notes
transcript.md is the transcript. It is plain Markdown, it is yours, and it
does not depend on anything under .scribekit/ — losing or failing to read
those sidecars never makes the transcript unusable.
# Release Checklist Review
**Date:** 2026-09-01
**Started:** 5:52 PM
**Sources:** QuickTime Player
**Language:** en-US
**Captured by:** ScribeKit
## Transcript
### 5:52 PM
**5:52:36 PM**
Let's start with the release checklist for this week.
**5:52:40 PM**
The build pipeline is green and the full test suite is passing.
> **Paused:** 5:52:55 PM. Capture stopped here; nothing was recorded until the meeting resumed.
> **Resumed:** 5:52:58 PM, after 3 s paused.| macOS | 26.5 or later. Earlier versions are not supported and macOS will refuse to launch the build. |
| Mac | Tested on Apple Silicon. The project builds a universal binary, but nothing has been built or validated on Intel. |
| Xcode | 26 or later — needed to build ScribeKit, which is currently the only way to run it. |
| Speech model | The on-device model for your recognition language must already be installed. ScribeKit does not download models and has no network fallback; a language whose model is missing is listed and disabled. |
| Permission | Screen & System Audio Recording, which macOS asks for the first time ScribeKit looks for capture sources. Microphone meetings need Microphone permission instead. |
More detail in Requirements.
There is no signed, notarized disk image for v0.2.0, and no download to install. Publishing a macOS application outside the App Store requires a Developer ID certificate and Apple notarization, neither of which is available for this release; that work is deferred rather than abandoned. Until then, ScribeKit is built and run from source.
git clone https://github.com/quangshuynh/scribekit.git
cd scribekit
xcodebuild -project ScribeKit.xcodeproj -scheme ScribeKit -destination 'platform=macOS' buildThe project is configured for automatic signing with the author's development team, so a fresh clone signs with your own local Apple Development identity once you select your team in Xcode's Signing & Capabilities tab. To build without touching the project settings, sign ad-hoc the way CI does:
xcodebuild -project ScribeKit.xcodeproj -scheme ScribeKit -destination 'platform=macOS' CODE_SIGN_IDENTITY=- CODE_SIGN_STYLE=Manual DEVELOPMENT_TEAM= buildA free Apple ID is enough to build and run ScribeKit locally; the paid
Developer Program is only needed to distribute it. Or open
ScribeKit.xcodeproj in Xcode and run the ScribeKit scheme.
Then see First Meeting.
xcodebuild -project ScribeKit.xcodeproj -scheme ScribeKit -destination 'platform=macOS' testUnit tests use Swift Testing.
- No accounts, no analytics, no telemetry, no cloud database, and no third-party runtime dependencies. ScribeKit ships without the network client entitlement, so the sandbox does not permit it to open a network connection at all — and recognition has no server-backed mode to fall back to.
- Your transcripts live where you put them. The save location is a folder you chose in a system panel; transcripts, and retained audio if you enabled it, are ordinary files inside it, readable and movable without ScribeKit.
- Raw transcripts are source material. ScribeKit never silently rewrites a transcript with AI, summarisation, grammar cleanup or inferred substitutions. Notes and review marks are derived, stored separately, and cannot reach the transcript.
- Honest about uncertainty and about endings. Low-confidence recognition and audio that was never transcribed are surfaced rather than smoothed over, and a capture stream that dies under a meeting is recorded as an interruption, not as a completion.
- Never hidden. Capture is always visible in the interface.
- Not encrypted. ScribeKit does not encrypt anything it writes. Your transcripts and recordings are as private as the folder you chose, and where they go afterwards is up to you. macOS and its frameworks remain part of the environment ScribeKit runs in.
See Privacy & Data.
- 703 automated tests in 65 suites (Swift Testing), run on every push alongside the build.
- A sixty-minute continuous soak of the Release build with compressed retention: CPU flat at 7.04–7.79% of one core, footprint drifting 91.5 MB to 106.3 MB, thermal state nominal throughout, and both the transcript and the recording only ever appended to. Measurements are in Performance & Energy.
- Fault injection for crash and recovery, plus a deterministic regression for the capture crash that a soak first exposed.
- A human release pass on Apple Silicon covering real selected-application capture and transcription, keyboard routes and VoiceOver, quit-during-meeting behaviour, and light and dark appearance.
- No network socket.
lsofagainst the running Release process found none before, during or after a meeting. - Strict documentation builds.
mkdocs build --strictgates the docs site in CI, separately from application CI.
v0.2.0 is deliberately narrow. The ones most likely to matter:
- macOS 26.5 or later, tested only on Apple Silicon.
- Source build only — no signed or notarized application is provided.
- A meeting transcribes either selected applications or one microphone, never both. There is no speaker separation, and microphone audio is never kept.
- The on-device speech model must already be installed, and accuracy is Apple's recogniser's.
- An interrupted meeting is preserved but cannot be continued as the same session; you start a new one.
- Transcripts are read-only inside History — no editing, renaming, deleting or exporting — and changing a transcript's structure outside ScribeKit can stop History parsing it.
- Compressed audio cut short by an abrupt process death may be unreadable.
- ScribeKit does not encrypt what it writes.
The full list is in Limitations.
The full documentation is at
https://quangshuynh.github.io/scribekit/, built from docs/:
| Section | What is there |
|---|---|
| Getting Started | Requirements, building, your first meeting, save location, audio retention |
| Using ScribeKit | Capture, live transcription, pause/resume, background operation, history, review, notes, recovery |
| How It Works | Architecture, meeting lifecycle, audio path, on-device speech, persistence, the two clocks, session artifacts, presentation lifecycle |
| Reliability | Failure semantics, crash recovery, and measured performance and energy evidence |
| Privacy & Data | Local-first model, what is written where, permissions, network policy |
| Development | Building, testing, architecture boundaries, docs, contributing |
| Reference | Transcript format, the three sidecars, limitations, releases |
To build the docs locally:
python3 -m venv .venv && source .venv/bin/activate && pip install -r docs/requirements.txt && mkdocs serveEngineering rules live in AGENTS.md; notable changes are in CHANGELOG.md.
MIT — see LICENSE.




