Spake
Download

Privacy

Draft — under legal review. It describes how Spake is built and sold, but it has not been reviewed by a lawyer and is not legal advice.

Spake is a Mac app that records your voice and your screen. Nothing you record leaves your Mac. Spake uses the network for exactly four things — downloading the speech models, checking for updates, confirming your license, and sending anonymous usage statistics if you switch them on. This page says what each of those four sends, what the app keeps locally, and what this website collects.

When Spake uses the network

Four requests exist, and this is all of them. The first three are the app doing its job; the fourth only happens if you turn it on.

  • Downloading a model. Speech, language-detection, speaker, and translation model files are fetched from their public hosts when you ask for them. The request is for a fixed file at a fixed address and carries nothing that identifies you or your Mac beyond your IP address and a generic user agent.
  • Checking for updates. Spake asks the public update feed at spake.app whether a newer version exists. That request identifies the app and its version. It says nothing about your notes and nothing about your Mac.
  • Confirming your license. Activating or re-checking a license sends your license key, an identifier derived from this Mac's hardware, your Mac model and the month of activation, your app version and build, your macOS version, and your processor architecture to spake.app — no name, no email, no note content.
  • Anonymous usage statistics, only when enabled. Off unless you switch it on. See the next section.

Everything else is local. Audio, video, transcripts, recognized screen text, note titles, labels, file names, and folder paths are never uploaded by Spake. Speech recognition runs on your Mac with Parakeet or Whisper; speaker identification runs on your Mac as well; title and label suggestions use Apple's on-device model and, where a language needs it, local translation. There is no cloud speech service, no account, and no sign-in.

What the app stores on your Mac

Everything a note is made of lives in a folder you choose, one directory per note:

  • The note itself as Markdown you can edit.
  • A JSON file with the transcript, word timings, and metadata.
  • The recorded audio as WAV and the recorded screen as MP4, plus a WebVTT caption sidecar and a captioned copy of the recording.
  • Sampled frames from the recording and the text recognized in them, kept separate from the words you spoke.
  • If you record system audio, its original is kept in the same folder beside the microphone's, and each source has its own transcript.

Speaker identification runs on your Mac. A note's own speaker document keeps the voice observations measured from that recording, in the note folder you chose, alongside its transcripts and turns. The collection that lets Spake recognise a voice across recordings is separate, and that one is private app-support data rather than part of any note. Naming a speaker or assigning a turn teaches an identity that carries across recordings; a match Spake infers on its own does not. Removing a person in Speakers stops matching that identity, and notes you have already saved keep the names and speaker data inside their own files. No voice data is uploaded.

Speech, speaker, and translation model files download once into application support and are reused after that. App settings live in the standard macOS preferences location. Nothing in this list is copied off your Mac by Spake. A library kept in a cloud-synced folder follows that service's own synchronization behavior.

Scripts and the command line

Spake can run a script of your own when a new note finishes transcribing, and every build includes a bundled command line for the same work from a terminal. Neither one changes the four requests above, and Spake's own transcription stays on your Mac.

Only a script you configure in Spake is ever run — a note folder you import cannot bring one with it — and a new rule starts disabled until you enable it. The script runs as you, with your account's permissions, so it can read and write files and use the network. Spake hands it one JSON object on standard input — the note's title, body, labels, creation date and folder path, with its identifiers and status — and does not capture what it prints. Any service your script chooses to call handles what it is sent under that service's own policy, independent of Spake.

The bundled command reaches the app over a Unix socket in a private per-user directory. It checks that the connection belongs to your account, listens on no network port, and records no command payloads. That is same-account access, not isolation from other programs already running as you.

Anonymous usage statistics (opt-in)

Spake is designed to ask once, during setup, whether you want to share anonymous usage statistics, and to leave the answer off unless you turn it on. When it is off, the app makes no analytics request at all. When it is on, events carry an anonymous, resettable install identifier and bucketed values only — never note content, titles, labels, paths, transcripts, or recognized screen text.

