You are browsing as a guest. Sign up (or log in) to start making projects!

Ghost Mode

  • 1 Devlogs
  • 5 Total hours

Ghost Mode is a cross-platform desktop privacy assistant that automatically protects sensitive information when someone looks over your shoulder. Using real-time computer vision, it detects the presence of unauthorized viewers and instantly blurs or hides selected applications—without interrupting your workflow. Private by design, Ghost Mode processes everything locally, ensuring your data never leaves your device.

Open comments for this post

4h 37m 14s logged

Devlog: Ghost Mode — Phase 1 (Base UI & Core Detection)📅 Date: July 11, 2026🏁 Status: CompletedAfter spending the past few days building the groundwork, Phase 1 of Ghost Mode is officially done. The goal wasn’t to build flashy features yet—it was to create a solid foundation that won’t become a headache later.What got builtI restructured the project into a clean, modular architecture with separate layers for models, face detection, background services, and the UI.

Keeping everything decoupled now should make future features much easier to add.On the performance side, I built a multithreaded camera pipeline using Qt’s QThread.

Camera capture, MediaPipe face detection, and frame processing all happen off the main UI thread, so the interface stays smooth while processing frames at around 30 FPS.

The UI is heavily inspired by Raycast’s clean aesthetic—a dark theme, rounded corners, subtle borders, sidebar navigation, and custom controls.The camera preview is also custom-built. It preserves the camera’s aspect ratio, clips everything into a modern rounded container, and draws animated glowing face boxes with futuristic corner accents whenever a face is detected.

To make the app feel more alive, I also added a state-based status indicator that switches between Offline, Scanning, and Face Detected, complete with pulsing status dots.Interesting problems I ran intoOne issue was PySide6’s QImage.
Since it references raw NumPy memory, sending frames directly between threads can easily lead to crashes if that memory gets freed before the UI finishes rendering.The fix was simple but important: create a deep copy of the image before emitting it from the worker thread.

It costs a tiny bit of memory but makes the pipeline completely thread-safe.Another challenge was mapping MediaPipe’s normalized face coordinates onto a resized camera preview.
Instead of stretching the video, the preview scales while maintaining aspect ratio, so I had to convert normalized coordinates into the preview’s actual pixel space to keep the detection boxes perfectly aligned.
I also spent some time dealing with camera switching and macOS camera permissions.

Adding mutex guards around runtime camera changes eliminated the small freezes I was seeing when swapping devices.TestingI wrote unit tests for the core data models and mocked the MediaPipe detector to verify face coordinate parsing.

Results: ✅ 5 tests passed (with 2 warnings).I also did a full smoke test to make sure the application starts correctly and every module hooks together as expected.

What’s next?
With the camera pipeline, UI, and real-time face detection working, the groundwork is finally in place.

Phase 2 is where Ghost Mode starts getting interesting: Owner Enrollment. The app will learn who the device owner is and begin distinguishing them from everyone else.

0
0
1

Followers

Loading…