رادیکار یک Monorepo ماژولار برای کاریابی هوشمند است؛ رزومهسازی یکی از قابلیتهای آن است، نه هدف نهایی محصول. رادیکار فرصتهای شغلی را با پروفایل کاربر تطبیق میدهد، برای هر موقعیت رزومهٔ هدفمند میسازد و کاربر را برای اپلای و مصاحبه آماده میکند. رابط کاربری با Next.js App Router، بکاند با Node.js و Fastify و دیتابیس با PostgreSQL و Drizzle ساخته شده است.
دادههای اصلی برنامه فقط از مسیر زیر عبور میکنند:
Browser → Next.js Web → Node.js API → PostgreSQL
Web مستقیماً به دیتابیس وصل نمیشود و اطلاعات دامنه در Local Storage یا IndexedDB نگهداری نمیشوند.
.
├── apps/
│ ├── web/ # Next.js رسمی + App Router + Turbopack
│ └── api/ # Node.js + Fastify modular API
├── packages/
│ ├── ai/ # اتصال و parsing پاسخ مدلهای زبانی
│ ├── config/ # اعتبارسنجی تنظیمات محیطی
│ ├── database/ # Drizzle schema, migrations و seed
│ ├── shared-types/ # Typeهای مشترک بدون وابستگی به framework
│ └── validators/ # Schemaهای مشترک Zod
├── docker-compose.yml # PostgreSQL و API محلی
├── tsconfig.base.json # تنظیمات مشترک TypeScript
├── turbo.json # اجرای هماهنگ workspaceها
└── package.json # npm workspaces و فرمانهای ریشه
ریشه پروژه فقط نقش orchestrator دارد. Web، API و packageهای مشترک مستقل هستند و میتوانند جداگانه Build، Deploy و Scale شوند.
- Node.js نسخه
22.13.0یا جدیدتر - npm نسخه
10یا جدیدتر - Docker Desktop برای اجرای PostgreSQL محلی
- پورتهای آزاد زیر:
3161برای Web3162برای API5433برای PostgreSQL روی سیستم میزبان
نسخههای نصبشده را بررسی کنید:
node --version
npm --version
docker --version
docker compose versionتمام فرمانهای این README باید از ریشه repository اجرا شوند.
در این روش PostgreSQL داخل Docker و Web و API روی سیستم شما اجرا میشوند. این سادهترین حالت برای توسعه و دیباگ است.
برای اولین اجرا یا بعد از دریافت تغییرات repository:
npm ciاگر عمداً dependency جدیدی به package.json اضافه کردهاید، بهجای آن از
npm install استفاده کنید تا lockfile نیز بهروزرسانی شود.
cp apps/web/.env.example apps/web/.env.local
cp apps/api/.env.example apps/api/.envفایلهای .env در Git ثبت نمیشوند. اگر این فایلها از قبل وجود دارند، آنها را
بدون بررسی overwrite نکنید.
تنظیم پیشفرض Web:
NEXT_PUBLIC_API_BASE_URL=http://localhost:3162تنظیم پیشفرض اتصال API به PostgreSQL محلی:
DATABASE_URL=postgresql://radikar:radikar@127.0.0.1:5433/radikarnpm run infra:upوضعیت container را بررسی کنید:
docker compose ps
docker compose logs postgresnpm run db:migrateاین فرمان migrationهای موجود در packages/database/migrations را روی دیتابیس
اعمال میکند و مقدار DATABASE_URL را از apps/api/.env میخواند.
npm run db:seedSeed فضای کاری اولیه و سه پلن عضویت را ایجاد میکند و تکرار اجرای آن داده تکراری نمیسازد.
npm run dev:stackپس از آمادهشدن سرویسها:
- Web: http://localhost:3161
- صفحه ورود: http://localhost:3161/login
- API: http://localhost:3162
- Health: http://localhost:3162/health
- Readiness: http://localhost:3162/ready
سلامت API و اتصال دیتابیس را میتوانید با این دو فرمان بررسی کنید:
curl http://localhost:3162/health
curl http://localhost:3162/readyخروجی موفق endpoint دوم باید شبیه زیر باشد:
{"status":"ready"}اگر میخواهید log هر سرویس جدا باشد، بعد از اجرای PostgreSQL و migrationها دو terminal باز کنید.
Terminal اول:
npm run dev:apiTerminal دوم:
npm run dev:webفرمان npm run dev نیز تمام workspaceهای دارای dev script را از طریق Turborepo
اجرا میکند؛ برای این پروژه npm run dev:stack صریحتر است.
در این حالت PostgreSQL و API داخل Docker اجرا میشوند و فقط Web روی سیستم شما
اجرا میشود. ابتدا فایل apps/api/.env را مطابق بخش راهاندازی بسازید، سپس:
docker compose --profile full up -d --buildAPI داخل container هنگام شروع migrationها را اجرا میکند. برای ساخت داده اولیه:
npm run db:seedسپس Web را اجرا کنید:
npm run dev:webمشاهده logها:
docker compose logs -f api
docker compose logs -f postgresتوقف containerها بدون حذف اطلاعات دیتابیس:
docker compose downپروفایل full برای توسعه محلی است و API را با NODE_ENV=development اجرا
میکند. از همین Compose بدون سختسازی تنظیمات برای Production استفاده نکنید.
در تنظیمات نمونه این دو مقدار فعالاند:
EXPOSE_DEVELOPMENT_OTP=true
ALLOW_FIRST_USER_SUPERADMIN=trueدر نتیجه:
- یک شماره موبایل با الگوی
09xxxxxxxxxدر صفحه ورود وارد کنید. - کد ششرقمی توسعه در همان صفحه نمایش داده میشود.
- اولین کاربری که در دیتابیس خالی ثبت شود نقش
superadminمیگیرد. - سوپرادمین بعد از ورود به
/adminهدایت میشود؛ کاربران معمولی به/dashboardمیروند.
برای تعیین یک سوپرادمین مشخص میتوانید در apps/api/.env مقدار زیر را فعال کنید:
BOOTSTRAP_SUPERADMIN_PHONE=09123456789پس از ساخت اولین سوپرادمین، بهتر است ALLOW_FIRST_USER_SUPERADMIN را false
کنید.
سه پلن اولیه هنگام اجرای npm run db:seed ثبت میشوند:
| پلن | قیمت | مدت | رزومه | AI | تطبیق | مصاحبه | |
|---|---|---|---|---|---|---|---|
| رایگان | ۰ | ۳۰ روز | ۱ | ۳ | ۵ | ۱ | ۱ |
| جستوجوی شغلی | ۴۹۹٬۰۰۰ تومان | ۳۰ روز | ۵ | نامحدود | ۴۰ | ۱۵ | ۵ |
| حرفهای | ۷۹۹٬۰۰۰ تومان | ۳۰ روز | نامحدود | نامحدود | ۱۵۰ | ۵۰ | ۱۵ |
پلن رایگان فقط یکبار و همزمان با اولین ثبتنام کاربر اعطا میشود و خودکار تمدید نمیشود. تمدید پلن فعلی، ۳۰ روز و اعتبارهای همان پلن را اضافه میکند. ارتقا فوری است و ۳۰ روز جدید به تاریخ انقضای موجود افزوده میشود. خرید پلن پایینتر تا پایان پلن بالاتر غیرفعال است.
برای توسعه، تنظیمات زیر در apps/api/.env قرار میگیرند:
API_PUBLIC_URL=http://localhost:3162
WEB_APP_URL=http://localhost:3161
ZARINPAL_BASE_URL=https://sandbox.zarinpal.com
ZARINPAL_MERCHANT_ID=00000000-0000-4000-8000-000000000000Sandbox طبق مستندات زرینپال هر UUID معتبر را بهعنوان Merchant ID میپذیرد.
مبالغ ارسالی به API زرینپال بر حسب ریال هستند و رابط کاربری آنها را به تومان
نمایش میدهد. callback روی /api/billing/callback دریافت و سپس نتیجه به
/billing/result در Web هدایت میشود.
صفحات کاربر:
/upgrade: خرید و ارتقای بسته/orders: سفارشها و کدهای پیگیری کاربر/account: نام و اطلاعات حساب؛ شماره همراه قابل تغییر نیست/settings: تنظیمات امنیت و نشست
صفحات مدیریت:
/admin/memberships: اعطای پلن، تمدید، تغییر اعتبار، لغو و تعلیق کاربر/admin/orders: سفارشها و وضعیت پیگیری/admin/payments: تراکنشها و واریزیهای درگاه
بخشهای معمول برنامه بدون تنظیم LLM بالا میآیند، اما تحلیل شغل، تولید رزومه، مصاحبه و import هوشمند به provider مدل نیاز دارند.
در apps/api/.env:
LLM_PROVIDER=openai-compatible
LLM_MODEL=your-model-name
LLM_API_KEY=your-api-key
LLM_BASE_URL=https://your-provider.example/v1
LLM_INPUT_PRICE_PER_MILLION_USD=0
LLM_OUTPUT_PRICE_PER_MILLION_USD=0برای عملیات نوشتاری میتوانید provider جدا تعریف کنید. اگر تعریف نشود، تنظیمات
اصلی LLM_* استفاده میشوند:
LLM_WRITE_PROVIDER=openai-compatible
LLM_WRITE_MODEL=your-writing-model
LLM_WRITE_API_KEY=your-api-key
LLM_WRITE_BASE_URL=https://your-provider.example/v1
LLM_WRITE_INPUT_PRICE_PER_MILLION_USD=0
LLM_WRITE_OUTPUT_PRICE_PER_MILLION_USD=0اگر proxy محلی سازگار با پروژه را روی پورت 9655 اجرا کردهاید:
LLM_PROVIDER=freeDeepseekAPI
LLM_MODEL=deepseek-chat
FREE_DEEPSEEK_PORT=9655بعد از تغییر .env، API را restart کنید.
| متغیر | پیشفرض توسعه | توضیح |
|---|---|---|
API_HOST |
127.0.0.1 |
آدرس listen شدن API |
API_PORT |
3162 |
پورت API |
CORS_ORIGINS |
http://localhost:3161 |
originهای مجاز، جداشده با کاما |
DATABASE_URL |
PostgreSQL روی پورت 5433 |
رشته اتصال دیتابیس |
DATABASE_MAX_CONNECTIONS |
10 |
سقف connection pool هر API instance |
LOG_LEVEL |
info |
سطح log بکاند |
AUTH_SECRET |
فقط مقدار توسعه | کلید امضای session و OTP؛ در Production حتماً عوض شود |
SESSION_TTL_DAYS |
30 |
عمر session |
OTP_TTL_SECONDS |
180 |
عمر کد یکبارمصرف |
EXPOSE_DEVELOPMENT_OTP |
true |
نمایش کد OTP فقط در توسعه |
ALLOW_FIRST_USER_SUPERADMIN |
true در env نمونه |
ارتقای اولین کاربر دیتابیس خالی |
BOOTSTRAP_SUPERADMIN_PHONE |
خالی | شماره مجاز برای bootstrap سوپرادمین |
OTP_WEBHOOK_URL |
خالی | endpoint سرویس ارسال پیامک |
OTP_WEBHOOK_TOKEN |
خالی | Bearer token اختیاری سرویس پیامک |
API_PUBLIC_URL |
http://localhost:3162 |
آدرس عمومی callback بکاند |
WEB_APP_URL |
http://localhost:3161 |
آدرس Web برای redirect نتیجه پرداخت |
ZARINPAL_BASE_URL |
https://sandbox.zarinpal.com |
آدرس درگاه؛ در توسعه Sandbox |
ZARINPAL_MERCHANT_ID |
UUID توسعه | شناسه پذیرنده Sandbox |
اجرای migrationهای موجود:
npm run db:migrateساخت migration جدید بعد از تغییر Drizzle schema:
npm run db:generateاجرای seed:
npm run db:seedورود به PostgreSQL داخل Docker:
docker compose exec postgres psql -U radikar -d radikarاطلاعات PostgreSQL داخل volume با نام radikar_postgres_data باقی میماند؛ بنابراین
docker compose down دادهها را حذف نمیکند.
برای حذف کامل دیتابیس محلی و شروع از صفر، فقط در صورتی که مطمئن هستید دادهای لازم ندارید اجرا کنید:
docker compose down -v
npm run infra:up
npm run db:migrate
npm run db:seedفرمان down -v غیرقابلبازگشت است و تمام دادههای دیتابیس محلی Docker را حذف
میکند.
اجرای تمام تستهای Web، API و AI:
npm run testفرمانهای تفکیکشده:
npm run test:web
npm run test:api
npm run typecheck
npm run lintProduction build کامل Monorepo:
npm run buildاین فرمان dependency graph را با Turborepo رعایت میکند، packageها و API را
اعتبارسنجی میکند و Web را با Build رسمی Next.js در apps/web/.next میسازد.
ابتدا Build بگیرید:
npm run buildسپس در دو terminal اجرا کنید:
npm run start:apinpm run start:webPostgreSQL باید قبل از start شدن API در دسترس باشد و migrationها نیز باید اجرا شده باشند.
در Production حداقل این موارد را رعایت کنید:
NODE_ENV=production- یک
AUTH_SECRETتصادفی و حداقل ۳۲ کاراکتری EXPOSE_DEVELOPMENT_OTP=falseALLOW_FIRST_USER_SUPERADMIN=false- تنظیم
BOOTSTRAP_SUPERADMIN_PHONEبرای bootstrap کنترلشده یا مدیریت نقش از قبل - تنظیم
OTP_WEBHOOK_URLو در صورت نیازOTP_WEBHOOK_TOKEN - محدودکردن
CORS_ORIGINSبه دامنه واقعی Web - استفاده از PostgreSQL production با backup، connection pooling و SSL
- نگهداری secretها در Secret Manager، نه داخل repository یا Docker image
API در حالت Production با secret توسعه، بدون webhook پیامک یا با نمایش OTP بالا نمیآید و عمداً startup را متوقف میکند.
| فرمان | کاربرد |
|---|---|
npm run dev:stack |
اجرای همزمان Web و API |
npm run dev:web |
فقط Web روی پورت 3161 |
npm run dev:api |
فقط API روی پورت 3162 |
npm run build |
Build کامل Monorepo با Next.js رسمی |
npm run build:web |
Build فقط Web و dependencyهای آن |
npm run build:api |
بررسی Build API و dependencyهای آن |
npm run build:packages |
Build packageهای مشترک |
npm run test |
تمام تستها |
npm run test:web |
تستهای Web |
npm run test:api |
تستهای API |
npm run typecheck |
TypeScript تمام workspaceها |
npm run lint |
lint تمام workspaceها |
npm run infra:up |
اجرای PostgreSQL محلی |
npm run infra:down |
توقف containerها بدون حذف volume |
npm run db:generate |
تولید migration جدید |
npm run db:migrate |
اجرای migrationها |
npm run db:seed |
ایجاد داده اولیه |
- مقدار
NEXT_PUBLIC_API_BASE_URLرا درapps/web/.env.localبررسی کنید. - مطمئن شوید API روی
http://localhost:3162اجرا شده است. - بعد از تغییر env، Web را restart کنید.
برای حفظ نشست ورود، در مرورگر localhost و 127.0.0.1 را با هم ترکیب نکنید.
Web و NEXT_PUBLIC_API_BASE_URL باید هر دو از hostname یکسان localhost استفاده
کنند؛ در غیر این صورت مرورگر ممکن است کوکی SameSite را به API نفرستد.
- وضعیت PostgreSQL را با
docker compose psبررسی کنید. - log دیتابیس را با
docker compose logs postgresببینید. DATABASE_URLدرapps/api/.envباید به پورت5433میزبان اشاره کند.- migrationها را با
npm run db:migrateاجرا کنید.
مقدار CORS_ORIGINS باید دقیقاً origin مرورگر، بدون مسیر اضافی، باشد:
CORS_ORIGINS=http://localhost:3161برای چند origin از کاما استفاده کنید.
Web را فقط از http://localhost:3161 باز کنید. پورت 3162 مخصوص API است. اگر
مرورگر صفحه Web را روی localhost:3162 نشان میدهد، یک اجرای تکراری Web فعال
است؛ همه اجراهای قبلی را متوقف و فقط یکبار npm run dev:stack را اجرا کنید.
Next.js با پورت صریح 3161 اجرا میشود و در صورت اشغالبودن آن با خطای واضح
متوقف میشود.
این مقادیر را بررسی و API را restart کنید:
EXPOSE_DEVELOPMENT_OTP=true
NODE_ENV=developmentحداقل LLM_PROVIDER، LLM_MODEL، LLM_API_KEY و LLM_BASE_URL را در
apps/api/.env تنظیم و API را restart کنید.
lsof -nP -iTCP:3161 -sTCP:LISTEN
lsof -nP -iTCP:3162 -sTCP:LISTEN
lsof -nP -iTCP:5433 -sTCP:LISTENفرآیند درست را متوقف کنید یا پورت متناظر را در تنظیمات تغییر دهید.
اگر package.json و package-lock.json هماهنگاند:
npm ciاز npm audit fix --force بدون بررسی تغییرات breaking استفاده نکنید.
این بخش محل ثبت فازهای محصول و ایدههایی است که هنوز برای اجرای آنها زمانبندی نشده است. هر قابلیت جدیدی که در گفتگوها یا بررسی محصول به ذهنمان میرسد باید ابتدا اینجا ثبت شود و فقط بعد از مشخصشدن دامنه، وابستگیها و معیار پذیرش وارد کدنویسی شود. وضعیتها:
[x]انجامشده یا موجود در نسخهٔ فعلی[~]در حال طراحی یا نیازمند تصمیم[ ]بکلاگ؛ هنوز اجرا نشده است
[x]Monorepo با Web، API، دیتابیس و packageهای مشترک[x]احراز هویت OTP و session امن با کوکیHttpOnly[x]پروفایل مسیر شغلی، رزومه، دادههای فرصت شغلی و مدیریت اپلای[x]تطبیق رزومه و آگهی با امتیاز، مهارتهای مشترک و شکافها[x]تولید رزومهٔ هدفمند و تمرین مصاحبه با AI[x]پلنها، اعتبارها، پرداخت و پنل مدیریت پایه[x]مستندسازی، migration، seed، health check و CI/CD
[ ]ورود با Google بهعنوان روش اصلی کاربران بینالمللی؛ شماره موبایل برای این کاربران اجباری نباشد و اتصال حسابها فقط با تأیید صریح انجام شود[ ]ورود با Telegram بهعنوان روش دوم کاربران بینالمللی، با OIDC و PKCE؛ بدون اجبار شماره موبایل[ ]ارسال کد ورود با WhatsApp OTP بهعنوان fallback برای کاربرانی که Google یا Telegram ندارند؛ با WhatsApp Business Cloud API و قالب Authentication رسمی[ ]حفظ OTP پیامکی برای کاربران ایران و کاربرانی که روش پیامک را انتخاب میکنند[ ]مدل چندروش ورود با جدولauth_accountsبرای اتصال Google، Telegram، WhatsApp و phone به یک حساب، بدون merge خودکار صرفاً بر اساس ایمیل
ترتیب پیشنهادی اجرای این بکلاگ: Google Login → Telegram Login → WhatsApp OTP بهعنوان fallback → SMS برای بازار ایران. در هیچیک از دو روش Google و Telegram نباید کاربر بینالمللی فقط برای تکمیل ورود مجبور به ارائهٔ شماره موبایل شود.
[ ]اتصال و import فرصتها از جابینجا، کوئرا، لینکدین و منابع بینالمللی، با رعایت قوانین و محدودیتهای هر سرویس[ ]پیشنهاد فرصتهای شخصیسازیشده بر اساس هدف شغلی، مهارت، سابقه، مکان، حقوق و امکان دورکاری[ ]امتیازدهی قابل توضیح بهجای یک عدد مبهم: چرا این فرصت مناسب یا نامناسب است؟[ ]تولید نامهٔ پوششی، پیام معرفی و پاسخ فرمهای اپلای برای هر فرصت[ ]تقویم اپلای، یادآوری مهلتها و پیگیری follow-up[ ]تحلیل شکاف مهارتی و مسیر یادگیری پیشنهادی برای رسیدن به فرصت هدف[ ]نسخهٔ فارسی/انگلیسی و آمادهسازی رزومه برای مهاجرت کاری و فرمتهای رایج
هدف این فاز ساخت یک فضای جداگانه برای شرکتها و استخدامکنندههاست؛ این پنل نباید به دادههای کارجو بدون رضایت و سطح دسترسی مشخص دسترسی داشته باشد.
[ ]workspace مستقل کارفرما با نقشهای owner، recruiter، interviewer و مدیر سازمان[ ]ساخت، ویرایش، انتشار و آرشیو فرصت شغلی با شرح شغل ساختاریافته[ ]دریافت رزومهها و درخواستهای اپلای در یک inbox واحد[ ]استخراج و نرمالسازی مهارتها، سابقه، سطح شغلی و ترجیحات هر رزومه[ ]امتیازدهی تطابق رزومه با فرصت بر اساس معیارهای قابل مشاهده و قابل تنظیم[ ]مرتبسازی، فیلتر و مقایسهٔ چند رزومه در کنار هم[ ]ساخت shortlist، برچسبگذاری، یادداشت داخلی و تغییر مرحلهٔ هر نامزد[ ]ثبت امتیاز جداگانه برای مهارت، تجربه، شواهد عملکرد، ارتباط و تناسب با نقش[ ]scorecard مشترک برای جلوگیری از تصمیمگیری سلیقهای بین اعضای تیم[ ]تاریخچهٔ تصمیمها و audit log برای مشاهدهٔ اینکه چه کسی، چه امتیازی و چرا ثبت کرده است[ ]امکان دعوت اعضای تیم با سطح دسترسی محدود و قابل لغو
برای هر فرصت و هر شخص، AI باید یک بستهٔ مصاحبهٔ قابل بازبینی تولید کند؛ خروجی AI پیشنهاد و تصمیمیار است و نباید بهتنهایی باعث رد یا پذیرش خودکار فرد شود.
[ ]تولید سؤالهای اختصاصی بر اساس شرح شغل، رزومه، سطح نقش و مرحلهٔ مصاحبه[ ]دستهبندی سؤالها به فنی، رفتاری، موقعیتی، تجربهمحور و انگیزشی[ ]سؤالهای راستیآزمایی برای ادعاهای مهم رزومه: عددها، دستاوردها، نقش واقعی فرد و فناوریهای استفادهشده[ ]شناسایی موارد مشکوک یا مبهم و تولید سؤال follow-up برای روشنسازی آنها[ ]علامتگذاری شکافهای اطلاعاتی، تناقضهای زمانی، عنوانهای نامشخص و ادعاهای بدون شواهد؛ بدون برچسبزدن قطعی یا اتهام به کارجو[ ]تولید راهنمای ارزیابی برای هر سؤال: پاسخ قوی چه نشانههایی دارد و چه پاسخهایی نیاز به بررسی بیشتر دارند[ ]تولید سؤال متفاوت برای هر فرد، بدون تبعیض بر اساس جنسیت، سن، قومیت، مذهب، وضعیت تأهل، معلولیت یا ویژگیهای محافظتشده[ ]ثبت یادداشت و امتیاز مصاحبهکننده برای هر سؤال و ساخت جمعبندی نهایی[ ]امکان ویرایش، حذف یا اضافهکردن سؤال توسط کارفرما پیش از مصاحبه[ ]تولید brief مصاحبه برای کارفرما و نسخهٔ آمادهٔ چاپ یا اشتراکگذاری[ ]تشخیص تناسب واقعی با نقش از روی شواهد، نه صرفاً شباهت کلیدواژهها
[ ]داشبورد قیف جذب: تعداد اپلای، shortlist، مصاحبه، پیشنهاد و استخدام[ ]گزارش زمان رسیدگی، نرخ تبدیل و نقاط ریزش فرایند[ ]مقایسهٔ کیفیت منابع جذب و کانالهای انتشار آگهی[ ]پیشنهاد shortlist با امکان override کامل انسانی و توضیح دلیل هر پیشنهاد[ ]الگوهای استاندارد scorecard برای نقشهای مهندسی، محصول، طراحی، فروش و غیره[ ]همکاری همزمان مصاحبهکنندگان و جمعبندی ناشناس یا نامدار مطابق سیاست شرکت[ ]گزارش کیفیت سؤالها و همبستگی آنها با نتیجهٔ واقعی استخدام، بدون استفادهٔ نادرست یا تبعیضآمیز از دادههای تاریخی
[ ]API و webhook برای ATSها و ابزارهای منابع انسانی[ ]import/export استاندارد رزومه و فرصت با JSON/CSV/PDF[ ]اتصال تقویم برای زمانبندی مصاحبه و ارسال یادآوری[ ]ارسال ایمیل و پیامهای transactional با قالبهای قابل تنظیم[ ]صفحهٔ عمومی فرصت شغلی با SEO و schema مناسب[ ]گزارشهای سازمانی، صورتحساب تیمی و مدیریت چند شرکت
- رضایت روشن کارجو برای نمایش رزومه و اطلاعات شخصی به هر کارفرما
- امکان لغو دسترسی، انقضای لینک رزومه و حذف یا export دادهها
- جداسازی کامل tenantهای کارفرما و جلوگیری از نشت داده بین شرکتها
- ثبت audit log برای مشاهده، دانلود، امتیازدهی و تغییر وضعیت رزومهها
- رمزنگاری دادههای حساس، حداقلسازی داده و نگهداری محدود بر اساس نیاز واقعی
- توضیحپذیری امتیازهای AI، نمایش عدم قطعیت و امکان اصلاح خروجی توسط انسان
- تست امنیت، تست دسترسی نقشها، تست بار و پایش خطا پیش از انتشار هر فاز
برای اضافهکردن ایدههای بعدی از این قالب استفاده شود:
### [ ] نام قابلیت — فاز پیشنهادی: X
- مسئلهای که حل میکند:
- کاربر یا نقش استفادهکننده:
- جریان اصلی کاربر:
- دادهها و وابستگیهای لازم:
- ریسک حریم خصوصی/امنیت:
- معیار پذیرش:
- سؤالهای باز و موارد نیازمند شفافسازی:
جزئیات مرز داده Web در
apps/web/lib/data/README.md آمده است.
نقشهٔ سریع معماری، راهاندازی، استقرار و وضعیتهای شناختهشده در
PROJECT_KNOWLEDGE.md نگهداری میشود.