The switch is in the app's settings, and turning it off stops the requests. There is nothing to delete afterwards, because nothing sent was tied to you.

Every event the app is able to send is listed below. The list is generated from the app's own source — the same catalog the app ships in its privacy document — so it cannot quietly fall out of date.

The full event catalogue

Spake can send 22 kinds of event, and these are all of them. Never sent: recordings, transcripts, screen text, note titles, file paths.

Attached to every event

app_version · version
Which release the report came from.
Values: digits and dots only, for example 1.4.0; anything else is reported as unknown
app_build · version
Which build of that release.
Values: digits and dots only, for example 1.4.0; anything else is reported as unknown
os_version · version
Which macOS version to keep supporting.
Values: digits and dots only, for example 1.4.0; anything else is reported as unknown
arch · architecture
Apple silicon or Intel.
Values: arm64, x86_64, unknown
$geoip_disable · boolean
Always true. Tells PostHog not to derive a location from the request's IP address.
Values: true, false
$process_person_profile · boolean
Always false. Tells PostHog not to build a person record out of these events.
Values: true, false
$lib · enum
Which analytics library sent the report. Says nothing about you or your Mac.
Values: posthog-ios
$lib_version · version
Which version of that library, so an ingestion problem can be traced to it.
Values: digits and dots only, for example 1.4.0; anything else is reported as unknown

Events

app_launched

How many installs are still in use.

No properties.

onboarding_step_completed

Which setup step people stop at.

step · enum
The step that was completed.
Values: welcome, permissions, speech, notes, ready

onboarding_completed

Whether setup finishes, and what it finishes with.

input_monitoring_granted · boolean
Whether the optional double-tap shortcut permission was granted.
Values: true, false
model_installed · boolean
Whether the speech model finished downloading.
Values: true, false
duration_bucket · duration bucket
How long setup took.
Values: half-open buckets: 0-10s, 10-30s, 30-60s, 1-3m, 3-10m, 10-30m, 30m+

recording_started

How recordings are started, and how often.

mode · enum
Whole screen or a selected area.
Values: full, area
trigger · enum
Double-tap gesture, keyboard shortcut, or an on-screen button.
Values: gesture, shortcut, button

recording_stopped

Whether recordings finish, and roughly how long they run.

duration_bucket · duration bucket
How long the recording ran.
Values: half-open buckets: 0-10s, 10-30s, 30-60s, 1-3m, 3-10m, 10-30m, 30m+
outcome · enum
Saved, cancelled, or failed.
Values: saved, cancelled, failed

transcription_completed

Which engines and languages are used, and how fast transcription is.

engine · engine
Which speech engine produced the transcript.
Values: parakeet, whisper, grok
language · language code
The language code, never any words.
Values: af, am, ar, as, az, ba, be, bg, bn, bo, br, bs, ca, cs, cy, da, de, el, en, es, et, eu, fa, fi, fo, fr, gl, gu, ha, haw, he, hi, hr, ht, hu, hy, id, is, it, ja, jw, ka, kk, km, kn, ko, la, lb, ln, lo, lt, lv, mg, mi, mk, ml, mn, mr, ms, mt, my, ne, nl, nn, no, oc, pa, pl, ps, pt, ro, ru, sa, sd, si, sk, sl, sn, so, sq, sr, su, sv, sw, ta, te, tg, th, tk, tl, tr, tt, uk, ur, uz, vi, yi, yo, yue, zh, und
audio_duration_bucket · duration bucket
How long the recorded audio was.
Values: half-open buckets: 0-10s, 10-30s, 30-60s, 1-3m, 3-10m, 10-30m, 30m+
latency_bucket · duration bucket
How long transcription took to return.
Values: half-open buckets: 0-10s, 10-30s, 30-60s, 1-3m, 3-10m, 10-30m, 30m+

transcription_failed

Which failures are worth fixing first.

