localViewer — מציג קבצים שלא מעלה את הקבצים שלך
העמדה: למציג קבצים אין שום עסק לראות את הקובץ שלך. כמעט כל אחד מהם רואה אותו, כי העלאה לשרת היא הדרך הקלה לבנות אחד כזה.
תחפש דרך להסתכל על קובץ STL, על 3MF שיצא מפרויקט בסלייסר, או על STEP שקיבלת מספק — ותקבל דף שמבקש ממך להעלות אותו. זו עסקה מוזרה בשביל משהו שאתה רק רוצה להסתכל עליו. הקובץ עובר למכונה שאינך שולט בה, תחת מדיניות שמירה שלא קראת, ובחזרה אתה מקבל תמונה. בדגם תחביבי זה סתם לא מסודר. ב-STEP של ספק תחת NDA, או ב-CSV של לקוח, זה כבר מהדברים שצריך להסביר אחר כך.
לכן האילוץ של localViewer נקבע לפני כל דבר אחר: תוכן הקובץ לא מייצר אף בקשת רשת. לא "מוצפן בהעברה", לא "נמחק אחרי שעה" — אין בקשה. זו הבטחה חזקה בהרבה ממדיניות פרטיות, כי היא מבנית. אין שרת שצריך לסמוך עליו, ולכן לסמוך עליי הוא לא חלק מהעסקה.
מה האילוץ עולה
הכול נעשה קשה יותר, וכל פורמט נעשה קשה בדרך משלו.
המפענחים צריכים להגיע אל הקובץ. בדרך כלל העבודה הכבדה יושבת בשרת: מייבא STEP, מהדר OpenSCAD, מפענח רשתות. local-first אומר שכל זה חייב לרוץ בדפדפן, כלומר להישלח לדפדפן. הגרסה הנאיבית של זה היא טעינה ראשונה של עשר שניות כי הורדת ליבת CAD כדי להציג קובץ Markdown. לכן התלויות הכבדות — מייבא ה-STEP ומהדר ה-OpenSCAD — נטענות עצלנית, בשימוש הראשון בפורמט שדורש אותן, ואף אחד אחר לא משלם עליהן.
אין שלב build. כל האפליקציה היא קבצים סטטיים עם לוגיקה בלי framework, בבדיקות Vitest ו-jsdom. זו הייתה בחירה מכוונת, והיא זו שמתווכחים עליה: בלי bundler אין tree-shaking, אין code splitting אוטומטי, ואת גבולות המודולים עושים ביד. בתמורה מקבלים דבר מסוים — מה שנשלח הוא מה שכתבת, אפשר להגיש אותו מכל שרת סטטי כולל תיקייה על דיסק, ואין build שיירקב. לכלי שכל ההצהרה שלו היא "אין שום דבר בינך לבין הקובץ", צינור build היה עוד דבר אחד בינך לבין הקובץ.
הכיוון הקשה הוא הכתיבה חזרה. לקרוא קובץ שמשתמש גורר לתוך דף אפשר כבר שנים. לערוך את ה-Markdown ולשמור אותו בחזרה לקובץ המקורי על הדיסק — לשם קיים ה-File System Access API, וזו הסיבה שעורך ה-Markdown הוא באמת עורך ולא מציג עם כפתור הורדה. איפה שה-API הזה לא זמין, אותה פעולה מתדרדרת בהדרגה לדיאלוג Save-As. הפיצ'ר זהה; רמת הדיוק לא.
אופליין היה חייב להיות אמיתי. אחרי הביקור הראשון האפליקציה נרשמת כ-PWA ושומרת במטמון את מעטפת האפליקציה ואת הספריות שלה, כך שביקורים הבאים עובדים בלי רשת בכלל. זה החלק שהופך את טענת הפרטיות למוכיחה את עצמה במקום מוצהרת: אפשר לכבות את הרשת ולראות אותה עובדת. זו גם הבדיקה הכנה של local-first — אם הוא צריך רשת, הוא מעולם לא היה מקומי.
הכלל, והגבול שלו
הכלל שאני לוקח מזה: כשמודל האמון הוא המוצר, שים אותו בארכיטקטורה ולא בטקסט השיווקי. עמוד פרטיות הוא הבטחה. דף שלא מייצר בקשות הוא עובדה, וכל אחד יכול לבדוק אותה ב-devtools בארבע שניות.
זה עובד רק כשכל העבודה באמת נכנסת למכשיר. כאן היא נכנסת כי צפייה בקובץ היא עבודה חסומה על קלט חסום — קובץ אחד, מכונה אחת, אדם אחד שמסתכל.
איפה זה נשבר
ברגע שהעבודה מפסיקה להיכנס למכשיר, הכלל מפסיק לחול, ואסור להעמיד פנים אחרת.
- רשתות גדולות מאוד. תקרת הזיכרון של הדפדפן אמיתית, והיא נמוכה מזו של המכונה. 3MF מפרויקט סלייסר עם עשרות חלקים — בסדר גמור; רשת סריקה בלי גבול — לא. אין שרת ליפול אליו, מעצם ההגדרה.
- כל דבר שיתופי. שני אנשים שמסתכלים על אותו קובץ זו בעיה בצורת שרת. ל-localViewer אין מה לומר עליה.
- מסלול ה-STEP הוא מציג, לא ליבה. הוא קורא גיאומטריה כדי להסתכל עליה. הוא לא עושה CAD פרמטרי, ואסור לו להעמיד פנים שכן.
- יכולות הדפדפן משתנות. שמירה חזרה לקובץ המקורי דורשת דפדפן שתומך בזה. בכל השאר מקבלים Save-As — אותה עבודה, דיאלוג אחד יותר.
אם הקובץ שלך באמת גדול מדי למכונה שמולך, אתה רוצה ארכיטקטורה אחרת, ויהיה בה שרת. זו תשובה טובה. היא פשוט לא זו.
פרטים
- פורמטים
- Markdown (עם טקסט דו-כיווני RTL/LTR), YAML כעץ מתקפל, CSV עם זיהוי אוטומטי של מפריד, STL, 3MF כולל קבצי multi-part מסיומת ה-production מ-Bambu Studio / OrcaSlicer / PrusaSlicer, STEP, OpenSCAD, תמונות
- רץ בתור
- אתר סטטי; PWA להתקנה ב-Windows וב-Android; אופציונלי "פתח באמצעות" ב-Windows Explorer דרך helper ב-PowerShell
- בדיקות
- Vitest + jsdom
- רישיון
- Apache-2.0