privacy-hybrid security dashboard
Generated from REMEDIATION_TRACKER.md.
Self-assessment by the owner, not an independent audit.
What protects you
- ✔Sensitive text is masked or blocked before it leaves
- ✔Extreme privacy cannot be undone by accident
- ✔Sign-in is hardened
- ✔Network traffic is protected
- ✔Accounts are kept apart
- ✔Nothing readable is kept in memory caches
- ✔Tamper-evident audit log
- ✔Cloud helper sends only the prompt
- ✔Locked-down install
- ✔Supply chain pinned and checked
- ✔Public repo is protected
Known limits
- PH-003 Spelled SSN, non-Latin names: accepted limit
- PH-016 In-process egress guard scope: accepted limit
- Not yet verified: Real local second-pass model efficacy
- Not yet verified: Keychain item access control for the scheduler key
- Not yet verified: TLS trust on devices, certificate renewal
- Not yet verified: pf lockdown correctness
- Not yet verified: Transitive dependency vulnerabilities
Findings
PH-001Closed
Passport numbers missed
Closed
PH-002Closed
Non-US addresses not masked
Closed
PH-004Closed
No default setup token
Closed
PH-005Closed
Plain HTTP on LAN allowed
Closed
PH-006Closed
Older file restores undo Extreme privacy
Closed
PH-007Closed
Scheduler cannot read Extreme setting
Closed
PH-008Closed
Root-run script in writable path
Closed
PH-009Closed
Body read before auth
Closed
PH-010Closed
Per-address throttling only
Closed
PH-011Closed
scrypt cost modest
Closed
PH-012Closed
Plaintext kept in lru_cache
Closed
PH-013Closed
Admin succession by mtime
Closed
PH-014Closed
Unpinned transitive deps, model, Actions
Closed (residual: Dependabot vs lock)
PH-015Closed
Repo governance gaps
Closed (nothing reaches public main except through a pull request with the four checks green and the owner's merge click, admins included; accepted residual: no signed commits and no independent reviewer, because the owner is the only maintainer)
PH-017Closed
Public threat model stale
Closed
PH-018Closed
/api/config visible to all users
Closed
PH-019Closed
Log dir permissions, no tamper evidence
Closed (log rotates at 10 MB, keeps 12 archives; hash chain continues across a rotation)
PH-020Closed
Claude CLI traffic beyond stdin
Closed (owner-run capture 2026-11-02, three runs; last: the app's setup made one request, to api.anthropic.com; no canary, no telemetry, no connector traffic; control valid)
PH-003Accepted
Spelled SSN, non-Latin names
Accepted (the detector cannot mask spelled-out numbers or non-Latin names; mitigations: the script guard refuses, a "maybe sensitive" warning forces the preview and a second confirmation even with Review off, and the owner sees the text before it leaves; deliberate sharing by the user is out of scope)
PH-016Accepted
In-process egress guard scope
Accepted
Timeline
- PH-003 moved to Accepted by the owner's decision, with a new mitigation: a "maybe sensitive" warning (digits spelled out, long unmasked numbers, words like passport or account number) forces the preview and a second "send anyway" confi
- PH-015 Closed. enforce_admins turned on for public main (required: pull request, 4 status checks; 0 approvals because a sole owner cannot approve their own pull request). The owner can no longer push straight to main; every change needs a pull request, green c
- PH-020 Closed. The app's CLI now runs with a private config folder (when present), telemetry and error reporting off, and no MCP servers or account connectors. Owner-run capture with a valid control (the user-memory canary shows up when settings are allow
- PH-019 Closed: the audit log now rotates at 10 MB and keeps 12 archives; the first line of the new file carries the hash of the archive's last line; test test_audit_log_rotates_and_keeps_the_chain. Counts: 16 Closed, 3 mostly fixed (PH-003, 015, 020), 1 A
- PH-020 capture run by the owner (mitmproxy, own user, real login, canaries planted in CLAUDE.md and a filename). Result: no canary in any request; prompt text only in the message request. Finding: the CLI also sent usage telemetry and error metadata to Anthrop
- PH-008 Closed. Owner-run test on a real root-owned copy at /usr/local/ph008: trusted copy returns True; the user-owned checkout returns False; making the scripts directory group/world-writable returns False. Counts: 15 Closed, 3 mostly fixed, 1 Accepted, 1 Ope
- Re-review. PH-008: confirmed the script and all its parents are owned by the app user; added an owner/mode/symlink check on the script and every parent immediately before osascript (local, uncommitted) and 7 tests; the previously cited test_refuses_non_root_sc
- Public: PH-011, 017 Closed; PH-003, 019 mostly fixed. PH-015 settings changed on the public repo (secret scanning, push protection, Dependabot security updates, real required check names).
- Public: PH-009, 010, 012, 013, 018 Closed; PH-019 partly fixed; PH-014 Closed with residual; pytest moved to requirements-dev.txt. Fix-commit column filled in.
- Public CI green. PH-005 Closed; PH-014 partly fixed.
- PH-005 and PH-014 fixed in private; pushed to public for CI. PH-008 left open on purpose.
- Fixes pushed to public as; CI green. PH-001, 002, 004, 006, 007 set to Closed.
- PH-001, 002, 004, 006, 007 fixed in the working tree with regression tests (613 tests pass locally). Not committed; become Closed when merged and green in CI.
- Tracker created from the assessment. All items open.
Deeper detail: docs/security.