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

Curato

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

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

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

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

Custom Trained On Device Vision Model

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

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

בשפה פשוטה

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

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

מאגר נתונים וכלי תיוג שבניתי

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

רץ על המכשיר, בשתי הפלטפורמות

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

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

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

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

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

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

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

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

בשפה פשוטה

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

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

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
רוצים פרויקט כזה? דברו איתנו