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

3 דברים לנסות בדמו.
הדמו הוא האפליקציה עצמה, עם החיפוש של דנה, משתמשת בדויה שמחפשת דירה לקנייה ובמקביל שכירות. כל פעולה עובדת באמת, אבל רק בזיכרון של הדפדפן, ורענון מחזיר הכל להתחלה.
פתחו את הדירה הראשונה
לחצו על הכרטיס הראשון ברשימה, עם 98%. במגירה שנפתחת יש "למה 98%": כל קריטריון, כמה הוא חשוב ואם הדירה עומדת בו. התג "3 מודעות" אומר שאותה דירה נמצאה בשלושה מקורות ואוחדה לכרטיס אחד, ולמטה מופיעה היסטוריית המחיר.
הפכו חניה לחובה
היכנסו ל"פרופיל וקריטריונים" (בנייד: "פרופיל"). בכרטיס "חניה" בחרו "חובה" וחזרו ל"דירות". במקום 23 דירות מוצגות יישארו 16: כל דירה בלי חניה נפסלת מיד, בלי סריקה חדשה.
סמנו דירה כלא רלוונטית
לחצו על אייקון "לא רלוונטית" בתחתית כרטיס, בחרו "יקרה מדי" ואשרו. במסך "לא רלוונטיות" (בנייד: תחת "עוד") המערכת תציע לבטל את המרווח מעל תקרת המחיר, כי כבר 3 דירות נפסלו בגלל המחיר. "החל" מעדכן את הפרופיל.
נתונים מומצאים · נפתח בטאב חדש
חיפוש דירה הוא עבודה במשרה חלקית.
דירות מתפרסמות במקביל באתרי מודעות ובקבוצות, לפעמים רק במקום אחד, ולפעמים נעלמות תוך יום. מי שמחפש ברצינות פותח את אותם חיפושים כמה פעמים ביום, וקורא שוב ושוב מודעות שכבר ראה. בניתי את הכלי קודם כל בשביל עצמי, ואלה ארבעת הדברים שרציתי שיפסיק לעשות במקומי.
אותה דירה, שלוש פעמים
בעלים ומתווכים מפרסמים את אותה דירה בכמה מקומות, בניסוח אחר ועם תמונות אחרות. בלי איחוד, כל דירה נבדקת שלוש פעמים, ואין דרך לדעת שזו אותה דירה.
סינון שלא מבין "חשוב"
הסינון באתרים הוא כן או לא: מחיר עד, חדרים מ. אין בו "מעלית חשובה לי מאוד, מרפסת נחמד שיהיה", ואין "קצת מעל התקרה, אבל אולי יש מקום למו"מ".
פוסטים בטקסט חופשי
בקבוצות אין שדות. המחיר, החדרים והקומה מסתתרים בתוך פסקה, ולצד המודעות יש פוסטים של אנשים שמחפשים דירה ולא מציעים אחת.
שינויים שקל לפספס
ירידת מחיר בדירה שכבר ראיתם, או דירה שנייה שמתפרסמת באותו בניין. אלה בדיוק הרגעים שחשובים, ואף אחד לא מתריע עליהם.
המטרה: לפתוח את הטלפון ולראות רק דירות ששוות בדיקה. מדורגות לפי מה שחשוב לי, בלי כפילויות, ועם הסבר למה כל דירה קיבלה את הציון שלה. את הסריקה, ההשוואה והמעקב המערכת עושה ברקע.
שלושה חלקים, וכל אחד עושה דבר אחד.
התוסף סורק, הענן מחזיק את הנתונים, והאפליקציה היא הממשק. הקוד שמדרג, מאחד ומפענח מודעות כתוב פעם אחת בתיקייה משותפת ונבנה לשני הצדדים, כך שהציון בסורק והציון בנייד תמיד זהים.
סורק · תוסף Chrome
- מקורות שהמשתמש בחרכתובת של חיפוש או קבוצה
- טאב רקע שקטכל 30 דקות, כש-Chrome פתוח
- חילוץ, איחוד ודירוג
- שליחת התראות
ענן · Supabase
- 5 טבלאותRLS בכל אחת
- התחברות בהזמנה בלבד
- עדכונים בזמן אמת
אפליקציה · PWA
- 10 מסכיםמחשב ונייד
- מועדפים, סטטוס והערות
- עריכת פרופילים וקריטריונים
התראות
- התראה במחשב
- בוט טלגרםעם תמונה וקישור
- מיילכולל סיכום יומי
מה קורה בכל סבב, ומה קורה כשלוחצים.
ציון שמסביר את עצמו.
כל פרופיל הוא חיפוש נפרד, למשל קנייה עכשיו ושכירות בינתיים, עם רשימת קריטריונים ורמת חשיבות לכל אחד: כבוי, נחמד שיהיה, חשוב, חשוב מאוד או חובה. כל קריטריון מקבל ציון בין 0 ל-1, והאחוז הוא ממוצע משוקלל. קריטריון "חובה" שנכשל בוודאות פוסל את הדירה. כשחסר מידע, למשל מודעה שלא מציינת קומה, הקריטריון נספר כחצי, כדי לא להעניש ולא לתגמל, ובמגירה מופיעה "ודאות" שמראה על כמה מידע אמיתי הציון מבוסס.
גם הניקוד החלקי מכוון. דירה שמעט מעל תקרת המחיר, בתוך מרווח שהמשתמש קובע, מקבלת ציון שיורד בהדרגה ותווית "מקום למו"מ". חצי חדר מחוץ לטווח מקבל 0.6, ושטח של עד 10% מתחת למינימום מקבל חצי. כל כרטיס מציג גם את המחיר למ"ר מול החציון בשכונה. אפשר להוסיף גם שאלה חופשית, כמו "עד כמה הרחוב שקט?", שמודל שפה עונה עליה מתוך טקסט המודעה.

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

