LocalFlow's update path trusts tagged GitHub source releases from the codejunkie99/LocalFlow repository. The in-app updater is user-invoked only and:
- reads GitHub release metadata only after the user chooses Update LocalFlow;
- requires a
localflow-release.jsonmanifest with a strict semantic version, a 40- or 64-character lowercase hex commit, and a 64-character lowercase hex SHA-256; - verifies the downloaded source archive checksum before extraction;
- rejects archive entries that are absolute, contain
.., use backslashes, or fall outside the single top-level source directory; - builds the checkout with a clean environment containing only
PATH,HOME,TMPDIR,LOCALFLOW_SIGNING_IDENTITY, and the validatedLOCALFLOW_VERSION; - requires the staged bundle to carry bundle identifier
dev.localflow.appand the same code requirement as the installed app; - replaces the app through a minimal helper with a single previous-app rollback copy and automatic restoration on failure.
scripts/setup-localflow.sh prefers an existing Developer ID Application or Apple Development identity. If none exists, it creates one LocalFlow Local Signing self-signed code-signing identity in the current Mac's login keychain. The signing identity is local to that Mac; deleting it can cause macOS to request Accessibility permission again after an update.
Transcript history is stored at ~/Library/Application Support/LocalFlow/history.sqlite3 for the current user only:
- Database, WAL, SHM, and backup files are created with mode
0600; the parent directory uses0700. - Transcript content is never uploaded, transmitted, or written to logs.
- Audio, cleanup prompts, and clipboard contents are never stored.
- The store checkpoints the WAL before updates and migrations and keeps one recoverable backup.
- Clear History deletes transcript rows without modifying permissions or settings.
LocalFlow never edits the macOS TCC database. It requests Microphone and Speech Recognition through explicit buttons and opens System Settings for Accessibility. Permission preservation depends on keeping the same bundle identifier (dev.localflow.app) and code requirement across updates.
Security issues should be reported privately through the repository owner's contact details on the GitHub profile. Do not include transcript content or personal dictation data in a report.