נפרדתי מ-Shorts: בניתי Chrome extension שחוסם אותי

פורסם במקור כפוסט בלינקדאין, והורחב כאן.

הקוד ב־GitHubOmerLapidot/scrollguard

בניתי לעצמי Chrome extension בשם ScrollGuard שמודד כמה זמן אני מבלה באתרים שבחרתי, וברגע שעברתי את המגבלה מכסה את העמוד בשכבת חסימה שלא נפתחת עד שאני מקליד סיסמה שקבעתי מראש. הוא נכתב מסיבה אחת: לגמול את עצמי מ-YouTube Shorts. שתי מסקנות יצאו מזה, ושתיהן לא טכניות במיוחד — שהסיסמה היא מהמורה מול דחף ולא אמצעי אבטחה, ושבניית Chrome extension היא נקודת הכניסה שאני ממליץ עליה למי שמתחיל עם Claude Code.

אני הראשון ליפול למניפולציות האלגוריתמיות של הרשתות החברתיות. הן פשוט נהיו טובות מדי.

מאיפה זה התחיל

קריאה של "מהפכת הקשב" של מיכה גודמן הביאה אותי להבנה שאני נותן את הנוכחות שלי עצמה לתאגידים מרושעים שמוכרים אותה בציניות לכל המרבה במחיר. זו בעיניי הבעיה הגדולה ביותר של האדם המודרני, ואני אומר את זה בלי להגזים.

אז יצאתי למסע גמילה. לשמחתי לאינסטגרם ולטוויטר אף פעם לא הספקתי להתמכר, ואת פייסבוק מחקתי מזמן כי הוא כבר לא מגניב.

נשאר יוטיוב. הוא הצטרף אל האופל והפך מאי בודד של תוכן אמיתי באורך מלא לעוד מפעל פיטום אנושי של זבל מלאכותי מפוקסל, הידוע בכינויו Shorts.

למה יוטיוב דורש כלי ולא החלטה

זה ההבדל המבני שלא שמתי לב אליו קודם. בכל הרשתות האחרות הגמילה היא פעולה חד-פעמית: מוחקים יוזר ברגע של בהירות, ואז שוכחים מזה אחת ולתמיד. הדלת נסגרת.

ליוטיוב הגישה חופשית. אין יוזר למחוק, אין נקודה שבה סיימת. הדלת פתוחה בכל טאב חדש, בכל רגע חלש. החלטה טובה לא שורדת מול זה, כי היא צריכה להילקח מחדש עשרים פעם ביום.

אז יצרתי לי שומר. לא כדי שיחליט במקומי, אלא כדי שיעכב אותי מספיק זמן כדי שההחלטה שכבר קיבלתי תספיק להגיע.

מה התוסף באמת עושה

ScrollGuard הוא Manifest V3, בלי שלב בנייה ובלי bundler — מה שמתקינים זה מה שכרום מריץ. אין שרת, אין חשבון, אין קוד רשת בשום מקום בקוד. כל המידע יושב ב-chrome.storage.local.

  • הוא מודד זמן לפי דומיין (הקידומת www. מוסרת), וסופר רק כשהטאב באמת גלוי — טיקים של שנייה, שנשלחים לאחסון כל עשר שניות.
  • לכל דומיין יש שתי מגבלות נפרדות: יומית וסשן. ברירות המחדל הן 60 ו-30 דקות.
  • ערך 0 באחת מהן חוסם את הדומיין לחלוטין, בלי תקציב זמן בכלל.
  • כשעוברים מגבלה, content script מכסה את הדף וחוסם גלילה.
  • הסיסמה הנכונה פותחת את הדומיין הזה לחמש דקות בלבד — מספר קבוע בקוד. הזמן ממשיך להיספר בזמן שפתוח, אז ברגע שהחמש דקות נגמרות הטיק הבא מחזיר את החסימה.
  • יש popup עם הסך היומי, ודשבורד עם דונאט ובורר תאריכים ל-30 הימים האחרונים. אלארם שעתי מוחק את הסטטיסטיקות היומיות שישנות מ-30 יום ומנקה נעילות שפגו.

הסיסמה שקבעתי לעצמי היא iamaloser. זה חלק מהעיצוב.

