מרעיון גולמי לפרומפט מדויק
כל שלב ענן מוגן - כשרכיב לא זמין, הזרימה נופלת לנתיב המקומי בלי לשבור כלום.
החלק החכם הוא חוזה השדות: במקום שה-AI יחזיר טקסט חופשי שדורש רכיב תצוגה חדש, הוא מחויב להחזיר בדיוק את אותם חמישה שדות מובנים שהבונה הדטרמיניסטי מייצר, והתוצאה מתמזגת לתוך ה-snapshot הקיים של הכרטיס. פלט AI ופלט תבנית הופכים לאותו טיפוס נתונים, אז עריכה, המרת פורמט, שמירה וייצוא עובדים על שניהם בלי branch נוסף. אותו עיקרון חוזר בשכבת הענן: הלוגיקה היא IIFE של vanilla JS שלא יכול לעשות import, אז React טוען את ה-ES modules של Supabase ו-Ollama וחושף אותם על bridge גלובלי לפני שהוא מזריק את הסקריפט. כל קריאת ענן מוגנת בדגל שמפיל אותה ל-localStorage, כך שהענן, השרת וה-AI כולם אופציונליים - והנתיב הדטרמיניסטי הוא האינווריאנט שתמיד עובד.
מה זה
Prompt Engineer הוא כלי local-first שהופך רעיון גולמי לפרומפט מדויק. במקום להתחיל מדף ריק, המערכת מובילה את המשתמש דרך ארבע שאלות מנחות - Role, Context, Output, Constraints - ובסוף מייצרת פרומפט מובנה שאפשר לשמור, לתייג, להמיר בין פורמטים ולייצא.
הפרויקט התחיל כפרויקט גמר של קורס פיתוח מוצרי AI, אבל הוא מוצר חי: רץ ב-prompt-engineer-v1.vercel.app עם backend אמיתי, ועובד גם בלי שום הגדרה מוקדמת.
הבעיה
רוב האנשים כותבים פרומפטים כגוש טקסט אחד - תפקיד, הקשר, פורמט ומגבלות מעורבבים בלי הפרדה - ומקבלים תוצאות לא עקביות. הידע איך בונים פרומפט טוב קיים, אבל אין תהליך שמוביל מהרעיון הגולמי לניסוח מדויק צעד אחר צעד.
הצבתי גם דרישה נוקשה של פרטיות: הכלי צריך לעבוד בלי חשבון, בלי מפתח API ובלי לשלוח טקסט לענן כברירת מחדל. הדרישה הזאת הכתיבה ארכיטקטורה שבה הענן הוא שדרוג אופציונלי, לא תלות.
מה בניתי
shell של React 19 עם Vite ו-Tailwind 4, שעוטף state machine של vanilla JS באורך כ-3.5 אלף שורות שמנהל את כל זרימת השיחה. React אחראי על הטעינה ועל ה-bridge לענן, והלוגיקה עצמה נשארת framework-free.
מאחור יש Supabase עם 7 טבלאות מנורמלות - users, conversations, messages, prompts, settings, tags, prompt_tags - עם RLS ברמת הבעלים על כולן, כך שכל משתמש רואה רק את הנתונים שלו. trigger בהרשמה יוצר אוטומטית את שורת הפרופיל וההגדרות.
שכבת ה-AI בנויה כשרשרת: קודם Ollama מקומי, אחר כך proxy בצד שרת, ואם אף אחד מהם לא זמין - בונה תבניות דטרמיניסטי שעובד תמיד. כל נתיב הענן מגובה ב-localStorage מלא, אז המוצר עובד out of the box בלי שום setup.
איך זה עובד
המשתמש מתחיל מרעיון חופשי, והמערכת מריצה ראיון קצר של ארבע שאלות שממפות את הכוונה לשדות מובנים. בסיום, שרשרת ה-LLM מחדדת את הפרומפט - וקלט בעברית מקבל scaffold מלא בעברית, כולל כותרות ומבנה.
הטריק המרכזי: ה-AI מחזיר בדיוק את אותם חמישה שדות מובנים שהתבנית מייצרת, והם מתמזגים לתוך ה-snapshot של הכרטיס. כך כל נתיב קיים - עריכה בקליק, המרת פורמט, שמירה, ייצוא - מרנדר את פלט ה-AI בלי שכתוב של רכיב התצוגה.
הסנכרון לענן דחוי ונעול לשיחה ספציפית, וה-hydration ממזג טיוטות מקומיות במקום לדרוס אותן - כך ש-reload באמצע זרימה או מעבר למכשיר שני לא מאבדים כלום. מפתחות ה-API חיים בצד השרת בלבד ולעולם לא מגיעים ל-bundle.
התוצאה
המוצר חי עם AI אמיתי בצד השרת, ו-43 בדיקות Vitest עוברות ירוק. את המסלול המלא אימתתי מקצה לקצה בהרצת דפדפן headless - כל הזרימה בעברית, עד כרטיס שחודד על ידי ה-AI - ובנוסף round-trip חי מול ה-API בפרודקשן.
הרצתי על המערכת audit אדברסרי בארבעה ממדים - הקשר שיחה, שיפור AI, איכות תבנית ופרסיסטנטיות - שהעלה 11 ממצאים מאומתים, וכולם תוקנו.
והכי חשוב, ההבטחה המקורית נשמרה: בלי חשבון ובלי מפתח, הכלי עדיין מפיק פרומפט מובנה ושלם דרך הבונה הדטרמיניסטי. הענן משדרג, אף פעם לא חוסם.