(This project is not for production) please review the code before u deploy it or add more features.
TalentHub is a role-based hiring platform built with Next.js and Supabase. It supports recruiter workflows (create/manage jobs and review applications) and candidate workflows (apply to jobs and track status updates).
- Role-based experience for recruiters and candidates
- Recruiter dashboard for job lifecycle management (
Draft,Active,Closed) - Candidate dashboard for application tracking (
pending,reviewing,rejected,accepted) - Resume upload flow backed by Supabase Storage
- Supabase Row Level Security (RLS) policies for secure data access
- Modern UI with Tailwind CSS + shadcn/ui components
- Next.js 16 (App Router)
- React 19 + TypeScript
- Supabase (
@supabase/supabase-js,@supabase/ssr) - Tailwind CSS 4
- ESLint + Prettier
- Node.js 20+
- npm 10+
- A Supabase project
- Install dependencies:
npm install- Create an environment file at the project root:
cp .env.example .envIf .env.example does not exist yet, create .env manually with:
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY=
NEXT_PUBLIC_SUPABASE_RESUME_BUCKET=resumes- Set up the database schema in Supabase:
- Open the Supabase SQL editor
- Run the SQL script from
database/setup.sql
This script creates tables, enums, triggers, RLS policies, and the resumes storage bucket.
- Start the development server:
npm run dev- Open the app:
http://localhost:3000
npm run dev– start local development servernpm run build– create production buildnpm run start– run the production buildnpm run lint– run ESLintnpm run format– format files with Prettiernpm run format:check– check formatting without writing changes
/– marketing/landing page/auth/signin,/auth/signup– authentication/recruiter– recruiter dashboard/candidate– candidate dashboard/settings– profile/settings page
Core entities:
ProfileDepartmentJobJobApplication
The SQL setup includes triggers for:
- Auto-updating timestamps
- Syncing department catalog entries from jobs
- Keeping
jobApplicationCountin sync
- Environment variables are required at startup; the app throws if Supabase URL or publishable key is missing.
- Resume bucket defaults to
resumesunless overridden byNEXT_PUBLIC_SUPABASE_RESUME_BUCKET.