מחיר למ"ר מול החציון בשכונה, החזר חודשי משוער לפי ההגדרות, וכל שינוי מחיר מאז שהדירה נמצאה.
כפילויות, זוגות, מחירים ולמידה.
dupKeysשלוש דרכים לזהות שזו אותה דירה: טביעת אצבע של הטקסט, כתובת מלאה עם חדרים וקומה, וטלפון עם חדרים ומחיר מעוגל. מודעות שחולקות מפתח אחד מתאחדות לכרטיס אחד, עם קישור לכל מקור.
mergeIntoבכרטיס המאוחד, המקור המקורי מעדכן את השדות שלו, ומקור נוסף רק משלים שדות חסרים. כך פוסט חלקי מקבוצה לא דורס נתונים מלאים ממודעה מסודרת.
buildingKeyשתי דירות למכירה באותו רחוב ומספר בית, בקומות שונות או במספר חדרים שונה, מוצגות כזוג. אותה קומה ואותו מספר חדרים הם כנראה אותה דירה, ולא זוג.
priceHistoryכל שינוי מחיר נשמר. ירידה מעל הסף (ברירת המחדל 2%) מקבלת תג "ירד מחיר" והתראה, גם בדירה שכבר ראיתם.
REJECT_REASONS10 סיבות לסימון "לא רלוונטית". כשסיבה חוזרת, המערכת מציעה שינוי מדויק בפרופיל, למשל להוריד העדפה של שכונה, ו"החל" מעדכן אותו.
cleanupמודעה שלא נראתה 60 יום נמחקת, חוץ מדירות במועדפים או בטיפול. היומן שומר את 1,500 השורות האחרונות.
התראה רק על מה שעובר את הסף.
התראה נשלחת על דירה חדשה שעוברת את סף ההתאמה של פרופיל פעיל (ברירת המחדל 75%), על ירידת מחיר בדירה רלוונטית, ועל שתי דירות באותו בניין. דירה שכבר התריעה ממקור אחד לא תתריע שוב כשהיא מתפרסמת במקום נוסף, ודירה שסומנה כלא רלוונטית לא תחזור, גם אם פורסמה מחדש.
התראה במחשב
התראת Windows עם שני כפתורים: "פתח מודעה" ו"שמור במועדפים".
בוט טלגרם מומלץ
מגיע לטלפון עם תמונה וקישור. הטוקן של הבוט נשמר רק בתוסף במחשב.
מייל
דרך סקריפט Google קטן בחשבון של המשתמש, בלי שרת. נמען קבוע, תקרה של 50 מיילים ביום, וסיכום יומי בערב.
כל החלטה, והסיבה שמאחוריה.
הסורק בדפדפן, לא בשרת
הסריקה רצה בתוסף, בדפדפן של המשתמש, ורואה את העמודים כמו שהוא רואה אותם. אין שרת סריקה לתחזק ואין עלות קבועה. המחיר הוא ש-Chrome צריך להיות פתוח, ולכן האפליקציה מציגה תמיד מתי הייתה הסריקה האחרונה ואם הסורק מחובר.
התוסף סורק, האפליקציה מציגה
לתוסף אין ממשק מלבד חלון קופץ קטן. הצפייה, ההחלטות והעריכה נעשות באפליקציה, שעובדת אותו דבר במחשב ובנייד. כך יש מקום אחד לעצב ולתחזק.
קצב סריקה שמרני
כל 30 דקות, עמוד תוצאות אחד לכל מקור, ושעות שקטות בלילה. את המודעה המלאה הסורק קורא רק לדירות חדשות שלא נפסלו מראש, ולכל היותר 15 בסבב.
ציון עם הסבר, לא רק מספר
כל כרטיס מציג את הקריטריונים כתגים: עומד, נכשל או לא ידוע. במגירה יש פירוט מלא, כדי שיהיה אפשר לסמוך על המספר, או להבין בדיוק למה הוא לא נכון ולתקן את הפרופיל.
שינוי בפרופיל מתעדכן מיד
האפליקציה מחשבת את הציון בעצמה, מאותו קוד משותף שהסורק משתמש בו. שינוי בקריטריון מדרג מחדש את כל הדירות על המסך, בלי לחכות לסבב הבא.
כהה, עם צבע מבטא אחד
בסיס דיו קר ומבטא ענבר יחיד, כמו האייקון. ירוק ואדום שמורים למשמעות בלבד: עומד או נכשל. בנייד הניווט עובר לסרגל תחתון, והמסכים המשניים מרוכזים תחת "עוד".
פלטה (מתוך ה-CSS של האפליקציה)
פרטים קטנים שעושים את העבודה
- טבעת אחוזים על כל תמונה, בצבע לפי הציון.
- תגים על הכרטיס: חדש, ירד מחיר, עוד דירה בבניין, ומספר המקורות שאוחדו.
- הודעת וואטסאפ מוכנה למפרסם, מתבנית שהמשתמש עורך.
- סטטוסים לכל דירה, מ"חדש" ועד "במו"מ", ובמועדפים ספירה לפי שלב.
- הצבעים מוגדרים ב-OKLCH, כך שהבהירות שלהם עקבית.
הנתונים של כל משתמש, רק שלו.
הכלי מחזיק מידע רגיש: קריטריונים אישיים, הערות, ופרטי קשר של מפרסמים. כתבתי מסמך הגדרת מאגר (מה נשמר, מי ניגש, כמה זמן שומרים ואיך מגבים), ובניתי את ההגנות לפיו.
RLS בכל טבלה
- בכל 5 הטבלאות פועלת מדיניות אחת:
user_id = auth.uid(). כל משתמש קורא וכותב רק את השורות שלו. - מפתח הניהול וסיסמת המסד נמצאים רק אצלי, במשתני סביבה בזמן הרצה. לא בקוד, לא באפליקציה ולא בתוסף.
- כפתור "מחיקת החשבון וכל הנתונים" מוחק את כל השורות של המשתמש.
סודות נשארים במחשב
- טוקן הבוט, סיסמת סקריפט המייל ומפתח ה-API נשמרים רק באחסון המקומי של התוסף.
- הקוד מסיר אותם מההגדרות לפני כל שמירה לענן, ובדיקה אוטומטית מוודאת שהם לא עולים.
- מי שנכנס לחשבון מהנייד, או גנב את הסשן, לא מקבל אותם.
בהזמנה בלבד
- ההרשמה הציבורית סגורה. כל משתמש חדש נוצר ידנית, רק אצלי.
- הסרתי טריגר שאישר כל משתמש חדש אוטומטית, כי הוא איפשר לפתוח חשבון עם כתובת מייל של מישהו אחר.
- גבולות גודל ותקרת שורות לכל משתמש, כדי שמשתמש אחד לא יוכל למלא את המסד ולעצור את הסורק של כולם.
האפליקציה עצמה היא קבצים סטטיים, בלי אף נתון. המפתח הציבורי של Supabase ציבורי מעצם הגדרתו, ומה שמגן על הנתונים הוא ה-RLS. גם סקריפט הפרסום לא כותב את הטוקן בכתובת או בשורת הפקודה, ומסתיר אותו בכל פלט.
המוצר עצמו.
כל הצילומים מהדמו הציבורי: משתמשת בדויה, מודעות מומצאות, ואיורים במקום תמונות. העבירו את העכבר על הרשימה כדי לגלול אותה, ולחצו על כל תמונה כדי להגדיל.

