尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Verified candidates. Predictable joining. Built for GCCs and quick hirers.
Readyhire lists only candidates whose notice period, resignation and current offer letter have been verified. Recruiters see when a candidate can actually join, how many active offers they hold and whether they've committed to a role. Every application gets an accept or a reject with a reason, and the platform tracks each hire from application to joining.
Three modules: Candidate, Recruiter and Admin.
Next.js 16 (App Router, Server Actions) · React 19 · TypeScript · Tailwind CSS 4 · PostgreSQL with Prisma 7 · S3-compatible document storage · Resend or SMTP email · Zod · Vitest and Playwright · GitHub Actions.
The production setup (Vercel + Supabase + AWS S3, all in Mumbai, + Resend) is described step by step in docs/deployment.md. Security design: SECURITY.md.
Requires Node.js 22 (see .nvmrc) and Docker for Postgres (or any PostgreSQL 15+).
cp .env.example .env
docker compose up -d # PostgreSQL on localhost:5432
npm install
npm run setup # apply migrations, generate the Prisma client, load demo data
npm run dev # http://localhost:3000
In development, documents are stored in ./storage and emails are printed to the terminal (look for [email]), so
nothing external is needed. Email confirmation and password-reset links appear there too.
Every seeded account uses the password Readyhire@123. The sign-in page lists them in development.
| Role | |
|---|---|
| Admin | [email protected] |
| Recruiter, approved (Northwind GCC) | [email protected] |
| Recruiter, approved, overdue replies | [email protected] |
| Recruiter, awaiting approval | [email protected] |
| Candidate, verified and committed | [email protected] |
| Candidate, offer extended | [email protected] |
| Candidate, verification pending | [email protected] |
| Candidate, changes requested | [email protected] |
| Candidate, brand new | [email protected] |
| Candidate, restricted (can't sign in) | [email protected] |
Seed dates are relative to when you run the seed, so there are always upcoming interviews, fresh applications and one
overdue reply. npm run db:seed resets everything (it refuses to run against production).
| Rule | Enforcement |
|---|---|
| Only verified candidates are listed | approveCandidate (src/actions/admin.ts) requires all three documents verified; the talent pool and applyToJob admit only verified candidates (src/lib/candidate.ts). |
| Verified details can't change silently | Notice details, documents and current company lock while verification is pending or done; changing them means reopening verification, which hides the profile. |
| Recruiters use a company domain | Personal and disposable mailboxes are blocked, the domain must match the company website (src/lib/domain.ts), the inbox must be confirmed, and an admin approves the account. |
| Every application gets a response | Accepting needs a message; rejecting needs a category plus a 15+ character explanation. Replies are due in 72 hours, reminders go out 24 hours before, and overdue recruiters can't post jobs (src/actions/recruiter.ts, src/app/api/cron/reminders). |
| One commitment at a time | A single unique committedApplicationId per candidate, set with a conditional update; committed candidates can't apply elsewhere; releases are logged and shown to recruiters. |
| Offer-shopping visibility | Active offers = declared offers still held or accepted + offers extended on Readyhire, with how many are backed by verified proof (summarizeCandidate). |
| Joining is tracked | Offered applications end as Joined or Did not join; recruiters can report ghosting; upheld reports appear on the candidate's profile. |
| Documents stay private | Direct-to-bucket uploads with pre-signed URLs, content (magic-byte) checks, and 60-second signed download links for the owner and admins only (src/actions/documents.ts, src/lib/storage). |
| Resumes reach only chosen recruiters | The optional PDF resume isn't in the talent pool; besides the candidate and admins, only approved recruiters whose jobs the candidate applied to can open it (src/app/api/resumes/[id]/route.ts). |
Verification: NOT_SUBMITTED → PENDING → VERIFIED
↘ REJECTED → (fix & resubmit) → PENDING
VERIFIED → (candidate reopens) → NOT_SUBMITTED
Application: APPLIED ─┬→ ACCEPTED → INTERVIEWING → OFFERED ─┬→ JOINED
│ └→ NOT_JOINED
└→ REJECTED (recruiter may reject at any open stage, with a reason)
Any open stage → WITHDRAWN (candidate, with a reason)
├── prisma/ # schema, migrations, demo seed
├── scripts/ # create-admin, Vercel build (with migrations), script helpers
├── src/
│ ├── actions/ # Server Actions: auth, candidate, documents, recruiter, admin
│ ├── app/
│ │ ├── (public)/ # landing, sign-in/up, email verification, password reset, terms, privacy
│ │ ├── candidate/ # dashboard, verification, jobs, applications, offers, profile, account
│ │ ├── recruiter/ # dashboard, applications, jobs, verified talent, account
│ │ ├── admin/ # dashboard, verifications, recruiters, applications, reports, users, audit log
│ │ └── api/ # health, cron reminders, document links, local storage stand-in
│ ├── components/ # UI primitives, forms, uploader, trust-signal panels
│ ├── lib/ # env, auth/session, db, storage, email, rate limiting, rules and formatting
│ └── proxy.ts # route protection + security headers (Next.js 16 "proxy", formerly middleware)
├── e2e/ # Playwright end-to-end tests
├── docs/deployment.md # production setup
├── Dockerfile # image for non-Vercel hosts
└── vercel.json # Mumbai region + hourly reminder cron
| Command | What it does |
|---|---|
npm run dev | Dev server on port 3000 |
npm run setup | Apply migrations, generate the Prisma client, load demo data |
npm run db:migrate -- --name <change> | Create and apply a migration after editing the schema |
npm run db:seed · npm run db:reset | Reset demo data · drop, re-migrate and re-seed (never in prod) |
npm run db:deploy | Apply pending migrations (production) |
npm run create-admin -- --email … --name … | Create an admin account (any environment) |
npm run lint · npm run typecheck · npm run format | Code quality |
npm test | Unit tests (Vitest) |
npm run test:e2e | End-to-end tests (Playwright) against a production build |
npm run build · npm start | Production build and server |
npm test # unit tests for the business rules
npx playwright install chromium # first time only
npm run test:e2e
The end-to-end suite builds the app and runs it against its own database (readyhire_e2e on the local Postgres,
created automatically; override with E2E_DATABASE_URL), local storage and a file-based email outbox, so it can follow
confirmation and reset links. It covers the company-domain check, email verification, password reset, verification
gating, upload content checks, the mandatory reply with a reason, single-role commitment, overdue reminders, document
and resume access control and the security headers.
CI (.github/workflows/ci.yml) runs formatting, lint, type checks, unit tests and the build; a migration drift check
and the end-to-end suite against Postgres; and a Docker image build.
##We are enhancing the experience for the users by integrating HireFlow AI (Coming soon)
-- Team ReadyHire