CityCat · חתולי תל אביב
אפליקציית מיפוי חתולי רחוב בתל אביב-יפו: סריקת חתול וזיהוי, אווטר ותעודת זהות, מפה עם שכבות, דיווחי מצוקה, כלבים משוטטים, איסוף גופות לתברואה, אימוץ, ניקוד, משחק ופאנל מנהל אזור.
האתר הוא קובץ HTML סטטי אחד, בלי שלב build. השרת הוא Supabase (חינם, בלי כרטיס אשראי): משתמשים, סיסמאות ומסד הנתונים.
הפעלת השרת (פעם אחת, כ-10 דקות)
- נרשמים ב-supabase.com ויוצרים פרויקט חדש (New project). אזור:
Central EU (Frankfurt). שומרים את סיסמת מסד הנתונים במקום בטוח.
- בתפריט: SQL Editor ← New query. מדביקים את כל התוכן של
supabase/schema.sql ולוחצים Run.
- בתפריט: Authentication ← Sign In / Providers ← Email. מכבים את Confirm email ושומרים. (שירות המייל החינמי של Supabase שולח רק כמה מיילים בשעה, אז בלי זה משתמשים חדשים יחכו למייל.)
- בתפריט: Project Settings ← API (או כפתור Connect למעלה). מעתיקים את Project URL ואת המפתח anon / publishable.
- ב-GitHub פותחים את
config.js, לוחצים על העיפרון, מדביקים את שני הערכים ושומרים (Commit). Vercel יעלה את הגרסה החדשה לבד.
- את המפתח
service_role / secret לא שמים באתר ולא שולחים לאף אחד.
- נכנסים לאפליקציה ונרשמים עם האימייל שלך.
- חוזרים ל-SQL Editor ומריצים (עם האימייל שלך) כדי להפוך את עצמך למנהל:
insert into public.admins select id from auth.users where email = 'YOUR_EMAIL' on conflict do nothing;
מתנתקים ונכנסים שוב, ובלשונית "אני" מופיע פאנל ניהול.
מי רואה מה
| משתמש רשום | מנהל האפליקציה |
|---|
| מפה, חתולים, דיווחים, פיד, טבלת מובילים | רואה | רואה |
| סריקה, דיווח מצוקה, כלב משוטט, איסוף גופה | שולח | שולח |
| בקשות אימוץ והרשמת מתנדבים (שמות, טלפונים) | רק את שלו | הכל |
| מחיקת רשומות, סטטוס דיווח, עיקור ואימוץ של חתול | לא | כן |
| פינות האכלה | רואה | מוסיף ועורך |
| פאנל ניהול | לא מופיע | מופיע |
מי שלא מחובר לא רואה כלום. כל הנתונים נשמרים בפרויקט ה-Supabase שלך, וההרשאות נאכפות בשרת עצמו (Row Level Security), לא רק בממשק.
כל עוד config.js ריק, האתר עובד במצב הדגמה עם נתונים לדוגמה שנשמרים רק במכשיר.
העלאה ל-Vercel
- ב-vercel.com/new בוחרים את הריפו
CityCat.
- Framework Preset: Other. אין Build Command ואין Output Directory.
- Deploy.
התקנה בטלפון (PWA)
- אנדרואיד (Chrome): נפתח חלון "התקן את CityCat", או בתפריט ⋮ ← "התקנת אפליקציה".
- אייפון (Safari): שיתוף ← "הוספה למסך הבית". האפליקציה מציגה הנחיה כזו בעצמה.
מפה
- ברירת מחדל: OpenStreetMap, ומפת Esri כגיבוי. שתיהן בלי מפתח.
- Google Maps (דורש חשבון חיוב בגוגל): לוחצים על "מפה:" בפינת המפה ומדביקים מפתח Maps JavaScript API. המפתח נשמר רק בדפדפן.
סריקת חתולים
- המנוע רץ על הטלפון עצמו, בשני שלבים: COCO-SSD מוצא את בעלי החיים בתמונה, ו-MobileNet מאשר שזה חתול בית ולא כלב, שועל, בובה או חפץ. רק חתול מאושר נרשם, וטביעת המראה מחושבת על החתול בלבד ולא על הרקע.
- במצלמה החיה הצילום נלקח לבד ברגע שחתול מזוהה שלוש פעמים ברצף. אין צורך ללחוץ.
- כשיש חתולים דומים באזור, המשתמש מתבקש לבחור אם זה אחד מהם, כדי שאותו חתול לא יירשם פעמיים.
- בפעם הראשונה המנוע מוריד כ-23MB, ואחר כך הוא שמור בטלפון ועובד גם בלי רשת.
- בבדיקה על 36 תמונות: 6 מתוך 6 חתולים התקבלו, ו-30 מתוך 30 תמונות אחרות נדחו (כלבים, כולל כלב לבן שהמנוע הראשון לבדו חשב לחתול, שועל, לינקס, ארנב, בובה, אנשים, מכונית ואוכל).
פאנל ניהול
נתונים לפי אזור וייצוא לאקסל, תור דיווחים, מאגר חתולים עם אימות של חתולים חדשים ומיזוג רשומות כפולות, פינות האכלה (מושבות) עם מאכיל/ה אחראי/ת, מתנדבים ובקשות אימוץ.
מגבלות ידועות
- הניקוד מחושב בטלפון של המשתמש, כך שמשתמש מתוחכם יכול לזייף את הניקוד שלו (לא את הנתונים של אחרים).
- תמונות החתולים נשמרות בתוך מסד הנתונים (כ-50KB לתמונה). המסלול החינמי (500MB) מספיק לכמה אלפי חתולים.
- פרויקט Supabase חינמי נכנס להשהיה אחרי שבוע בלי שימוש. מחזירים אותו בלחיצה בלוח הבקרה.
- זיהוי של חתול מסוים (האם זה אותו חתול) מבוסס על צבע ודפוס, ולכן שני חתולים דומים מאוד עלולים להתבלבל. בשביל זה יש בחירה ידנית ומיזוג בפאנל.
- אם כבר הרצת את
schema.sql, צריך להריץ אותו שוב אחרי העדכון הזה. זה בטוח ולא מוחק נתונים.
- "עמותת חתולי העיר" היא עמותה לדוגמה. מחליפים בשם של עמותה אמיתית לפני השקה.