TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
ניהול מסמכי המשפחה במקום אחד
Translation pending
ProductivityTypeScript · JavaScriptGitHub @TalSinayOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
אפליקציית ניהול מסמכים משפחתית - ביטוחים, פיננסים, זיכויים, קבלות ועוד - עם מעקב הוצאות/הכנסות ולוח שנה עברי. נבנתה כ-PWA שמתקינים ישירות למסך הבית באייפון (או כל טלפון אחר), ב-$0 עלות חודשית. כל הנתונים - כולל קובצי הבינארי עצמם (לא רק מטא-דאטה) - נשמרים ב-MongoDB תחת החשבון שלך בלבד, ללא תלות בשום צד שלישי.Read the full README ↗
אפליקציית ניהול מסמכים משפחתית - ביטוחים, פיננסים, זיכויים, קבלות ועוד - עם מעקב הוצאות/הכנסות ולוח שנה עברי. נבנתה כ-PWA שמתקינים ישירות למסך הבית באייפון (או כל טלפון אחר), ב-$0 עלות חודשית.
| שכבה | טכנולוגיה | עלות |
|---|---|---|
| פרונטאנד + backend | Next.js 16 (App Router), פרוס ל-Vercel | חינם |
| מסד נתונים | MongoDB Atlas (טיר M0) | חינם |
| אימות | Auth.js (NextAuth) עם Credentials, JWT | חינם |
| אוטומציית תשלומים חודשיים | GitHub Actions (cron חודשי) | חינם |
| חגי ישראל | Hebcal API (ציבורי) | חינם |
כל הנתונים - כולל קובצי הבינארי עצמם (לא רק מטא-דאטה) - נשמרים ב-MongoDB תחת החשבון שלך בלבד, ללא תלות בשום צד שלישי.
0.0.0.0/0 (כדי ש-Vercel יוכל להתחבר; אין IP קבוע בטיר החינמי).mongodb+srv://).git clone <כתובת ה-repo שלך>
cd family-docs
npm install
cp .env.example .env.local
מלא ב-.env.local:
MONGODB_URI - ה-connection string מ-Atlas (הוסף בסופו שם database, לדוגמה /familydocs)AUTH_SECRET - הרץ openssl rand -base64 32 והדבק את הפלטCRON_SECRET - מחרוזת אקראית נוספת (לדוגמה גם עם openssl rand -base64 32)RESEND_API_KEY - מפתח API מ-resend.com (טיר חינמי מספיק), לשליחת קוד האימות הדו-שלבי לאזור הניהולADMIN_OTP_FROM_EMAIL - כתובת שולח מאומתת ב-Resend (לדוגמה אזור ניהול <[email protected]> לבדיקות, או דומיין משלך לאחר אימות)npm run dev
אין הרשמה עצמית. יצירת משתמשים והקצאתם ל-workspace-ים נעשית אך ורק דרך אזור הניהול (/admin/login). כדי ליצור את משתמש ה-admin הראשון ולבצע הגירה חד-פעמית של נתונים קיימים ל-workspace הראשון:
node scripts/migrate-to-workspaces.js [email protected]
הסקריפט יוצר workspace ראשון בשם "המשפחה" (ניתן לשינוי עם --name="שם אחר"), משייך אליו את כל המשתמשים הקיימים, מתייג את כל המסמכים/האירועים/המשימות הקיימים אליו, ומסמן את המשתמש עם האימייל שסופק כ-admin. בטוח להרצה כמה פעמים. אם עדיין אין משתמשים כלל, ניתן ליצור משתמש ראשון ישירות מ-MongoDB Atlas (Collections → users) או דרך mongosh, ואז להריץ את הסקריפט כדי לסמן אותו כ-admin וליצור עבורו workspace.
לאחר מכן היכנס לאזור הניהול ב-/admin/login עם האימייל/סיסמה של אותו משתמש (יישלח קוד אימות למייל), וצור/שייך משתמשים ו-workspace-ים נוספים.
שכחת את הסיסמה? אפשר לאפס אותה בכל שלב (גם לפני שיש admin) עם:
node scripts/reset-password.js [email protected] --password="סיסמה חדשה"
.env.local (עם ה-URI האמיתי, לא placeholder).בסיום תקבל כתובת כמו https://family-docs-yourname.vercel.app.
חזור על זה בכל טלפון של בן משפחה.
כדי שהמערכת תיצור אוטומטית רשומת הוצאה בתחילת כל חודש עבור מסמכים עם "תשלום חודשי":
APP_URL - כתובת האפליקציה שלך מ-Vercel (בלי / בסוף)CRON_SECRET - בדיוק אותו ערך שהזנת ב-Vercel.github/workflows/monthly-expenses.yml ירוץ אוטומטית פעם בחודש. אפשר גם להריץ ידנית מטאב "Actions" ב-GitHub → "Monthly Expenses Automation" → "Run workflow".כדי לאפשר התראות קופצות למכשירים (על משימות באיחור, תאריכי יעד מתקרבים, ותזכורות חודשיות - ראו "אזור אישי" באפליקציה):
npx web-push generate-vapid-keys..env.local המקומי:
NEXT_PUBLIC_VAPID_PUBLIC_KEY - המפתח הציבורי מהפלטVAPID_PRIVATE_KEY - המפתח הפרטי מהפלט (סודי - לא לחשוף)VAPID_SUBJECT - כתובת מייל ליצירת קשר, לדוגמה mailto:[email protected].github/workflows/daily-reminders.yml (רץ אוטומטית כל 30 דקות ושולח כל התראה פעם ביום בשעה שהוגדרה - שעה גלובלית באזור הניהול, או שעה ייעודית לכל תזכורת חודשית; אותם שני secrets APP_URL/CRON_SECRET משמשים גם אותו, אין צורך להגדיר שוב).src/
app/ עמודים (App Router) + API routes
components/ רכיבי React (טופס העלאה, לוח שנה, כרטיסי מסמך...)
lib/
models/ סכמות Mongoose (Document, File, User, CalendarEvent, Task, SubCategory, Workspace, WorkspaceMembership)
categories.ts הגדרת הקטגוריות ותתי-הקטגוריות
auth.ts הגדרת Auth.js (כניסה רגילה + כניסת admin עם 2FA)
mongodb.ts חיבור למסד הנתונים
resend.ts שליחת קוד אימות (2FA) למייל האדמין
scripts/
migrate-to-workspaces.js הגירה חד-פעמית למבנה multi-tenant + יצירת admin ראשון
reset-password.js איפוס סיסמה של משתמש קיים (למשל אם שכחת את סיסמת ה-admin)
move-workspace-data.js העברת כל התוכן (מסמכים/יומן/משימות/תתי-קטגוריות) מ-workspace אחד לאחר
force-assign-workspace.js שיוך כפוי וללא תנאי של כל התוכן הקיים ב-DB ל-workspace יעד אחד (ראו אזהרה למטה)
.github/workflows/ אוטומציית ה-cron החודשי (תשלומים) והיומי (התראות push)
/admin/login, בשני שלבים: אימייל+סיסמה → קוד בן 6 ספרות שנשלח למייל (בתוקף ל-10 דקות) → כניסה.role: "admin" יכול להיכנס; ההגדרה נעשית ע"י סקריפט ההגירה או ישירות במסד הנתונים.node scripts/move-workspace-data.js --from="שם מקור" --to="שם יעד".node scripts/force-assign-workspace.js --to="שם היעד". שימו לב: בניגוד ל-move-workspace-data.js, הסקריפט הזה דורס ללא תנאי את ה-workspaceId על כל רשומה קיימת בכל הקולקציות (לא רק על אלו שבworkspace מסוים) - להריץ רק כשבטוחים שכל התוכן הקיים אכן שייך ליעד הזה./profile) ולעדכן שם וסיסמה בעצמו, בלי לערב admin./search) מחפש בכל ה-workspace הפעיל בבת אחת - מסמכים (כותרת/הערות/תת-קטגוריה/שדות מותאמים אישית), משימות, אירועי יומן, ושמות מוצרים ברשימות קניות.files/ עם הקבצים הבינאריים המקוריים), בלי סיסמאות. שימושי לגיבוי/שמירה מקומית./apps) עם קישורי הפעלה מהירה לאפליקציות חיצוניות (כרגע: Max, בנק דיסקונט, Cal) - לחיצה פותחת את האפליקציה הרשמית אם מותקנת, אחרת את האתר. כדי להוסיף/לשנות אפליקציה, עורכים את .בקטגוריית "פיננסים" כל רשומה היא פריט כסף (חשבון, קרן, קריפטו, הלוואה...):
שם פלטפורמה, סכום נוכחי (ניתן לעדכון מהיר מהרשימה בעזרת העיפרון), רווח צפוי (%),
עמלה (%), סכום יעד עם פס התקדמות, קישור לפלטפורמה והערות. בראש העמוד: סה"כ נטו
(נכסים פחות התחייבויות), עוגה לפי רשומה או לפי סוג, ולכל רשומה השינוי מהעדכון
הקודם ותאריך העדכון האחרון. היסטוריית הסכומים (50 עדכונים אחרונים) נשמרת בשדה
amountHistory. התחייבות מסומנת בתיבת "זו התחייבות / חוב".
בעמוד "קטגוריות" מופיע אריח "אזור אישי" רק למשתמש עם תפקיד admin. הוא מוביל ל-/personal
עם קישורים לפרופיל ולאזור הניהול. בכותרת העליונה הטקסט "שלום, ..." מוסתר במסכים צרים
כדי שכפתורי החיפוש/פרופיל/ניהול לא ייחתכו.
בראש עמוד "פיננסים" יש כרטיס בנק קבוע (אחד ל-workspace). שתי דרכי עדכון: ידני, או אוטומטי לפי המאזן - היתרה המוצגת = היתרה שהוזנה (לתחילת החודש הנוכחי) + מאזן הכנסות-הוצאות מאז. בחודש חדש המאזן ממשיך להצטבר על אותה יתרה, עד שמזינים יתרה חדשה. הבנק נכלל בסה"כ ובעוגה העליונה. קרן השתלמות וקרן פנסיה מוצגות בעוגה נפרדת (ואינן נכללות בסה"כ ולא בעוגה העליונה).
אריח "התראות" בעמוד הקטגוריות (/notifications) מרכז את כל ההתראות של ה-workspace: מתוזמנות
(תזכורות חודשיות, תאריכי יעד של משימות ושל מסמכים, עם התאריך והשעה של השליחה הבאה) ונשלחו
(יומן 40 ההתראות האחרונות, נשמר 60 יום). מכל התראה מתוזמנת אפשר לערוך שם, תאריך (יום בחודש
לתזכורת חודשית) ושעה - לתזכורת חודשית עורכים את התזכורת עצמה, ובמשימה/מסמך עורכים את הכותרת, תאריך
היעד ושעת ההתראה (notifyTime). שעה ריקה = השעה הגלובלית מאזור הניהול. תזכורות חודשיות חדשות
נוצרות מכפתור "תזכורת" באותו עמוד.
בכל מסך (אחרי התחברות) מוצג בר תחתון אחד (src/components/BottomBar.tsx) שמחליף את הניווט הישן בן 6 הפריטים ואת הכפתור הצף "העלה קובץ":
CategorySheet.tsx) עם כל האפליקציה לניווט ידני: קטגוריות המסמכים וקיצורי דרך (בית, משימות, יומן, קניות, התראות, חשובים, אחרונים, האפליקציות שלי, ו"אזור אישי" למשתמש admin בלבד).מסך הבית (/dashboard) נפתח ב"מה תרצה לעשות היום?", קיצורים מהירים, ורשימת "דורש טיפול" (התראות מתוזמנות להיום ולימים הקרובים, מאותו מקור כמו עמוד ההתראות).
שורת הכתיבה בבר התחתון מפענחת משפטים בעברית באמצעות חוקים ומילון, בלי שום שירות חיצוני ובלי עלות. הקוד ב-src/lib/quickAdd/ והממשק ב-src/components/QuickAdd.tsx.
parse.ts): ניקוי טקסט (ניקוד, קידומות ב/ל/ה/ו/ש/מ/כ), זיהוי כוונה לפי מילות מפתח, ואז חילוץ סכום ("340", "1,290", "2 אלף", ₪/ש"ח), תאריך ("אתמול", "מחר", "בעוד שבוע", "ביום ראשון", "8.12", "5 בדצמבר", חודש בלבד עם תיקון שגיאות כתיב קטנות), שעה ("ב-17:30"), חזרתיות חודשית ("כל 1 לחודש") וקטגוריה לפי נרדפות ("דלק" ← רכב).suggest.ts): בזמן ההקלדה מוצגות תבניות ("שילמתי ___ על ___") ודברים שכתבת בעבר (נשמרים במכשיר בלבד).dictionary.ts): רשימות מילות הכוונה והקטגוריות. אפשר להרחיב אותו בקוד.כשמשפט לא מתחיל במילת כוונה מוכרת (למשל "יש לי זיכוי של 400 ש"ח בינואר"), הכרטיס מציע בתחתית "מה 'יש לי' אומר כאן?" עם בחירה: מסמך חדש, הוצאה, הכנסה, משימה, קניות או שאלה. הבחירה נשמרת למשפחה (QuickAddWord, /api/quick-add-words), מתמזגת על המילון ומפענחת מחדש מיד. אפשר לבטל מיד ("ביטול"). הכוונה "מסמך חדש" יוצרת מסמך בקטגוריה שזוהתה ממילה בטקסט (זיכוי ← זיכויים, קבלה ← קבלות, ביטוח ← ביטוחים, וכו'), עם סכום ותאריך יעד אופציונליים. המילים נכללות בגיבוי ה-ZIP של האדמין.
הרחבות נוספות: המילון כולל מאות מילים בעברית (כוונות כמו "נרכש/התקבל/נגמר", תתי-קטגוריות להוצאות כמו דלק/חשמל/סופר, ומילה ← קטגוריית מסמך כמו ביטוח/פוליסה ← ביטוחים, קרן השתלמות/פנסיה/מניות ← פיננסים, זיכוי ← זיכויים, קבלה/חשבונית ← קבלות). בכרטיס האישור מוצגת הקטגוריה שזוהתה (עם "זוהה לפי: ...") ואפשר לשנות אותה לפני שמירה. כשמילה לא מוכרת אפשר ללמד אותה בלחיצה (כוונה או קטגוריה) או להקליד ידנית את המשמעות ("הוצאה", "מסמך חדש", "ביטוחים"...).
הערה ל-iOS: שדות טקסט חייבים להיות בגודל 16px לפחות, אחרת ספארי מגדיל את הדף בפוקוס וחלונות שנפתחים נחתכים. לכן שורת הכתיבה בבר התחתון היא text-base.
בעמוד כל מסמך/רשומה יש כרטיס "פרטי הרשומה": שם, קטגוריה, תת-קטגוריה, סכום (לקטגוריות שאינן פיננסים; בפיננסים הסכום נערך בבלוק הייעודי) ותאריך (תאריך ההוצאה/ההכנסה, או תאריך ההוספה). השינויים נשמרים בכפתור "שמור" ומתעדכנים גם בדוחות החודשיים. כרטיס האישור של ההוספה המהירה מסתיים בכפתור "פתח לעריכה" שמוביל ישר לרשומה שנוצרה. רשומת הבנק הקבועה לא ניתנת להעברה לקטגוריה אחרת.
globals.css מחלקות teal-* של Tailwind מופנות לפלטת אינדיגו (בלוק @theme), לכן אין צורך לשנות כל קובץ כשמחליפים צבע ראשי; שינוי הפלטה שם משנה את כל האפליקציה (וגם themeColor ב-layout.tsx ו-public/manifest.json).src/lib/categoryTheme.ts (ביטוחים כחול, פיננסים ירוק, זיכויים סגול, קבלות כתום, כללי אפור, הוצאות אדום-ורוד, הכנסות ירוק-כחול) ונמצאים באריחי הקטגוריות, בגליון הקטגוריות, בכותרת עמוד קטגוריה ובכרטיסי המסמכים.EmptyState – מצב ריק ידידותי עם איור וכפתור פעולה (בית, משימות, קניות, התראות, עמוד קטגוריה).Skeleton – שלדי טעינה עם אנימציית shimmer במקום "טוען...".ToastProvider / useToast – הודעה בתחתית המסך אחרי הוספה מהשורה החכמה, עם "ערוך/פתח" ו"בטל" (מחיקה של מה שנוצר). בקניות אין ביטול.DueRing – טבעת ספירה לאחור על כרטיס מסמך עם תאריך יעד (עד 90 יום): ירוק-סגול, כתום עד 30 יום, אדום עד 7 ימים או אחרי שעבר.SwipeRow – במסך מגע אפשר להחליק שורה: ימינה מפעילה (משימה: בוצע, מסמך: חשוב), שמאלה מוחקת. מחיקת משימה כוללת "בטל" בהודעה; מחיקת מסמך מבקשת אישור כי היא סופית. גלילה אנכית רגילה לא מושפעת, ובעכבר הכפתורים הרגילים בשורה ממשיכים לעבוד.
האייקון (public/icons ו-favicon.ico): משושה זהב כקו עם בית בתוכו, על רקע כחול כהה. הקבצים מרובעים מלאים, בלי פינות מעוגלות, כדי שיתאימו ל-maskable ול-iOS שמעגל בעצמו.
לחיצה על "הכנסות" או "הוצאות" בכרטיס המאזן פותחת רשימה של כל הרשומות בחודש הנבחר (שם, תאריך, תת-קטגוריה, סכום), עם קישור לרשומה. תשלומים חודשיים קבועים שעוד לא הופקה עבורם רשומה מסומנים "צפוי · קבוע חודשי", ולכן אפשר לראות מה צפוי גם בחודשים עתידיים. הסכומים בכרטיס נגזרים מאותן רשומות, כך שהרשימה תמיד מסתכמת למה שמוצג.
באירוע אפשר לבחור "עד תאריך" (למשל רומא 12.11 עד 16.11). האירוע נשמר כרשומה אחת (date + endDate, כולל יום הסיום) ומופיע ברשת החודש כפס רציף על פני הימים, שנשבר בתחילת כל שבוע וממשיך בשורה הבאה. בלחיצה על כל יום בטווח הוא מופיע ברשימת היום עם הטווח, ואפשר לערוך תאריכים (או להסיר את "עד תאריך" כדי להחזיר אותו ליום אחד). אירועים קיימים ללא endDate ממשיכים לעבוד כרגיל.
בהוצאות ובהכנסות אפשר לבחור לאיזה חודש הרשומה שייכת: בטופס ההוספה ("החודש שאליו שייכת ההוצאה") ובעריכת הרשומה ("שייך לחודש"). הבחירה קובעת את התאריך לאותו יום בחודש שנבחר, והרשומה נספרת בדשבורד ובדוחות של אותו חודש. מותר גם חודש עתידי (עד 3 שנים קדימה) בהוצאות והכנסות בלבד; בשאר הקטגוריות תאריך עתידי עדיין לא מתקבל.
MonthlyFlowChart (מבוסס על /api/reports): בעמוד פיננסים גרף של הכנסות מול הוצאות לכל חודש בשנה, עם סיכום (הכנסות, הוצאות, מאזן). בעמוד הכנסות ובעמוד הוצאות גרף של הסכום לפי חודש, עם סה״כ לשנה, ממוצע לחודש פעיל והחודש הגבוה ביותר. אפשר לעבור בין שנים; חודשים עתידיים בגוון בהיר וכוללים תחזית לתשלומים חודשיים קבועים.
בייבוא (/import) בוחרים "סוג הקובץ". כרטיס אשראי (ברירת מחדל): הכל הוצאות; סכומים שליליים (זיכוי/ביטול) לא מיובאים ומוצגים כהערה. חשבון בנק: כל שורה מסווגת בנפרד, לפי עמודות נפרדות "חובה"/"זכות" אם יש בקובץ, או לפי הסימן בעמודה אחת (שלילי, כולל "12,000-" ו-(12,000) = הוצאה; חיובי = הכנסה, עם אפשרות להפוך). קובץ עם עמודת "זכות" או "יתרה" מזוהה אוטומטית כבנק. התצוגה המקדימה מציגה סכום וספירה נפרדים להוצאות ולהכנסות לפני האישור, ובדיקת הכפילויות כוללת את סוג הרשומה.
src/lib/externalApps.ts/import) - שני הפורמטים נתמכים ישירות, בלי צורך בהמרה ביניהם. אין חיבור ישיר/אוטומטי לחברת האשראי - זה ייבוא ידני: מורידים קובץ עסקאות, מתאימים עמודות (תאריך/שם/סכום), ומייבאים. המערכת מדלגת אוטומטית על רשומות שכבר קיימות (לפי תאריך+סכום+שם) כדי שאפשר יהיה להעלות שוב קובץ עם חודשים חופפים בלי כפילויות.src/lib/itemColors.ts) ולערוך (כותרת/תאריך/הערות/צבע) בכל שלב אחרי היצירה, דרך כפתור העיפרון בשורת הפריט./shopping) בעמוד הקטגוריות - לא מסמך רגיל אלא רשימת קניות ייעודית: אפשר לפתוח רשימה חדשה לכל יום/ביקור קניות, להוסיף בה מוצרים (שם, כמות - ברירת מחדל 1, ותמונה אופציונלית לצפייה בזמן הקניות בלי צורך בהורדה), לערוך/להסיר מוצר, ולסמן מוצר כ"נוסף לעגלה". רשימה שבה כל המוצרים סומנו עוברת אוטומטית ל"הושלמו".