1002
Runs entirely on your device

A quieter kind of
focus coach.

1002 watches through your webcam during the focus blocks you choose. It notices when you pick up your phone, when you leave your desk, and — at the end — hands back an honest score. No cloud. No telemetry. Just you and the work.

Works on any phone or laptop · Camera stays on your device

A calm wooden desk with an open laptop showing the 1002 dashboard
Focus score
87
of 100
Phone time
0:04:12
in 25 min
Away time
0:00:38
grace: 8s
Session
25 min
deep work

Three small observations, one honest number.

It watches only when you say so.

You start a focus block from the sidebar — 5 to 120 minutes. Outside of that, the camera is off. There is no background daemon.

It notices what you already knew.

YOLOv8 flags the phone the moment it enters frame. MediaPipe flags the empty chair. Short glances and quick stretches are forgiven by grace windows.

It hands you a score, not a lecture.

0–100, plus a minute-by-minute timeline of where you drifted, plus a weekly line telling you whether you're actually getting better.

The stack

Boringly proven parts, carefully wired.

Each dependency does one job it's the best in the world at, and none of them phone home.

YOLOv8n (Ultralytics)
Real-time cell-phone detection at ~20 fps on CPU.
MediaPipe Face Detection
Google's on-device presence check — is anyone at the desk?
OpenCV
Camera capture, colorspace, overlays, everything visual.
Streamlit + Altair
The dashboard: score, timeline, weekly trend.
SQLite (~/.1002)
Session history, stored locally, deletable with one click.

Run it in four commands.

Unzip the download, drop into the folder, and follow along. Streamlit opens the dashboard in your browser at localhost:8501.

cd focusguard
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
streamlit run app.py

First launch downloads yolov8n.pt (~6 MB). That's the only network call the app will ever make.

Your camera. Your machine. Full stop.

Frames are analyzed in memory and discarded — never written to disk, never uploaded. Session records live in a plain SQLite file at ~/.1002/sessions.db. Delete it whenever, or clear it from the dashboard.