uttrflow / uttrflow/uttrflow-swift

Transcripts, clipboard history and learned suggestions are stored unencrypted and included in every Time Machine backup

Open
#654 0 comments 0 reactions 0 assignees View on GitHub
area:general enhancement needs-info P0 security
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.