האפליקציה שלך מתחילה בתכונה הראשונה.
Bones הוא מונוריפו ב-TypeScript שבו כל מה שמסביב למוצר כבר בנוי, נבדק ומחובר: התחברות, ארגונים, הרשאות, ממשק ניהול, לוגים, אימייל, בלוג, תיעוד וארבע שפות, באפליקציית ווב, באפליקציית דסקטופ ובשלושה אתרים ציבוריים. משכפלים אותו, והדבר הראשון שכותבים הוא החלק שבאמת שייך למוצר שלך.
| תכונה | owner | administrator | standard |
|---|---|---|---|
| page.admin.view | מאושרת | מאושרת | לא מאושרת |
| admin.users.view | מאושרת | מאושרת | לא מאושרת |
| admin.roles.create | מאושרת | לא מאושרת | לא מאושרת |
| admin.terms.update | מאושרת | לא מאושרת | לא מאושרת |
| application.organizations.create | מאושרת | מאושרת | מאושרת |
| chatbot | מאושרת | מאושרת | מאושרת |
- סביבות עבודה
- 9
- רכיבים משותפים
- 36
- ראוטרים של TRPC
- 18
- לקוחות
- 5
חצי שנה של אינסטלציה, כבר כתובה.
חמישה עשר חלקים שכל אפליקציה צריכה, כל אחד בנוי, נבדק ומתועד. כל כרטיס מקשר לדף על הבעיה שהוא פותר ועל ההשוואה לחלופות.
התחברות שכבר עובדת
אימייל וסיסמה או Google, על better-auth. מיילים לאימות ולאיפוס, ניהול הפעלות, אסימוני bearer לגרסת הדסקטופ, ומתג בממשק הניהול שמשבית שיטת התחברות בלי פריסה.
שתי שכבות של בקרת גישה
תכונות שניתנות לתפקידים בפלטפורמה, ומעליהן טבלה נפרדת לכל ארגון. שתיהן נאכפות ב-middleware של tRPC ונפתרות לתוך ההפעלה, כך שהמסך והשרת קוראים את אותה תשובה.
ארגונים עם חברוּת אמיתית
חברים, תמונות פרופיל ופרופיל לכל ארגון. התפקידים מוגדרים ברמת הארגון, אי אפשר להסיר את המנהל האחרון, וחברוּת מושבתת במקום להימחק.
ממשק ניהול שמגיע מוכן
משתמשים, ארגונים, תפקידים, הרשאות, דגלי תכונות, שיטות התחברות, הגדרות אתר ותנאי שימוש עם גרסאות ואישור לכל משתמש — בנויים, לא סקיצות.
יומנים שאפשר למסור לבודק
כל כתיבה למסד הנתונים וכל בקשה, מובנות ומושחרות, מסובבות בדיסק ונשמרות בארכיון ב-S3 לפי לוח זמנים. בדיקות תקינות וחשבון בעלים שנוצר כבר במיגרציה הראשונה.
בלוג שמתפרסם כקבצים סטטיים
כותבים, עורכים ומפרסמים מממשק הניהול. המטא-נתונים ב-Postgres, גוף הפוסטים והמדיה ב-S3, ו-build סטטי נפרד שהופך כל פוסט לקובץ HTML אמיתי — שמנועי חיפוש יכולים לאנדקס בלי להריץ שורת JavaScript אחת.
תיעוד שמשתנה יחד עם הקוד
הלמה, המה והאיך של כל תכונה, כ-MDX בתוך הריפו, ונערכים באותו pull request כמו הקוד. אתר סטטי עם חיפוש מובנה, וכל דף זמין כ-Markdown לכלי AI.
אימיילים שמתאימים למוצר
תבניות שנכתבות ב-React ומומרות לטבלאות ולסגנונות המוטמעים שתוכנות דואר אמיתיות צריכות, עם טוקנים שנוצרים ממערכת העיצוב. Mailpit תופס כל הודעה בפיתוח, ו-SES שולח בפרודקשן.
צ'אטבוט שכבר מחובר למודל
Claude על Bedrock בפרודקשן ומודל Ollama מקומי בפיתוח, מאחורי ממשק ספק אחד. התשובות מוזרמות אסימון אחרי אסימון, השיחות נשמרות לכל ארגון, והגישה עוברת דרך אותה טבלת הרשאות כמו כל השאר.
backend אחד, חמישה לקוחות
אפליקציית ווב, אפליקציית דסקטופ עם נתיבים משלה, האתר הזה, הבלוג והתיעוד, וכולם פונים ל-backend אחד. האפליקציות פונות אליו דרך tRPC עם טיפוסים מלאים, כך ששדה ששונה שמו שובר את ה-build, לא את הפרודקשן.
אחיד עד הסוף
קובץ טוקנים אחד מאחורי אפליקציית הווב, אפליקציית הדסקטופ, האתר הזה, הבלוג, התיעוד וכל אימייל. הרכיבים המשותפים מוגדרים ב-COMPONENTS.md ומוצגים ב-Storybook, ופקד שנכתב פעמיים מאוחד במקום להיות מועתק.
ארבע שפות, כולל מימין לשמאל
אנגלית, צרפתית, ספרדית ועברית בכל משטח, מהאפליקציות ועד האימיילים והודעות השגיאה. עברית הופכת כל פריסה, וה-CI נכשל על טקסט ממשק שמדלג על תרגום.
נבדק מול WCAG 2.2 AA
אתר השיווק, הבלוג, התיעוד וכל story ב-Storybook, במצב בהיר ובמצב כהה, בכל pull request. axe מריץ את הכללים שלו, ובדיקה שנייה מוודאת את האזורים, הכותרות והתוויות שקורא מסך נשען עליהם.
הגנות בקוד, שנסרקות בכל שינוי
קלטים מוגבלים, שאילתות עם פרמטרים, הגבלת קצב, העלאות שנבדקות ו-CSP בכל דף. Semgrep, OWASP ZAP, בדיקת CSP ובדיקת סודות רצים בכל pull request.
בדיקות מול הדבר האמיתי
בדיקות backend מול Postgres אמיתי בקונטיינר זמני, כל story ב-Storybook ב-Chromium אמיתי, ו-build של כל אתר. כל pull request מריץ רק את המשימות שהשינוי שלו נוגע בהן.
שלושה שלבים, ואף אחד מהם הוא לא "לחכות ל-build".
מתחילים לעבוד מהר
סביבת פיתוח אחידה אומרת שמספיקות כמה פקודות כדי להתחיל לעבוד. אחת מהן מפעילה יחד את ה-backend, אפליקציית הווב, אתר השיווק, הבלוג והתיעוד.
הופכים אותו ל-SaaS שלך
לא משנה מה בונים, כבר קרובים הרבה יותר. התחברות, ארגונים, הרשאות, ממשק ניהול, אימייל וארבע שפות כבר מוכנים, וכל router ודף שמוסיפים מקבלים אותם.
פורסים אותו
מעלים לפרודקשן ומתחילים לקבל משתמשים. הכול ב-AWS, עם מעבר קל בין רמות ככל שהאפליקציה גדלה: Starter, Growth ו-High availability, כל אחת בשינוי של שורה אחת.
ריפו שמפתחים ישמחו לרשת. ריפו שבינה מלאכותית יכולה להמשיך ממנו.
ב-Bones, כל הרשאה היא שורה בטבלה וקריאת middleware בפרוצדורה. שום דבר לא נאכף רק בממשק, ושום דבר לא מוסתר מאחורי שירות שאי אפשר לקרוא.
אותו דבר נכון לחלקים שמודל צריך לקרוא. הכללים, המפרטים והנימוקים נמצאים בריפו, כך שסוכן עובד ממה שהקוד עושה במקום להסיק את זה.
- פריימוורקים סטנדרטיים — Fastify, tRPC, Drizzle, React. אין סביבת ריצה קניינית שצריך לקרוא לה.
- הרשאות שנאכפות ב-middleware בשרת, לא מוסתרות בממשק.
- מיגרציות שמריצים בעצמך, מול ה-Postgres שלך.
- בדיקות שרצות מול מסד נתונים אמיתי בקונטיינר זמני, לא מול mock.
- מוסכמות כתובות במקום מנחשות: תשעה כללים מחייבים ב-CLAUDE.md, ושלושים וארבעה מפרטי רכיבים ב-COMPONENTS.md.
- ההערות מסבירות למה התקבלה החלטה, אף פעם לא מה עושה השורה הבאה.
- עבודה שהושלמה מתועדת ב-NOTES.md, עבודה פתוחה ממוספרת ב-TODOS.md — ההקשר נמצא על הדיסק, לא בראש של מישהו.
- כל רכיב וכל דף ב-Storybook, כדי שאפשר יהיה לבדוק שינוי במקום לנחש.
- כל דף תיעוד כ-Markdown, והאתר כולו ב-/llms.txt, כדי שסוכן יוכל לקרוא למה חלק נבנה לפני שהוא משנה אותו.
export const rolesRouter = router({
list: protectedProcedure.query(() =>
db.select().from(roles)
),
create: requirePermission("admin.roles.create")
.input(z.object({ name: z.string().min(1) }))
.mutation(async ({ input }) => {
const [created] = await db
.insert(roles)
.values({ name: input.name })
.returning();
return created;
}),
});כלים נפוצים ומתועדים היטב. כל מי שמגייסים, וכל AI שמשתמשים בו, כבר מכירים אותם.
- TypeScript
- Fastify
- tRPC
- Zod
- Drizzle
- Postgres
- Better Auth
- Pino
- React
- Vite
- Mantine
- Tauri
- Next.js
- Fumadocs
- React Email
- i18next
- Storybook
- Vitest
- Testcontainers
- Playwright
- oxlint
- Docker
- GitHub Actions
- AWS
היסודות מוכנים. עכשיו לבנות את השאר.
מתחברים ומתחילים מסטאק שכבר עובד — וכל קובץ בו נשאר אצלך.
הרשמה לעדכונים
גרסאות חדשות ופוסטים, במייל. אפשר לבטל את ההרשמה מכל הודעה.