צייד הדירות

Ram's Designs
פרויקטים צייד הדירות

צייד הדירות

כלי אישי · חיפוש דירה אוטומטי · Chrome · Supabase · PWA

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

תפקידאפיון · עיצוב · פיתוח
תחוםנדל"ן · כלי אישי
שנה2026
פלטפורמהChrome Extension · Supabase · PWA
היקףתוסף, ענן ו-10 מסכים
סטטוספעיל · בהזמנה בלבד

נתונים מומצאים · נפתח בטאב חדש

rambenamram.com/demo/apartments
צייד הדירות: רשימת דירות מדורגות לפי אחוז התאמה, עם סינון, תגי מקור ותג ירידת מחיר
11
סוגי קריטריונים
ממחיר וקומה ועד מילות מפתח
5
רמות חשיבות
מ"כבוי" ועד "חובה" שפוסלת
3
דרכים לזהות כפילות
טקסט, כתובת וטלפון
5
טבלאות בענן
בכולן כל משתמש רואה רק את שלו
0
סודות שעולים לענן
טוקנים וסיסמאות נשארים במחשב
21
בדיקות אוטומטיות
5 מהן שומרות על הפרדת הדמו
נסו בדמו

3 דברים לנסות בדמו.

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

01

פתחו את הדירה הראשונה

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

02

הפכו חניה לחובה

היכנסו ל"פרופיל וקריטריונים" (בנייד: "פרופיל"). בכרטיס "חניה" בחרו "חובה" וחזרו ל"דירות". במקום 23 דירות מוצגות יישארו 16: כל דירה בלי חניה נפסלת מיד, בלי סריקה חדשה.

03

סמנו דירה כלא רלוונטית

לחצו על אייקון "לא רלוונטית" בתחתית כרטיס, בחרו "יקרה מדי" ואשרו. במסך "לא רלוונטיות" (בנייד: תחת "עוד") המערכת תציע לבטל את המרווח מעל תקרת המחיר, כי כבר 3 דירות נפסלו בגלל המחיר. "החל" מעדכן את הפרופיל.

כנסו למערכת (דמו)

נתונים מומצאים · נפתח בטאב חדש

הבעיה

חיפוש דירה הוא עבודה במשרה חלקית.

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

01

אותה דירה, שלוש פעמים

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

02

סינון שלא מבין "חשוב"

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

03

פוסטים בטקסט חופשי

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

04

שינויים שקל לפספס

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

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

איך זה עובד

שלושה חלקים, וכל אחד עושה דבר אחד.

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

צייד הדירות
סורק · תוסף Chrome
  • מקורות שהמשתמש בחרכתובת של חיפוש או קבוצה
  • טאב רקע שקטכל 30 דקות, כש-Chrome פתוח
  • חילוץ, איחוד ודירוג
  • שליחת התראות
ענן · Supabase
  • 5 טבלאותRLS בכל אחת
  • התחברות בהזמנה בלבד
  • עדכונים בזמן אמת
אפליקציה · PWA
  • 10 מסכיםמחשב ונייד
  • מועדפים, סטטוס והערות
  • עריכת פרופילים וקריטריונים
התראות
  • התראה במחשב
  • בוט טלגרםעם תמונה וקישור
  • מיילכולל סיכום יומי
זרימות

מה קורה בכל סבב, ומה קורה כשלוחצים.

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

ציון שמסביר את עצמו.

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

גם הניקוד החלקי מכוון. דירה שמעט מעל תקרת המחיר, בתוך מרווח שהמשתמש קובע, מקבלת ציון שיורד בהדרגה ותווית "מקום למו"מ". חצי חדר מחוץ לטווח מקבל 0.6, ושטח של עד 10% מתחת למינימום מקבל חצי. כל כרטיס מציג גם את המחיר למ"ר מול החציון בשכונה. אפשר להוסיף גם שאלה חופשית, כמו "עד כמה הרחוב שקט?", שמודל שפה עונה עליה מתוך טקסט המודעה.

פירוט הציון במגירת הדירה: למה 98%, ודאות 100%, וכל קריטריון עם רמת החשיבות שלו
"למה 98%"

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

פרטי הדירה במגירה: מחיר למ"ר מול החציון, החזר חודשי משוער והיסטוריית מחיר
פרטים והיסטוריית מחיר

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

