How Aftercall keeps your meetings private
Nothing leaves your Mac until NEAR AI's secure hardware passes its checks, and only the checked model can read your transcript.
The journey of one meeting
What each stop sees and keeps. Both trips to the models pass through the gateway; on the way to Qwen it only relays ciphertext.
- Sees:
- Your mic and the call's audio, as two tracks
- Keeps:
- The audio, sealed, until the notes are saved
- Sees:
- The audio, over TLS. The transcript only as ciphertext
- Keeps:
- Up to NEAR AI. Its logs aren't attested
- Sees:
- The audio, plus project and payee names as spelling hints
- Keeps:
- Up to NEAR AI's policy
- Sees:
- The transcript, as You and Others
- Keeps:
- The transcript, sealed
- Sees:
- The transcript and names, opened only inside the TEE
- Keeps:
- Up to NEAR AI's policy
- Sees:
- The signed notes
- Keeps:
- The notes, sealed. The audio is deleted
- Sees:
- A sha256 hash, the start time and the model name
- Keeps:
- Those, in public, for good. No content
Your Mac records your mic and the call's audio as two tracks, sealing the audio about once a second.
Your MacSecure hardware, checked firstNEAR, publicChecked every time, before it’s sent and when it comes back
Each recording gets a fresh nonce. Your Mac checks the gateway, Whisper and Qwen against it, then checks the signed reply: 25 checks before anything is sent and 5 on the signed reply, on a typical meeting with one node per model.
Before anything leaves your Mac 25 checks
Counted for one node per model; each extra node adds its own setEach machine's Intel quote verifies against Intel's collateral, and debug mode is off.
So an attacker can'tpass off an ordinary server, or one in debug mode, as secure hardware.
The quote holds the TEE's signing key and the nonce your Mac made for this run.
So an attacker can'treplay an old quote, or sign with a key made outside the TEE.
The gateway's quote binds the public key of its TLS certificate, and the audio is uploaded only on a connection whose certificate carries that key.
So an attacker can'ttake the audio at a TLS endpoint whose key the gateway's quote doesn't bind.
Every boot event in the log replays to the RTMR3 value in the quote.
So an attacker can'thide what the machine loaded when it booted.
The sha256 of the TEE's Docker compose matches the mr_config in its quote. The images it names are listed by digest, not checked against a list of NEAR's releases.
So an attacker can'tshow one Docker compose while running another.
NVIDIA signs a token for each GPU, with this run's nonce, secure boot on and debug off.
So an attacker can'tuse a GPU outside confidential mode, or replay old GPU evidence.
When the notes come back 5 checks
The Ed25519 signature covers the exact request, response and model, from a key in a verified quote.
So an attacker can'tchange the notes in transit, or answer from another model or machine.
The transcript was encrypted on your Mac to the key in Qwen's verified quote.
So an attacker can'tread the transcript at the gateway. It only relays ciphertext.
If a check fails, it stops there. Nothing is sent unless the gateway, every Whisper node and the Qwen node you use all pass.
End-to-end encrypted summaries
The transcript is sealed on your Mac to a key bound in Qwen's verified quote, so the gateway passes on text it can't read.
- Your Mac takes the key from a verified quoteQwen's Ed25519 key has to sit in the report data of a quote that passed every check, next to this run's nonce.
- The transcript is sealed to that key, on your MacEach message gets a fresh X25519 key pair. The shared secret goes through HKDF-SHA256, then XChaCha20-Poly1305 seals the text.[one-time key 32] [nonce 24] [ciphertext + tag]
- The notes come back sealed to your MacQwen encrypts its reply to a key pair made for this one request. If end-to-end encryption isn't available, the transcript isn't sent: it never goes over TLS instead.
On your Mac
Audio, transcripts and notes stay in Aftercall's folder, sealed with a key in your macOS Keychain.
- Audio
- Sealed about once a second as it records, so it's never on disk unencrypted. Deleted once the notes are saved.
- Transcripts and notes
- Sealed with XChaCha20-Poly1305. A changed byte or the wrong key won't open.
- Stays local
- Search, calendar lookups, backups you export, and the server agents use to read meetings. Automatic backups go to iCloud Drive, encrypted, only if you turn them on.
- The limit
- This stops other apps, backup and sync tools from reading your meetings. It doesn't protect a Mac account someone else has taken over.
What we can't prove
Every Verify page lists these under the checks.
- That the transcript is accurate: Whisper can mishear names and numbers.
- That this transcription came from the attested Whisper TEE: NEAR AI signs chat responses, not transcriptions.
- That everyone on the call agreed to be recorded: Aftercall asks you to confirm it, and can't check it.
- Who said what: “You” is your microphone and the rest is the call's audio; a name on the call's side comes from your calendar or, marked “likely”, from the model reading what was said (an introduction, someone addressed by name), never from the voice, and isn't checked like quotes.
- When your notes were typed: the proof shows they haven't changed since the notes were made, not that you typed them during the call.
- What NEAR AI keeps or trains on: that is set by NEAR AI's own policy, not shown by these checks.
- That every older meeting's transcript was end-to-end encrypted: earlier versions of the app could send it over TLS when encryption wasn't available, and such a meeting's proof says so.
Check it yourself
Every claim on this page points to code you can read and run.
- packages/core/src/tee/checks.ts
- CPU checks, signature
- packages/core/src/tee/nvidia.ts
- NVIDIA GPU evidence
- packages/core/src/tee/e2ee.ts
- Encryption to Qwen
- packages/core/src/notes/pipeline.ts
- Order, stop on failure
- packages/core/src/notes/proof.ts
- The proof, its limits
- apps/desktop/src-tauri/src/attest.rs
- Intel quotes, NRAS
- docs/privacy.md
- Where every byte goes
- pnpm sample:notes
- Every check, on a sample call