uttrflow / uttrflow/uttrflow-swift
Transcripts, clipboard history and learned suggestions are stored unencrypted and included in every Time Machine backup
- Dominant language
- Swift
- Stars
- 4
- Forks
- 17
- Avg merge
- 3h 32m
- Merged PRs (30d)
- 277
Description
## What happens
Everything the app keeps about the user sits in plain files under `~/Library/Application Support/Uttrflow/` (`Sources/UttrflowCore/Support/LocalStore.swift:26-35`):
- `history.v1.json`: transcripts
- `clipboard.v1.json` and `saved.v1.json`: clipboard text, including clips masked as secrets (#483)
- `Images/*.png`: copied pictures, including screenshots
- `predict.v1.sqlite` and its `-wal`: lines typed in other apps
- `dictionary.v1.json`, `snippets.v1.json` and `recordings/*.wav`
A search of `Sources/` finds no `isExcludedFromBackup` / `URLResourceValues` and no file-protection option. The app is not sandboxed (`Resources/Uttrflow.entitlements:64-67`), so the files are not in a container that macOS guards against other apps either. Any process running as the user can read them, and every backup includes them. Only an encrypted Time Machine disk or FileVault on the backup volume protects them.
The multi-gigabyte model folder (`Application Support/Uttrflow/Models`, `Sources/UttrflowSpeech/SpeechModelStore.swift:84-89`) is not excluded from backup either, although it can be downloaded again.
## Why it matters
The clipboard history deliberately keeps password-manager copies (#483), and the suggestions store keeps what was typed in browsers. An unencrypted backup disk, or any tool that syncs `~/Library`, carries all of it. On an 8 GB / 256 GB Mac, backing up several GB of model weights every time they are replaced also costs backup space.
## Decision needed
1. Exclude `Models/` from backup. This is a straightforward win.
2. For the stores of user text, choose one: exclude them from backup (retention is short anyway), keep backing them up, or encrypt them at rest with a key in the Keychain. The key would not be device-only, so a restore would still work.
3. Whether recordings (retry-only, one day) should ever be backed up.
## Acceptance criteria
- The decision is recorded in `Docs/clipboard-store.md`, `Docs/history-store-file.md` and `Docs/predict.md`.
- Whatever is chosen is set where the directories are created, with tests that read the resource value (`URLResourceValues.isExcludedFromBackup`) from a temporary directory.
Contributor guide
Research direction
Start with Sources/UttrflowCore/Support/LocalStore.swift:26-35 and Sources/UttrflowSpeech/SpeechModelStore.swift:84-89 to trace where the affected directories are created. Review Resources/Uttrflow.entitlements:64-67 and the three documentation files, then determine the backup or encryption decision with the maintainers. Done means the decision is documented and tests verify URLResourceValues.isExcludedFromBackup in a temporary directory.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- macos, swift
- Domain
- desktop, security
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100