Last updated: 10 October 2026.
This page has two parts. The first covers the ParrotFlow app for macOS. The second covers this website, parrotflow.io.
The app
ParrotFlow has no account and no telemetry. There is no ParrotFlow server, so the app sends nothing to the project. Your speech is transcribed on your Mac. The app contacts other servers only in the cases listed under What leaves your Mac.
What stays on your Mac
- Speech. Parakeet, the speech model, transcribes your audio on your Mac. It runs with Core ML on the Neural Engine.
- Recordings. They are not kept by default. With
logging.audio: false, the default, a clip is removed as soon as it is transcribed. Setlogging.audio: trueto keep your recordings. - Screen text. The context step reads the window you dictate into. It reads it on your Mac, when you press the key, through the Accessibility permission. The app takes no screenshots.
- Built-in steps. The steps that ship with the app need no cloud key. They use small models that run on your Mac.
- API keys. If you use a remote model, its key goes in the macOS keychain by default. It does not go in
config.yaml.
The app writes these files on your Mac. None of them is uploaded.
| File | What it holds | Default |
|---|---|---|
~/.config/parrotflow/config.yaml |
Your settings | Always |
~/.config/parrotflow/vocabulary.yaml |
The terms you taught the app | Always |
~/.config/parrotflow/recordings/trace.jsonl |
One line per dictation, with the transcript | Always |
~/.config/parrotflow/recordings/spans.jsonl |
A timeline per dictation, with the transcript. It rotates at 64 MB. | On, off with logging.spans: false |
~/Library/Logs/ParrotFlow.log |
The app’s log. It can contain text you dictated. | On, off with logging.text: false |
~/.config/parrotflow/recordings/*.wav |
Your recordings | Off, on with logging.audio: true |
To delete your config, vocabulary, transforms, traces, recordings and log, run:
rm -rf ~/.config/parrotflow ~/Library/Logs/ParrotFlow.log
The app writes a new config the next time it starts.
What leaves your Mac
Model downloads
At first launch the app downloads its models from Hugging Face (huggingface.co). These are plain downloads of public model files. No audio and no text is sent with them. Hugging Face sees your IP address. The files are stored on your Mac and are not downloaded again.
Update checks
About 20 seconds after launch, and then once an hour, the app asks GitHub for the latest release. It sends one request to https://api.github.com/repos/znat/parrotflow/releases/latest. The request has no login. It carries the app’s version in its User-Agent header. It carries nothing about you or your dictation. GitHub sees your IP address.
When you choose Update and restart, the app downloads the release and its checksum from GitHub.
To turn update checks off, set this in config.yaml:
updates:
after_days: -1
The app then never contacts GitHub. You update it yourself with Homebrew or from the releases page.
Language models you configure
Spoken commands (“hey parrot, …”) and prompt: steps send text to a language model. You choose that model in config.yaml.
The example config names a model in Ollama at http://localhost:11434. Ollama runs on your Mac, so that text stays on your Mac.
If you add a model with api: openai or api: anthropic, the text that model handles goes to that provider. By default that is api.openai.com or api.anthropic.com, or the endpoint you set. A prompt can include the screen text from the context step, so that text can be sent too. The provider’s own privacy policy applies to what it receives.
To see which models you use and where each one points, run:
parrotflow --check-config
Your own scripts
A command: step runs a script that you write or install. The app does not control what that script sends.
Optional installs
The setup window offers to install eSpeak NG with Homebrew. If you accept, it opens Terminal and runs the Homebrew command there, so you can read it. If Homebrew is missing, the command installs Homebrew first. Homebrew downloads eSpeak NG from its own servers. The app never installs it without asking.
Bug reports
The app sends no bug report by itself. In the menu bar, Report a Bug… shows the report in a window. It holds the app version, the macOS version and the chip, the permission state, the config check and the last 50 lines of the log. Home folder paths are written as ~. The log can contain words you dictated, so read the report before you copy it.
The app then opens a new GitHub issue page in your browser. The page address fills in the version, the macOS version and the app name. Nothing reaches GitHub until you submit the issue yourself.
If you attach a trace, use the redacted view. It keeps the timings and drops the words.
parrotflow --trace-view --redacted
The website
Vercel hosts parrotflow.io. Vercel’s privacy policy covers the requests it serves.
The site uses Vercel Web Analytics to count page views. It sets no cookies. Vercel tells visitors apart with a hash made from the incoming request. The hash is valid for one day and then reset, so a visit cannot be linked across days or across websites.
For each page view, Vercel may store these values:
- the time
- the page address, and its query parameters after filtering
- the referring page
- the country, region and city
- the operating system and browser, with their versions
- the device type (desktop, tablet or mobile)
The site records page views only. It sends no custom events.
The site loads its fonts and videos from parrotflow.io. It has no other analytics, no ads and no embedded content from other services.
The Copy button next to the Homebrew command copies the command to your clipboard. It does nothing else.
Links to GitHub take you to GitHub. GitHub’s privacy policy applies there.
Contact
Ask a privacy question or report an error on this page in GitHub Discussions or with a GitHub issue. Report a security problem privately with a security advisory.