← All projects

04 · Desktop app · Electron

BlinkFlow

Privacy-first 20-20-20 eye-care timer

  • React
  • TypeScript
  • Vite
  • Electron
  • Node.js

Overview

A privacy-first desktop timer that applies the 20-20-20 eye-care rule without interrupting focused work. After a chosen focus interval it starts an adjustable rest, plays a calm local chime, and can show a dedicated rest screen on the main display or every connected display — fully offline, with all data stored locally.

The problem

Long stretches at a screen strain your eyes, and the 20-20-20 rule (every 20 minutes, look 20 feet away for 20 seconds) is easy to forget. Most break reminders are either easy to ignore or so intrusive they break your focus — and many collect usage data in the cloud.

The solution

BlinkFlow runs quietly while you work, then guides a short rest at the right moment: a gentle chime and an optional fullscreen rest screen that covers no displays, the main one, or all of them. It works offline, has no accounts or telemetry, and keeps every setting on your machine.

Key features

01

Flexible focus & rest

Focus intervals from 1 to 120 minutes and rests from 5 to 120 seconds, with an Auto Mode for continuous cycles.

02

Eye-shaped progress control

Drag the eye-shaped dial to adjust elapsed or remaining time on the fly.

03

Multi-display rest screens

Fullscreen rest overlays on no screens, the main display, or every display — in Ambient, Pitch black, or Black + timer styles.

04

Screen-time stats

Tracks total screen time, eye-rest time, and completed rests, and leaves laptop sleep out of screen time.

05

Tray & keyboard control

System-tray controls while hidden, launch at login, and shortcuts — Space, R, S, and Escape.

06

Restores after restarts

Timestamped timer snapshots, written atomically, so a session resumes correctly after the app restarts.

How it's built

  1. InterfaceReact and TypeScript renderer built with Vite, with local fonts and no remote dependencies.
  2. Desktop shellElectron main process running the timer engine, tray, displays, and persistence.
  3. Shared contractOne timer-state contract shared by Electron and React, over validated IPC.
  4. StorageLocal JSON snapshot in the app's data folder plus local-storage preferences — nothing in the cloud.
  5. SecuritySandboxed renderers, a restrictive CSP, blocked navigation, and locked production Electron fuses.
  6. DeliveryCI on Ubuntu, macOS, and Windows; packaged as DMG/ZIP, an NSIS installer, and an AppImage.

Challenges

Accurate time through sleep and restarts

Laptop sleep shouldn't count as screen time, and a restart shouldn't lose the session — handled with sleep/wake events and timestamped, atomically written snapshots.

Locking down a desktop app

Electron apps can expose a lot; BlinkFlow sandboxes renderers, validates every IPC call, blocks navigation, and locks Electron fuses in every packaged build.

Outcome

A cross-platform, offline eye-care companion that protects your eyes without breaking your focus — with a full test suite and CI on all three desktop platforms.