חזרה לכל הפרויקטים
AI · Computer Vision

Curato

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

14 פרקים · ~16 דק׳ קריאה
Full StackiOS + Android + WebAI / Computer VisionCloud Architecture
Curato

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

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

On Device Computer Vision

סורק היצירות החכם

ראייה ממוחשבת שמזהה את היצירה ומיישרת אותה, ישירות על הטלפון

בשפה פשוטה

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

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

iOS · מעל מנוע הראייה של אפל

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

Android · צינור זיהוי שנבנה מאפס

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

יישור ותיקון פרספקטיבה

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

צילום אוטומטי, בלי ללחוץ

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

AR Spatial Measurement

מדידת מידות אמיתיות במרחב

גובה ורוחב היצירה בסנטימטרים, בלי סרגל, בעזרת מציאות רבודה

בשפה פשוטה

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

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

AI Vision Analysis · Structured Output

אוצר האמנות האוטומטי

מודל בינה מלאכותית שכותב, מתייג ומבין כל יצירה, בשפה של גלריה

בשפה פשוטה

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

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

תשובה מסודרת ומלאה, תמיד

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

צבעים נמדדים באמת, לא מנוחשים

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

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

Vector Embeddings · Semantic Search

טביעת האצבע הסמנטית

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

בשפה פשוטה

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

חיפוש לפי משמעות

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

הבנת האמן כשלם

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

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

חיפוש מיידי, על המכשיר

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

הצהרת אמן מהתמונה השלמה

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

נכתב חי, מול העיניים

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

Local First · Offline First

עבודה מיידית, גם בלי אינטרנט

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

בשפה פשוטה

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

עותק חכם ומוצפן על הטלפון

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

סנכרון שקוף ברקע

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

עובד גם בטיסה

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

חיסכון דרמטי בעלויות

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

והכל מוצפן

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

Image Performance & Caching

תמונות שנטענות מיד

גלריה שנפתחת חלק, בלי מלבנים אפורים

בשפה פשוטה

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

שלושה מנגנונים עובדים יחד.

גרסה קטנה ומהירה לכל תמונה

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

זיכרון של הכתובות

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

קריאה מקומית חכמה

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

Event Driven Backend

צינור אוטומטי שחוסך כסף

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

בשפה פשוטה

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

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

החיסכון החכם

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

Auto Generated Public Site

אתר תדמית שנבנה לבד

תיק עבודות חי, על כתובת אישית, בלי לבנות אתר

בשפה פשוטה

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

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

RTL / i18n

עברית מלאה ותמיכה רב לשונית

ממשק שמתהפך נכון מימין לשמאל, מאותו קוד

בשפה פשוטה

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

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

Cross Platform + Native Modules

קוד אחד, שלוש פלטפורמות

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

בשפה פשוטה

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

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

Security & Privacy by Design

אבטחה ופרטיות מהיסוד

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

בשפה פשוטה

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

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

Schema Versioning & Migrations

עדכונים חלקים לאורך זמן

שדרוג בטוח של האפליקציה אצל אלפי משתמשים

בשפה פשוטה

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

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

Admin Dashboard · Two Way Email Support

לוח בקרה ותמיכה מלאה באימייל

ניהול המשתמשים, ומערכת טיקטים שמסונכרנת בשני הכיוונים עם המייל

בשפה פשוטה

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

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

החיבור לאימייל, ההחלטה ההנדסית המעניינת

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

Microservices Architecture

ארכיטקטורת שירותים מבוזרת

יחידות עצמאיות, כל אחת עם הפריסה שלה

בשפה פשוטה

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

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

Tech Stack

המחסנית הטכנולוגית

Frontend (Mobile + Web)React Native · React · TypeScript · WatermelonDB (SQLite + SQLCipher) · react-native-web · Reanimated · Custom SVG glass UI
Native ModulesiOS: Swift (Apple Vision, ARKit) · C++ / OpenCV via JSI · Android: Kotlin (OpenCV, ARCore, ML Kit, CameraX) · react-native-vision-camera
AI & MLVertex AI · Gemini 2.5 · Text Embeddings · On device cosine vector search · K means color extraction
Backend & InfrastructureNode.js · Firebase Cloud Functions · Cloud Run + Docker · Cloud Storage · Firestore · Secret Manager · Signed URLs · Server side rate limiting
Admin & SupportReact + Vite dashboard · Two way Gmail (SMTP + IMAP over OAuth2)
Patterns & MethodologiesLocal First · Offline First · Optimistic UI · Real time Sync · Event Driven · On Device AI · Semantic Vector Search · RAG style Grounding · WebSocket Streaming · Structured Output · Schema Migrations · RTL / i18n · Microservices · Native JSI Bridging
Team

הצוות

01מפתחDeveloper
02ארכיטקטArchitect
03מעצב מוצרProduct Designer
04בודק תוכנהQA
רוצים פרויקט כזה? דברו איתנו