The note after every session
Every session a social worker holds ends in a note. The agency needs it, and so does whoever sees the client next. Writing it is time spent at a keyboard instead of with a client.
The obvious fix is an AI scribe, and the obvious way to build one is to send the session to a hosted model. For some agencies that is fine. For others, a client's worst week on someone else's server is exactly what the privacy officer is there to prevent. I wanted to see how much of the job one Mac could do on its own.
Scribeski is the result. It is free, open source under the MIT license, and version 0.1.0 is out today.
Two tracks, transcribed on the device
Scribeski lives in the menu bar. When Zoom or a Google Meet tab starts using the microphone, it offers to transcribe. The worker confirms that the client has agreed and picks the client's chart, which binds the session to that client.
It captures two tracks: the worker's voice from the microphone, and the client's from the call app alone, never the whole Mac. Speaker labels come from which track the audio arrived on, not from a model guessing who spoke. Echo is cancelled on the microphone, so a worker on speakers does not have the client's words attributed to them. If a second voice turns up on the client's line, it is flagged rather than relabelled.
Parakeet transcribes on the Neural Engine during the call, with Apple's own speech engine as the fallback, so the transcript is ready seconds after the call ends.
A draft with receipts
After the call, a local model, Gemma 4 by default, fills each field of the agency's form from the transcript and attaches the quote each answer came from. Fields that need clinical judgement are left for the worker, and so is anything the session did not clearly answer. Scores such as PHQ-9 and GAD-7 are computed in code from the item answers, never by the model.
Scribeski then writes the draft into the EHR through Safari. Before every write it checks that the page still shows the bound client's record number as a whole token, so a session bound to AB-11432 never writes into the chart for AB-114322. It never presses submit. A review panel lists every field with its status and the quote behind it. The worker can edit a field, jump to it in the form, or undo everything, and only then confirms.
It learns each EHR form once. Pointed at a blank form, it reads the structure, meaning labels and choices but never values, and works out which fields a session can answer. On our mock EHR it mapped 107 fields, and its mapping agreed with a hand review on 98 of them. Agencies can share learned forms as form packs.
Nothing leaves the Mac, and nothing is recorded
Transcription and note-writing both run on the Mac. The only network use is downloading models, each pinned by hash, and checking for app updates. The note model runs in a bundled llama.cpp server that listens on a private socket instead of a network port, with a new key each launch.
By default, no audio is kept. It is held in locked memory for seconds and wiped as soon as it is transcribed, and a zero-recording session will not start unless FileVault is on. That should be checkable, so the repository ships the check: an end-to-end script runs a synthetic session through live capture and fails if the bytes written look like audio rather than text, or if any file over 64 KB appears in the app's data, temp or cache folders. A 45-minute synthetic run wrote 0 bytes.
Transcripts and notes are sealed with a per-session key in the Mac's data-protection keychain, and kept out of Time Machine and Spotlight. Deleting a session destroys its key. I say that makes the data unreadable, not erased, because APFS snapshots can keep the encrypted files for a while. The audit log records events and counts, never text, and names the client only by a keyed hash.
Agencies that want audio can keep it encrypted until the note is confirmed, or for a set number of days, and can lock these settings with a configuration profile.
What 0.1.0 has not proven
This is a first release, for pilots, and the evidence so far is synthetic. The pipeline has run end to end on synthetic two-voice sessions: accurate transcripts of synthesised speech, no audio on disk, a stable 45-minute run, and a note filled into a mock EHR. It has not been measured on real voices over real calls. That comes next, with role-played sessions over Zoom scored against hand-corrected transcripts.
The note model is not yet as accurate as I want. In the latest held-out run in the repository, on two synthetic transcripts it was never tuned on, it got 84% and 88% of the clearly answered fields right, against a gate of 90%. Most misses were blanks left for the worker, but it also answered a few fields it should have left blank. That is why nothing reaches the chart without review.
The security review in the repository lists the risks we accepted. The largest is that Scribeski's script shares the EHR page's JavaScript environment, so it trusts the EHR's own page. Hiding client text from screen sharing is best effort, so workers should not share their screen while reviewing.
Try it
Scribeski needs an Apple silicon Mac on macOS 26 or later. 32 GB of memory is recommended for the default note model, plus about 15 GB of disk for the models. Download it from github.com/looskis/scribeski, drag it to Applications, and setup walks through permissions, the model download, the recording choice and learning your first form.
The code, the design, the build plan and the security review are all public. If you run an agency and want to pilot it, or you find something it gets wrong, I would like to hear about it.
Frequently asked questions
Does Scribeski send session data anywhere?
No. Audio, transcripts and notes stay on the Mac. The only network use is downloading models, each pinned by hash, and checking for app updates.
Does Scribeski record sessions?
Not by default. Audio is held in locked memory for seconds and wiped once it is transcribed. An agency can choose to keep audio, encrypted, until the note is confirmed or for a set number of days.
Which call apps and EHRs does it work with?
It works with Zoom, Google Meet and other call apps. It fills web-based EHR forms in Safari, learning each form once. Its published tests run against a mock EHR.
What does Scribeski cost?
Nothing. Scribeski is open source under the MIT license. The default models carry their own licenses: Apache 2.0 for Gemma 4 and CC BY 4.0 for Parakeet.
Sources & further reading
- Scribeski on GitHub
- Scribeski 0.1.0 release
- Scribeski security review (SECURITY.md)
- Deploying Scribeski for an agency (SHIPPING.md)
- Scribeski build plan and measured progress (BUILD_PLAN.md)
- Extraction and form-mapping eval, 22 September 2026
- Held-out extraction runs (heldout-gemma26b-run4)
- NVIDIA Parakeet TDT 0.6B v3
- Gemma 4 26B A4B, QAT Q4_0 GGUF
- llama.cpp