Most people reading your screen aren't snooping. They're just sitting behind you, and screens are extremely readable. SafeScreen doesn't ask anyone to be polite — it removes the opportunity.
It reads your head position through the webcam, and blacks the screen out the moment you stop looking at it — or the moment a second face appears behind you.
Screen protected
Waiting for camera
Not a video, and not a mockup — this runs the same state machine as the app. One disqualifying frame hides; three consecutive good ones reveal. Switch tabs or move your cursor off the page and it will protect itself.
The app itself. Left, ready to start; right, protecting, with frames held in memory and nothing written to disk.
01In practice
You know the moment. You tilt the screen a few degrees, or you casually alt-tab to nothing in particular, and then you feel faintly ridiculous for doing it. This is the fix for that reflex.
Shoulder-surfer detection protects the screen when someone else appears in frame — even while you are still looking at it yourself. On by default, and switchable off if you share a desk.
Five sensitivity steps, from "I fidget constantly" to "what is on this screen must not leave this room". It changes both the angle it tolerates and how eagerly it hides.
Calibration works out your neutral head position so detection fits your proportions rather than an average. It has no idea who you are, and stores nothing that could work it out.
The status panel keeps a live count of capture files erased. A privacy tool asking for your webcam should be able to prove what it did with the frames, rather than asking nicely to be believed.
Minimises to the system tray and keeps working. There is also an in-app mode that blurs only its own window, if you would rather not grant anything system-wide.
Camera unplugged, detector wedged, frames stopped arriving — every one of those hides the screen. It will never leave your work on display because something failed quietly in the background.
02Detection
The Windows face detector reports six facial keypoints and never a head angle. Those six points are enough to recover the angles analytically, which is what makes this more than proximity detection.
webcam ──▶ Media Foundation ──▶ BMP in memory ◀── no file is ever │ created ▼ BlazeFace ──▶ 6 keypoints ──▶ head pose yaw · roll · pitch │ ▼ hysteresis ──▶ ■ / □
Model the head as a cylinder: nose at the front, ear points at ±90°. The nose's normalised position t between the two ears collapses to a tangent, so the angle falls straight out.
yaw = atan((t − 0.5) × 2)How far your nose sits below your eye line is a fact about your face, not about your attention — a fixed threshold misfires on real people. SafeScreen learns your neutral value and measures drift.
deviation = ratio − learned_neutralHiding takes one bad frame. Revealing takes several consecutive good ones. Flickering to "protected" is an annoyance; flickering to "visible" is a privacy failure. They are not treated as equal.
framesToProtect ≤ framesToReveal03Frames
The part most tools would leave out of the marketing.
SafeScreen captures through its own Media Foundation path, reading each frame straight into memory and handing it to the detector there. No file is created at any point — nothing to sync, index, snapshot, back up or recover.
That matters because the obvious way to do this on Windows is the wrong one. The Flutter camera plugin has no streaming API: its only way to produce a frame is to encode a JPEG to disk first, and by default that lands in your Pictures folder — Search-indexed, thumbnailed, and on most machines synced to OneDrive. A detector sampling several times a second would upload thousands of photographs of you.
That plugin is kept only as a fallback, for machines where in-memory capture will not start, because losing protection entirely would be worse. There it writes to private temp storage instead of Pictures, and each file is overwritten and deleted the instant it has been read. The status console tells you which path is running. Full detail in SECURITY.md →
04Scope
A privacy tool that overstates itself is worse than none at all.
05Verify
Every release is built by GitHub Actions from a tagged commit — never uploaded from a developer's machine — and carries a provenance attestation you can check against this repository.
PS> Get-FileHash .\SafeScreen-windows-x64.zip -Algorithm SHA256
$ gh attestation verify SafeScreen-windows-x64.zip --repo kv4u/safescreen