engine · engine
Which speech engine failed.
Values: parakeet, whisper, grok
reason_category · enum
A category for the failure, decided from the error's kind, never its message.
Values: cancelled, model_missing, audio_missing, storage, timeout, unsupported_language, other

note_opened

How people reach a note.

source · enum
The list, a notification, or a search.
Values: list, notification, search

search_performed

Whether search finds anything.

result_count_bucket · count bucket
Roughly how many notes matched.
Values: 0, 1, 2-5, 6-20, 21-100, 100+

suggestion_shown

How often on-device suggestions are produced.

kind · enum
A title or a label.
Values: title, label

suggestion_accepted

Whether those suggestions are good enough to keep.

kind · enum
A title or a label.
Values: title, label

inspector_opened

Whether the inspector is used at all.

No properties.

share_used

Which export formats matter.

kind · enum
Which payload was shared.
Values: video, video_captions, audio, note, bundle

update_check

Whether the update feed is reachable.

outcome · enum
Up to date, an update was offered, it was declined, or the check failed.
Values: up_to_date, update_available, declined, failed

update_installed

Which versions are still in the field.

from_version · version
The version that was replaced.
Values: digits and dots only, for example 1.4.0; anything else is reported as unknown
to_version · version
The version now running.
Values: digits and dots only, for example 1.4.0; anything else is reported as unknown

trial_started

How many trials begin.

No properties.

trial_expired

How many trials run out before a purchase.

No properties.

license_activated

Whether activation works.

outcome · enum
Activated, or why it was refused.
Values: activated, invalid, revoked, deactivated, limit_reached, unreachable, tampered, not_configured, storage_failed

license_deactivated

How often a Mac is released from a licence.

No properties.

telemetry_enabled

When sharing was turned on.

No properties.

telemetry_disabled

When sharing was turned off. The last event sent from this install.

No properties.

error_occurred

Which parts of the app break.

category · enum
Which part of the app reported it.
Values: capture, transcription, context, enrichment, translation, storage, permission, update, license, network, other

One value in that list needs a word: grok is only ever carried by a note from an older build. New transcripts record parakeet or whisper.

This website

spake.app uses PostHog for page analytics in a cookieless configuration: no cookies, nothing kept in local storage, no persistent identifier, no user profile, and no automatic capture of clicks or form input. A page view records the page address, the referring address, an approximate country derived from the request and then discarded, and a coarse browser and operating system name.

Because nothing is stored in your browser, there is nothing to consent to and no banner to dismiss. Requests are proxied through this domain, so an analytics blocker that matches on hostnames will not see a third-party call; if you prefer to opt out of page analytics entirely, a Do Not Track or blocker rule against the /ingest path on this domain is sufficient. The site sets no advertising or tracking pixels.

Purchases

Polar is the merchant of record for Spake. When you buy a license, Polar collects and processes your payment details, billing address, and any tax identifiers under its own privacy policy. We never see your card number.

What reaches us is your email address, your license key, and the activation records for that key — which Macs it is active on, by a name you can see and revoke. We use them to deliver the license, to answer support mail, and to enforce the 3-Mac limit. Activating a license sends your license key and an anonymous per-Mac identifier to spake.app; the app never sends a note, a recording, or a file path with it.

Updates

The update check is an ordinary HTTPS request to spake.app, which redirects to the storage host holding the file. Both see it the way they see any download: your IP address and the user agent, which names the app and its version. Since we run spake.app, that request appears in our host's ordinary server logs, the same as a visit to this page; we also send PostHog, the analytics service this website uses, a bare count of update checks and downloads — how many there were, which app version asked, and which file was served — with no identifier attached. That tally is made on our server, so a rule in your browser does not affect it. We do not build a profile from it or connect it to a license. You can turn automatic checks off and update manually instead.

Contact

Questions about anything on this page: support@spake.app.

Changes

If this policy changes in a way that affects what is collected, the change is described here with a new date, and a material change is announced in the app's release notes. Past versions are visible in the site's source history.

Last updated 17 September 2026.