על האפליקציה
Pulse היא אפליקציית רשת מתקדמת (PWA) שהופכת את הטלפון שלך למד דופק אופטי, באמצעות טכניקה רפואית ידועה בשם PPG (Photoplethysmography).
הצמד את קצה האצבע בעדינות על העדשה האחורית של המצלמה, עם הפלאש דולק. האור עובר דרך האצבע, וכל פעם שהלב פועם — גל דם חולף, וכמות האור הנספגת משתנה במעט. Pulse מנתחת את שינויי הצבע 30 פעמים בשנייה, מזהה את ה-peaks ומחשבת את הקצב.
הטלפון שבכיס שלך הוא מד דופק שעדיין לא ידעת שיש לך.
לחצו לנסות בעצמכם → ofir.zbang.net/pulse
האפליקציה רצה כאן בייצור — אפשר להתקין על המסך הבית. חייב לפתוח בטלפון עם מצלמה אחורית ופלאש.
יכולות מרכזיות
- קריאה תוך 15-20 שניות — מציגה ערך BPM יציב אחרי שצברה מספיק peaks תקפים.
- גרף PPG חי — waveform מצויר ב-Canvas 2D עם gradient stroke וצללים, peaks מסומנים בנקודות זוהרות.
- לב פועם — אייקון לב שמתרחב בכל peak שזוהה, מסונכרן עם vibration קצר.
- HRV (Heart Rate Variability) — חישוב RMSSD-like על intervals — מדד עדין לבריאות העצבים.
- Signal Quality — ניתוח של dominance של ערוץ אדום, מאזהר אם האצבע לא מכסה כמו שצריך.
- שמירת מדידות — תן שם ("בוקר אחרי קפה", "אחרי ריצה") → IndexedDB עם BPM, HRV, quality, timestamp.
- היסטוריה צבעונית — כל מדידה מוצגת עם צבע לפי טווח הקצב (כחול=ספורטאי, ירוק=נורמלי, צהוב=מוגבר, אדום=גבוה).
ארכיטקטורת ה-PWA
- getUserMedia(camera) —
facingMode: { ideal: 'environment' }עם אופטימיזציה ל-320×240 לתפוקה מהירה. - Torch API —
track.applyConstraints({ advanced: [{ torch: true }] })— הדלקת הפלאש אוטומטית אם נתמכת. - Canvas 2D pixel reading —
getImageDataעל אזור 60×60 פיקסלים במרכז ה-frame, לולאת RGB sum. - Detrending + peak detection — moving average חיסור (DC offset removal), ואז local maxima detection עם min-distance של 350ms (max ~170 BPM).
- Median + outlier filtering — חישוב BPM יציב על ידי median של intervals, סינון לטווח 40-200 BPM.
- Wake Lock API — מסך לא ננעל במהלך מדידה ארוכה.
- IndexedDB — מדידות persistent עם indexes על createdAt.
- Service Worker — cache shell, runtime stale-while-revalidate.
- Vanilla JS, אפס תלויות — כ-30KB total.
עיצוב
- פלטה rose/pink —
#f43f5eprimary +#fb7185light +#1a0a14deep rose-black. - Glassmorphic stage — backdrop-filter על הכרטיס המרכזי.
- Color-coded BPM ranges — ירוק לבריא, אדום לחריג, אינטואיטיבי.
- Live waveform — gradient stroke לאורך, peaks זוהרים.
פרטיות מוחלטת
- שום תמונה לא נשמרת ולא נשלחת לשרת. Frame buffer נצרך ומיד נמחק.
- כל המדידות נשארות רק במכשיר ב-IndexedDB.
- אין רישום, אין tracking, אין account.
הערה חשובה
זוהי מדידה ביתית, לא רפואית. לא מחליפה ECG, שעון חכם מכויל, או שיחה עם רופא. שונות הקריאה בין מדידות נורמלית עקב תזוזות אצבע, לחץ, מצב הפלאש. למעקב רפואי אמיתי — השתמש במכשיר ייעודי.