ההגדרה עצמה פשוטה: מזינים דומיין — https:// ו-www. מוסרים אוטומטית, ונדרשת נקודה כדי שזה ייחשב תקין — ואז מגבלה יומית ומגבלת סשן בדקות. שדות ריקים מקבלים 60 ו-30. אחר כך שתי המגבלות ניתנות לעריכה ישירות בטבלת הכללים ונשמרות בכל שינוי, והסיסמה היא ארבעה תווים לפחות, מוקלדת פעמיים.

יש שם מלכודת אחת שכדאי להכיר: אם הגדרתם כלל אבל לא הגדרתם סיסמה, שכבת החסימה עדיין תופיע כשתעברו את המגבלה — פשוט לא יהיה בה שדה סיסמה. צריך לפתוח Settings מתוך שכבת החסימה עצמה, להגדיר סיסמה או למחוק את הכלל, ולרענן. בפעם הראשונה שנתקלים בזה זה נראה כמו באג, ובעצם זה בדיוק מה שהקוד אומר.

לגבי הרשאות, כדאי לדעת בדיוק מה מבקשים: מעבר ל-storage, tabs ו-alarms, התוסף מבקש גישה לכל אתר http ו-https. זה נשמע הרבה, והסיבה פשוטה — המדידה עצמה רצה בכל דף, כי היא צריכה לדעת מתי אתם על דומיין שהגדרתם. אין שם שום דבר מעבר. את זה אני מרשה לעצמי רק כי אני יודע מה כתוב בקוד; לתוסף חסימה שמורידים מהחנות הייתי שואל את אותה שאלה בדיוק.

מה שהוא לא, ולמה כתבתי את זה ב-README

הסיסמה נשמרת כטקסט גלוי. לא מגובבת, לא מוצפנת. כל מי שיכול לקרוא את האחסון של התוסף — קונסולת ה-service worker מתוך chrome://extensions, קובצי הפרופיל בדיסק — קורא אותה בשניות.

זו הכרעה מודעת ולא מחדל שאני מסתיר. מודל האיום כאן הוא אני, באחת בלילה, כשמתחשק לי לגלול. פרומפט של סיסמה הוא בדיוק מספיק חיכוך כדי לקטוע את זה. זו לא בקרת הורים, וזה לא כלי שמישהו אמור להפעיל על גלישה של מישהו אחר.

מה כן טיפלתי בו: הסיסמה הגלויה לא יוצאת מה-service worker. בגרסה מוקדמת יותר הודעת GET_ALL_STATS החזירה אותה לכל דף של התוסף שביקש, וה-content script קרא אותה ישר מהאחסון בכל טעינה של דף חסום. שניהם תוקנו — היום הדבר היחיד שיוצא מה-worker בנוגע לסיסמה הוא בוליאני hasPassword, וההשוואה עצמה קורית רק שם.

והפערים שנשארו, כי עדיף לכתוב אותם מאשר לגלות אותם:

  • שכבת החסימה היא div בדף. מחיקה שלו ב-devtools, כיבוי התוסף או פתיחת האתר בפרופיל אחר עוקפים אותה לגמרי.
  • מגבלת ה"סשן" לא מתאפסת לבד. היא מתאפסת רק בלחיצה ידנית, ושורדת סגירת טאבים ואתחול מחדש. בפועל זו מגבלה מצטברת שנייה, וזה הפער הגדול ביותר בין השם להתנהגות.
  • היום מתחלף בחצות UTC, כי מפתח התאריך מגיע מ-toISOString(). בישראל זה אומר שהמונה היומי מתאפס ב-02:00 או ב-03:00.
  • אפשר לחרוג מהמגבלה בכעשר שניות, כי הבדיקה מתבצעת רק כשהמונה נשלח לאחסון.
  • אותו דומיין פתוח בשני חלונות גלויים נספר פעמיים, כי המדידה היא פר-טאב.
  • הדף נראה לרגע לפני שהחסימה מופיעה.
  • אין הגבלת קצב על ניחושי סיסמה.

והאירוניה הכי גדולה: הכללים תופסים דומיין מלא בלבד. אין wildcards ואין כללים לפי נתיב, כך שאי אפשר להגביל את youtube.com/shorts — רק את יוטיוב כולו. יצאתי להיפרד מ-Shorts וקיבלתי כלי שחוסם גם את מה שאהבתי שם מלכתחילה.

Chrome extensions הם ה-Hello World החדש

זה החלק שרלוונטי גם למי שלא אכפת לו מ-Shorts.