מאחורי הכרטיס

כפילויות, זוגות, מחירים ולמידה.

dupKeys

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

mergeInto

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

buildingKey

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

priceHistory

כל שינוי מחיר נשמר. ירידה מעל הסף (ברירת המחדל 2%) מקבלת תג "ירד מחיר" והתראה, גם בדירה שכבר ראיתם.

REJECT_REASONS

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

cleanup

מודעה שלא נראתה 60 יום נמחקת, חוץ מדירות במועדפים או בטיפול. היומן שומר את 1,500 השורות האחרונות.

התראות

התראה רק על מה שעובר את הסף.

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

התראה במחשב

התראת Windows עם שני כפתורים: "פתח מודעה" ו"שמור במועדפים".

בוט טלגרם מומלץ

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

מייל

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

החלטות

כל החלטה, והסיבה שמאחוריה.

הסורק בדפדפן, לא בשרת

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

התוסף סורק, האפליקציה מציגה

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

קצב סריקה שמרני

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

ציון עם הסבר, לא רק מספר

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

שינוי בפרופיל מתעדכן מיד

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

כהה, עם צבע מבטא אחד

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

פלטה (מתוך ה-CSS של האפליקציה)

דיו#0D0F15רקע ראשי
משטח#14171Dכרטיסים וסרגלים
ענבר#F5AE4Bמבטא יחיד, פעולה ראשית
ירוק#56CD90עומד בקריטריון, ירד מחיר
צהוב#DEC358עומד חלקית
אדום#F76467נכשל, הוסרה

פרטים קטנים שעושים את העבודה

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

הנתונים של כל משתמש, רק שלו.

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

RLS בכל טבלה

  • בכל 5 הטבלאות פועלת מדיניות אחת: user_id = auth.uid(). כל משתמש קורא וכותב רק את השורות שלו.
  • מפתח הניהול וסיסמת המסד נמצאים רק אצלי, במשתני סביבה בזמן הרצה. לא בקוד, לא באפליקציה ולא בתוסף.
  • כפתור "מחיקת החשבון וכל הנתונים" מוחק את כל השורות של המשתמש.

סודות נשארים במחשב

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

בהזמנה בלבד

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

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

תצוגת המוצר

המוצר עצמו.

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

rambenamram.com/demo/apartments
רשימת הדירות המלאה של פרופיל הקנייה בדמו

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

rambenamram.com/demo/apartments
מגירת הדירה: ציון, פעולות ותיאור המודעה
מגירת הדירה

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

rambenamram.com/demo/apartments/#profile
מסך פרופיל וקריטריונים
פרופיל וקריטריונים

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

rambenamram.com/demo/apartments/#pairs
מסך שתי דירות באותו בניין
שתי דירות באותו בניין

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

rambenamram.com/demo/apartments/#favorites
מסך המועדפים עם ספירה לפי סטטוס
מועדפים

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

rambenamram.com/demo/apartments/#rejected
מסך לא רלוונטיות עם הצעות לכיוונון הפרופיל
לא רלוונטיות, ומה למדתי

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

rambenamram.com/demo/apartments/#notify
מסך הגדרות ההתראות
התראות

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

rambenamram.com/demo/apartments
הרשימה אחרי סריקה ידנית, עם הודעה על 2 דירות חדשות
אחרי "סרוק עכשיו"

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

מובייל

אותה מערכת, בכף היד.

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

אותו קוד, בלי אף נתון אמיתי.

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

store.js

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

demo-data.js

משתמשת בדויה, 2 פרופילים, 10 מקורות ו-47 מודעות שמתאחדות ל-43 כרטיסים. הערים והשכונות אמיתיות. הרחובות, המחירים והמודעות מומצאים, והטלפונים בתבנית שלא קיימת.

images.mjs

20 איורי SVG במקום צילומים, ועל כל אחד כתוב "איור להמחשה".

connect-src 'self'

ה-CSP מתיר חיבור רק לאותו מקור, ואין service worker. בבדיקה נספרו 0 בקשות יוצאות בכל המסכים, במחשב ובנייד.

Date.now()

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

demo-isolation

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

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

רוצים כלי שעושה את החיפוש בשבילכם?

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

בואו נדבר →
פרויקטים נוספים

עוד עבודות שלנו

Scroll to Top
קבעו שיחת אסטרטגיה ←