רשימת הדירות: 23 דירות מוצגות מתוך 33, ממוינות לפי אחוז ההתאמה

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

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

זוגות שזוהו לפי רחוב ומספר בית, עם המחיר המשותף ומספר החדרים יחד.

הדירות ששמרתם, עם ספירה לפי שלב: מעניין, יצרתי קשר, נקבע ביקור, במו"מ.

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

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

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






אותו קוד, בלי אף נתון אמיתי.
רציתי שאפשר יהיה לגעת במערכת עצמה, ולא בסרטון או בצילומים, בלי לחשוף שום נתון אמיתי ובלי שהדמו יוכל לפנות לשרת כלשהו.
store.jsהאפליקציה מדברת רק עם קובץ אחד. בבניית הדמו הוא מוחלף בגרסה בזיכרון עם אותם ייצואים בדיוק, בלי אף תנאי "אם דמו" בקוד האפליקציה.
demo-data.jsמשתמשת בדויה, 2 פרופילים, 10 מקורות ו-47 מודעות שמתאחדות ל-43 כרטיסים. הערים והשכונות אמיתיות. הרחובות, המחירים והמודעות מומצאים, והטלפונים בתבנית שלא קיימת.
images.mjs20 איורי SVG במקום צילומים, ועל כל אחד כתוב "איור להמחשה".
connect-src 'self'ה-CSP מתיר חיבור רק לאותו מקור, ואין service worker. בבדיקה נספרו 0 בקשות יוצאות בכל המסכים, במחשב ובנייד.
Date.now()כל הזמנים יחסיים לרגע הטעינה: "נמצאה לפני 3 שעות", "סריקה אחרונה לפני 12 דק׳". הדמו ייראה עדכני גם בעוד שנים.
demo-isolation5 בדיקות הפרדה רצות עם כל הבדיקות: אין קוד דמו באפליקציה האמיתית, אין מזהים או מפתחות בדמו, וה-store המדומה מייצא כל מה שהאמיתי מייצא. סקריפט הפרסום נעצר אם משהו מסומן כדמו.
מה לא נכלל בדמו: התחברות, התראות אמיתיות והתוסף עצמו. מסך ההגדרות מציג סורק "מחובר" לצורך ההמחשה, וקישורים החוצה נעצרים עם הודעה.
רוצים כלי שעושה את החיפוש בשבילכם?
אם יש תהליך שחוזר על עצמו כל יום, לחפש, להשוות ולעקוב, אפשר לבנות לו כלי שעושה את העבודה ומראה לכם רק את מה שחשוב.
בואו נדבר →