למי שלא התנסה ב-Claude Code מעולם — extensions זו נקודת הכניסה. פשוט מבקשים ממנו בשפה פשוטה מה אתם רוצים שיקרה ועל איזה אתר זה אמור להשפיע. הוא מייצר את התוסף בקלילות, וגם שם לכם אותו בתיקייה הנכונה שכרום יודע לטעון ממנה. מ-0 למוצר עובד — לוקאלית אמנם — ליטרלי בפרומפט אחד.

הסיבה שזה עובד כל כך טוב היא שהפורמט מצומצם: manifest, service worker, content script. הדפדפן נותן את כל התשתית, וכל מה שנשאר לתאר זה ההתנהגות שאתם רוצים. אתם לא מתמודדים עם דיפלוי, עם משתמשים אחרים או עם אחסון בענן.

וההתקנה היא באמת המקום שבו אנשים נתקעים, אז שווה לדעת שהיא לא באמת מסובכת: נכנסים ל-chrome://extensions, מדליקים Developer mode, לוחצים Load unpacked ובוחרים את התיקייה שבה יושב ה-manifest. זהו. התוסף שלי אפילו לא כולל קובצי אייקון, אז כרום מציג לו את אייקון הפאזל הכללי — וזה לא הפריע לו לעבוד אף פעם.

למתקדמים: בקשו מ-Claude Code להתקין chrome dev-tools לפני שאתם מתחילים. אז הוא יוכל להיכנס בעצמו לאתר שעליו אתם רוצים שהתוסף יעבוד, להתרשם ולחקור אותו. אפשר גם לראות אותו מזיז שם דברים בזמן אמת, וזה מאוד מגניב.

מה לוקחים מזה

הכלי הכי שימושי שתבנו לעצמכם השנה כנראה לא יהיה מרשים טכנית. הוא יהיה קטן, מכוער, ויפתור בעיה אחת שרק אתם חווים — ולכן אף אחד לא היה בונה אותו בשבילכם. זה מה שהשתנה: העלות של לבנות כלי אישי ירדה מספיק נמוך כדי שיהיה שווה לבנות אותו גם כשהוא רק מהמורה, וגם כשהוא לא באמת עומד בשם שנתתם לו.

וזה בדיוק מה שאני מנסה לפתוח בארגונים — לא עוד מערכת, אלא היכולת של אנשים לבנות לעצמם את הדבר הקטן שחסר להם. ככה נראה התהליך שאני עושה עם ארגונים.

שאלות שחוזרות

איך חוסמים YouTube Shorts בכרום?

בניתי לעצמי Chrome extension בשם ScrollGuard שמודד זמן לפי דומיין ומכסה את העמוד בשכבת חסימה ברגע שעברתי מגבלה יומית שהגדרתי. כדי להמשיך צריך להקליד סיסמה שקבעתי מראש, וההסרה תקפה לחמש דקות בלבד. חשוב לדעת: התוסף עובד ברמת הדומיין, אז הוא חוסם את כל youtube.com ולא רק את הנתיב של Shorts.

אפשר לבנות תוסף כרום עם Claude Code בלי להתנסות בו קודם?

כן, וזה הפרויקט הראשון שאני ממליץ עליו למי שלא התנסה מעולם. מתארים בשפה פשוטה מה התוסף אמור לעשות ועל איזה אתר, ו-Claude Code מייצר את הקבצים ושם אותם בתיקייה שכרום יודע לטעון ממנה. את הטעינה עצמה עושים ידנית ב-chrome://extensions, וכדאי גם לקרוא מה נכתב.

האם סיסמה בתוסף חסימה היא אמצעי אבטחה?

לא. בתוסף שלי הסיסמה נשמרת כטקסט גלוי ב-chrome.storage.local, ושכבת החסימה היא אלמנט div בדף שאפשר למחוק ב-devtools או לעקוף בכיבוי התוסף. זה מספיק כדי לעצור דחף רגעי שלי, אבל זה לא בקרת הורים ולא מוצר אבטחה.

למה קשה יותר להיגמל מיוטיוב מאשר מפייסבוק או אינסטגרם?

כי ליוטיוב הגישה חופשית ואין חשבון שאפשר למחוק ברגע של בהירות ואז לשכוח מזה. ברשתות אחרות המחיקה היא פעולה חד-פעמית שסוגרת את הדלת. ביוטיוב הדלת תמיד פתוחה, ולכן צריך משהו שיושב בין הדפדפן לבין הדחף.