אפליקציית דסקטופ מקומית למעצב האירועים שון בלאיש — פגישות לקוחות, בחירת עיצובים, חתימה דיגיטלית, ייצוא DOCX יוקרתי בעימוד עריכתי דו-מותגי (שון בלאיש · גאמוס), ושיתוף ישיר עם הזוג בוואטסאפ / אימייל.
Stack: Tauri 2 · React 19 · TypeScript · Vite 7 · Tailwind v4 · IndexedDB · docx@8 · Framer Motion 12
Local-first. אין שרת, אין ענן, אין התחברות. הכל נשמר במכונה של שון. Hebrew RTL מכל קצה לקצה. תמונות לא מועתקות — האפליקציה קוראת מהתיקיות הקיימות בלבד.
| כלי | גרסה |
|---|---|
| Node.js | 20+ (מומלץ 22) |
| Rust + Cargo | latest stable (winget install Rustlang.Rustup) |
| Windows | 10/11 x64 |
| WebView2 | מותקן ברירת מחדל ב-Windows 11 |
# 1. קלון לתיקייה הקבועה (עם תיקיות התמונות לידה)
git clone https://github.com/MSA-I/SHON-APP.git "F:/MyFiles/העסק שלי/שון בלאיש"
cd "F:/MyFiles/העסק שלי/שון בלאיש/app"
# 2. התקנת תלויות
npm install
# 3. בנייה ל-installer (.exe)
npm run tauri:buildה-bundle target ב-tauri.conf.json נעול ל-nsis (WiX/MSI נכשל בנתיבים עם עברית). ה-installer יווצר ב:
app/src-tauri/target/release/bundle/nsis/Shon Blaish_<version>_x64-setup.exe
הרצת ה-installer פעם אחת — והאפליקציה זמינה כקיצור דרך רגיל.
אם בילד נתקע / האייקון לא מתעדכן: הרץ
cd app/src-tauri && cargo cleanואזnpm run tauri:buildשוב.tauri-winresמטביע את האייקון לתוך ה-exe רק על קומפילציה מלאה של ה-crate.
cd app
npm run tauri:dev # פותח את האפליקציה עם hot reloadטסטים:
npx vitest run # ~189 טסטים (12 test files)
npx tsc --noEmit # type checkF:/MyFiles/העסק שלי/שון בלאיש/
├── app/ # קוד האפליקציה (Tauri + React)
│ ├── public/
│ │ ├── logo.svg # SB monogram (שחור על לבן — הפונט הקנוני)
│ │ └── assets/
│ │ └── gamos-logo.png # לוגו גאמוס (לכריכה דו-מותגית ב-DOCX)
│ └── src-tauri/ # Rust backend
├── architecture/ # SOPs (16 מסמכים)
├── assets/ # לוגואים מקור (SVG)
├── claude.md # חוקה: סכמות נתונים, חוקי התנהגות
├── task_plan.md # שלבי הפרויקט
├── progress.md # יומן התקדמות
├── findings.md # תובנות והחלטות עיצוב
│
├── events/ # ⚙️ נוצר אוטומטית — DOCXים מיוצאים
│ └── <couple-names>_<yyyy-mm-dd>_<id8>/plan.docx
├── backups/ # ⚙️ נוצר אוטומטית — JSON גיבויים (rolling 30)
├── .trash/<timestamp>/ # ⚙️ קבצים שנמחקו ידנית בתחזוקה (reversible)
│
└── [תיקיות תמונות — לא בריפו, נמצאות מקומית]
├── אולם עיצוב בסיס 2026/
├── חופות אולם גדול גאמוס/
├── חופות ריזורט/
├── חופות שידרוג/
├── מפות מפיות/ # ~157 תמונות (אחרי סינון 231 כפילויות + 51 תמונות לא-מפיות)
├── עיצובים שידרוג/
├── ריזורט בסיס/
├── לא מתוייגים/ # 🆕 קטגוריה-הסגר לתמונות שזמנית לא משויכות (2026-06-03)
├── כסא כלה בחוץ בסיס.jpg
└── כסא כלה בתוך האולם.jpg
חשוב: הריפו לא מכיל את התמונות. הן חיות מקומית בנפרד וצריכות להיות באותה תיקיית-אם של הפרויקט (
F:/MyFiles/העסק שלי/שון בלאיש/). שורש הפרויקט מתגלה בריצה:lib/config.ts:getProjectRoot()בודק ערך שמור ב-IndexedDB, ואחר־כך מנסה רשימה של נתיבים מועמדים על מספר כוננים; אם אף אחד לא תואם — תיפתח בחירת תיקייה.
- בהפעלה ראשונה תיפתח ה-Tagging Pass — סריקה אוטומטית של כל ספריית התמונות עם תיוג מבוסס שם־קובץ + טווחי-עריכה אוצרים + היסטוגרמה צבעונית, עם דירוג נושא ראשי משוקלל כך שלא נכנסות תוויות-אגב (לדוגמה: תמונת פרחים שמכילה גם מפית לא תקבל תווית "מפית"). מה שלא ברור — שון מתייג ידנית.
- תיוג הוא רך: תמונות שכבר נבחרו וזוהו לקטגוריה (לפי שם תיקייה) נשארות שם — התיוג מוסיף תוויות־משנה (צבע, סוג בד, סגנון) לשימוש בצ'יפי המשנה של הגלריה.
- בסיום הריצה (
taggingComplete=true) ה-pass נסגר לתמיד — מסך הבית הופך זמין. אפשר לפתוח Re-tag מ-Settings → "תייג מחדש את כל הספרייה" אם משהו שנגוי. - גיבוי אוטומטי נוצר ב-
backups/בכל חתימה / השלמת אירוע / סיום ה-Tagging Pass.
- לקוח חדש → שמות בני הזוג + טלפון (+ אימייל אופציונלי).
- אירוע חדש → 6 טאבים: פרטי אירוע · מפיות · עיצובי שולחן · חופה · שדרוגים · סיכום.
- בכל טאב עם תמונות יש כפתור "פתח גלריה" + תצוגת תגיות (מסונכרנות עם ה-Tagging Pass). כל בחירת תמונה מאפיית מראש thumbnail 256px לתוך IDB — כך שכשהזוג חוזר לפגישה הבאה, הסיכום מציג מיד את הבחירות גם בלי לעבור דרך הגלריה.
- במסך סיכום הזוג חותם דיגיטלית. החתימה נשמרת כקווי-וקטור (
SignatureStroke[]) ונצבעת לפי ה-theme הפעיל — כהה במצב כהה, כהה־על־קרם במצב בהיר. ייצוא ל-DOCX תמיד מרסטר אותה לדיו שחור על רקע לבן (Behavioral Rule #13). - לחיצה על "ייצוא Word" מייצרת
events/<couple-names>_<yyyy-mm-dd>_<id8>/<...>.docx— שם תיקייה ושם קובץ קריאים בעברית NFC, עם 8 תווים ראשונים של ה-eventId לסילוק התנגשויות. - כריכת DOCX דו-מותגית: עמוד 1 כולל את לוגו שון (110×110, ריבוע), לוגו גאמוס (150×93, יחס 1.6:1), והוורדמרק שלהם זה לצד זה ("שון בלאיש"/"הפקות" מימין, "גאמוס"/"אירועים" משמאל). מתחת — שמות הזוג, תאריך + יום, שעה, ❖, וכבר על אותו עמוד גם בלוק "פרטי האירוע" עם טבלת השדות.
- כל עמוד גוף נושא בכותרת רצה: לוגו מיני SB + "שון בלאיש · הפקות" + מתחת "גאמוס · אירועים" + קו זהב דק.
- שיתוף ישיר אחרי הייצוא:
- שלח באימייל — פותח לקוח אימייל ברירת־מחדל עם נושא + body בעברית.
- שלח בוואטסאפ — פותח
wa.meעם הודעה מוכנה (טלפון מנורמל ל-972...). - פתח קובץ — פותח את ה-DOCX ב-Word ישירות (אם ננעל — fallback לחשיפה ב-Explorer).
- בשני מקרי השיתוף תיקיית האירוע נפתחת אוטומטית ב-Explorer לגרירת הקובץ ידנית (אין attachment slot ב-
mailto:או ב-wa.me).
- Luxury Editorial — דיו עמוק, קרם, וזהב עתיק. כותרות ב-Frank Ruhl Libre, גוף ב-Heebo.
- שני לוחות נושא — מצב כהה (ברירת מחדל) ובהיר. ה-curtain toggle ב-AppBar מתחלף בין "כהה ☾" ו"בהיר ☼" וערך זה נשמר ב-
meta.theme. - לוגו ה-AppBar — מודפס על "פלטה" לבנה ייעודית (8px padding, 4px radius) כך שלוגו השחור־על־לבן הקנוני נשאר ברור גם על קנבס כהה.
- ייצוא DOCX תמיד בהיר — גם אם המשתמש בחר theme כהה ב-UI. שני הלוגואים, החתימה, וכל הפלטות מוקבעים ל-Behavioral Rule #13.
כל תמונה בגלרייה מציגה כפתור × בריחוף. לחיצה מסתירה את התמונה מכל הגלרייה
ומוסיפה אותה ל-backups/marked-duplicates.json. הקובץ נשמר על-פני סשנים, כך שאם
המשתמש סוגר את האפליקציה ופותח שוב — הסימונים נשארים.
באנר עליון בגלרייה מציג "סומנו ככפילויות: N" + כפתור "החזר הכל" שמאפס גם את
הזיכרון וגם את הקובץ. מפתח הריפו יכול לקרוא את הקובץ ולהסיר את הקבצים פיזית
דרך .tmp/finish-marked.py (מעביר ל-.trash/<ts>-user-marked/, סורק גם את
שאר 7 הקטגוריות לעותקים זהים לפי name+size+md5).
קטגוריה תשיעית סינתטית לתמונות שלא ממלאות את המסגרת או לא משויכות לאף קטגוריה אחרת. עובדת כך:
- על-ידי המפתח — סקריפט
.tmp/classify-non-napkin.pyמעביר אוטומטית תמונות "חשודות" ל-<root>/לא מתוייגים/(דרך 4 פיצ'רים פרספטואליים, כלל "2-of-4 fires"). דווח: 51 תמונות הועברו מ-מפות מפיות/. - על-ידי שון — בגלרייה (כשהוא נכנס דרך השדרוגים), הוא רואה את הקטגוריה
'לא מתוייגים'ויכול לתייג כל תמונה דרך ה-Tagging Pass עםuserCategoryנכון. - אוטומטית בכל פתיחה —
lib/recategorize-untagged.ts:recategorizeUntaggedImages()רץ בתחילת כל פתיחת גלרייה. תמונות בקטגוריית ההסגר שקיבלוuserCategoryחוקי מועברות פיזית לתיקייה הנכונה (ב-safeMoveFileעם dual-assertInsideRoot). כשתיקיית ההסגר מתרוקנת — היא לא מוצגת בגלרייה.
ב-2026-06-03 רץ .tmp/redo-napkin-resize.py שהקטין את כל מקור תמונות המפיות
מ-5472×3648 (4.5MB) ל-1500px JPEG q=92 (~150KB). חיסכון: 989MB → 46MB. המקורות
שמורים ב-.trash/2026-06-03-*-napkin-originals/. התוצאה — איכות גלריה זהה
לקטגוריות האחרות שהיו כבר בגודל מתאים מראש.
THUMBNAIL_GENERATION הוקפץ מ-2 ל-3 כדי לגרום ל-IDB cache של ה-thumbnails
לאפות מחדש מהמקורות החדשים.
| פעולה | מיקום |
|---|---|
| גיבוי ידני | Settings → "ייצוא גיבוי" |
| שחזור | Settings → "ייבוא גיבוי" |
| גיבויים אוטומטיים | backups/backup_YYYY-MM-DD_HH-mm.json (rolling 30) |
| Schema version | BACKUP_SCHEMA_VERSION = 2 (תומך גם ב-v1 עם migration) |
ראה claude.md לחוקה המלאה. הכי חשוב:
- אין רשת — שום API חיצוני, שום הרשאות, שום ענן. כפתורי השיתוף משתמשים ב-
tauri-plugin-openerעם scope מצומצם (mailto:*,https://wa.me/*,https://api.whatsapp.com/*בלבד) שמעביר את ה-URL ל-OS — האפליקציה עצמה לא מבצעת fetch. - תמונות נשארות במקום — האפליקציה לא מעתיקה אותן. (חריג חד-פעמי 2026-05-26: סינון כפילויות פיזיות הועברו ל-
.trash/<timestamp>/, לא נמחקו, לפי הוראת המשתמש.) - DOCX תמיד בהיר — גם אם המשתמש בחר theme כהה ב-UI.
- אין מחירים — שדרוגים הם טקסט תיאורי בלבד.
- אין mobile — desktop only.
פרויקט פרטי עבור שון בלאיש הפקות.