Haitham AssoliRead this page in Arabicاقرأ هذه الصفحة بالإنجليزية

Desktop2026

Horizon

Eye breaks that know when you are actually at the computer.

  • In progress
Horizon

Project factsبيانات المشروع

In short

A macOS and Windows desktop app for 20-20-20 eye breaks. What makes it different is that it models presence, tracking idle time, lock state, sleep and wake, and fullscreen suppression, so it does not nag you about a break you were not there to miss.

The compartments

Role
Solo
Year
2026
Status
In progress

Built with

  • Electron
  • TypeScript
  • React
  • electron-vite
  • Vitest
  • Native bridges

What it isما هو

We blink around 60% less at a screen, and the fix is well known and never remembered: every 20 minutes, look 20 feet away for 20 seconds. The hard part of building the reminder is not the timer.

Horizon is the second attempt at this. The first, LookAway, established the shape: tray-resident, local-only, settings in a JSON file, no accounts and no backend. Horizon rebuilt it around an explicit domain model of a break loop, presence, suppression, an overlay and stats, because the first version's bugs were all really modelling problems wearing timer costumes.

نرمش أمام الشاشة أقل بنحو 60%، والعلاج معروف ولا يُتذكَّر أبدًا: كل 20 دقيقة، انظر إلى مسافة 20 قدمًا لمدة 20 ثانية. والجزء الصعب في بناء التذكير ليس المؤقّت.

«هورايزن» هو المحاولة الثانية. أرست الأولى، LookAway، الشكل: مقيم في شريط المهام، محلي بالكامل، إعدادات في ملف JSON، بلا حسابات وبلا خادم. وأعاد «هورايزن» بناءه حول نموذج مجال صريح من حلقة استراحة وحضور وكتم وطبقة عرض وإحصاءات، لأن أخطاء النسخة الأولى كانت كلها مشكلات نمذجة متنكرة في زي مؤقّتات.

Results

  • One codebase for macOS and Windows, with native bridges only where required.
  • Breaks that respect idle, lock, sleep and fullscreen states.
  • Local-only: no account, no backend, settings in a JSON file on disk.
  • قاعدة شيفرة واحدة لماك وويندوز، مع جسور أصلية عند الضرورة فقط.
  • استراحات تحترم حالات الخمول والقفل والنوم والشاشة الكاملة.
  • محلي بالكامل: بلا حساب وبلا خادم، والإعدادات في ملف JSON على القرص.

Challenges

Each one opens twice: what went wrong on the left, what I did on the right.

01

A timer does not know if you are there

Problem

A plain interval timer fires while you are in a meeting, after you locked the screen, and the moment the laptop wakes with four missed breaks queued up. Each of those makes the app feel broken.

What I did

Presence is a first-class concept rather than a check bolted onto the timer: idle, locked, asleep and awake are normalised into one view of whether the user is actually at the computer, and the break loop consumes that instead of raw elapsed time.

02

Interrupting a presentation is unforgivable

Problem

A full-screen break overlay that appears while the user is presenting to a room, or mid-way through a film, is the one failure that guarantees uninstallation.

What I did

Suppression is its own policy, driven by fullscreen and presentation-like states, and it is allowed to override a due break entirely rather than merely delay the overlay.

03

Electron does not expose what is needed

Problem

Lock state, idle detection and fullscreen awareness differ per OS and are not fully available through Electron's cross-platform APIs.

What I did

Minimal per-platform native bridges, used only where Electron genuinely falls short, with everything else staying in shared TypeScript. The bridge is deliberately the smallest bridge that works rather than a full abstraction layer.

Keep goingتابع

Shelf

All projectsAll 40, in six compartments.