Commit graph

7 commits

Author SHA1 Message Date
Aric Camarata
65f69ac5ce Docs: publish to GitHub Wiki; point README back to wiki pages 2026-06-23 11:33:31 -04:00
Aric Camarata
54332f32d6 Docs: host wiki pages in-repo with working links; fix two Settings defaults 2026-06-23 11:26:48 -04:00
Aric Camarata
f62f8fd327 CI: checkout@v5 (Node 24; v4's Node 20 is removed from runners 2026-09) 2026-06-10 11:33:03 -04:00
Aric Camarata
4c55409232 CI: Swift 6 toolchain runner + tests; add CHANGELOG; silence CC_SHA256 result
The macos-14 runner's Swift 5.10 rejects region-isolation patterns (weak-self
captures in MainActor Tasks) that the codebase relies on; move CI to macos-15
and run the test suite alongside the release build.
2026-06-10 11:31:21 -04:00
Aric Camarata
8c19e960d2 Detection root-cause fix + audit batch: netstat path, UDP activator, settings coherence, refactor, docs
Detection: netstat lives at /usr/sbin/netstat, not /usr/bin — the hardcoded wrong
path silently killed the ESTABLISHED-TCP activator (root cause of the failed live
test). Fixed and live-verified. Added peered-UDP activator (5900-5902) for
High-Performance sessions, per-signal transition logging, unconditional error
logging for dead probe helpers, and probe v2 with full CGSession dictionary
diffing. 7 new parser tests (32 total).

Fixes from a full audit + adversarial review: idle source setting honored
(default now Remote session activity), cover scope reduced to a coherent
two-mode model with legacy migration (per-display toggle was inverted in
onlyMarked and dead in all), curtain test no longer schedules a teardown over a
live session, specific-display password box placement gets a real picker,
refuse-to-arm enforced, activation notification posts a real banner, menu
password gate bypassed when the event tap is dead, shared single-decoder aerial
player with stale-task guard and async playability check, password buffer zeroed
on successful unlock and Esc, XPC interruption/invalidation handlers, modern
Accessibility settings URL, launchPath modernized, codesign failures now abort
release.sh, monotonic CFBundleVersion, install.sh temp cleanup, dead
armDisarmHotkey setting removed.

Refactor: Curtain.swift and PreferencesWindow.swift split into focused files
(largest now 479 lines). Wiki, README, and contributing docs updated to match.
Build clean at 0 warnings, 32/32 tests pass.
2026-06-09 20:36:30 -04:00
acamarata
fa2efa5d05 Add wiki: Home, Installation, How-It-Works, Architecture, Lessons-Learned, Troubleshooting 2026-06-01 14:12:48 -04:00
acamarata
709669e0cb Curtain v1.0.0 — privacy curtain for macOS Screen Sharing
Menu-bar agent that, on a Screen Sharing connection, covers the host
displays and blocks physical keyboard/mouse from the apps while remote
input passes through, then locks the Mac on idle or disconnect.

- netstat-based session detection (debounced)
- CGEventTap input filter (block physical sourceStateID==1, pass remote)
- .none/.readOnly cover windows with on-curtain password box
- SACLockScreenImmediate lock + IOKit display-sleep assertion
- root helper (NOPASSWD) to disconnect the Screen Sharing session
- install/uninstall scripts, app bundle, login agent, CI
2026-06-01 14:10:50 -04:00