A modern, intuitive web interface for AI-powered CV screening. Built with Next.js, TypeScript, and Tailwind CSS โ helping recruiters evaluate candidate fit against job descriptions with explainable AI scoring.
๐ฆ Repository: github.com/DangHuuLong/Ai-Recruiter-Mini-Frontend
๐ Backend Repository: github.com/DangHuuLong/Ai-Recruiter-Mini-Backend
AI Recruiter Mini Frontend is the user-facing layer of an intelligent CV screening platform. The dashboard enables recruiters to:
- Manage Candidates โ Store candidate profiles and resumes
- Create Job Descriptions โ Define positions with required and preferred skills
- Submit Applications โ Link candidates to job openings
- Run Evaluations โ Trigger AI-powered scoring against job requirements
- Review Results โ Analyze explainable scores, matched/missing skills, and interview questions
- Track Progress โ View application lifecycle and evaluation history
The frontend is built for clarity, consistency, and seamless integration with the NestJS backend API.
- ๐ Dashboard Navigation โ Organized sidebar with quick access to all modules
- ๐ฅ Candidate Management โ Create, view, and organize candidate profiles
- ๐ Resume Handling โ Upload and manage multiple resumes per candidate
- ๐ฏ Job Descriptions โ Define position requirements with structured skill extraction
- ๐ Applications โ Link candidates to jobs and track submission status
- โญ AI Evaluation โ Multi-criteria scoring with explainable breakdown
- ๐ Evaluation Results โ View scores, matched skills, and generated interview questions
- ๐จ Consistent UI โ Shared components and layouts for a cohesive experience
- โฟ Form Validation โ Client-side validation with clear error messages
- ๐ User Feedback โ Toast notifications for action results
- โก Responsive Design โ Works seamlessly on desktop and mobile devices
| Technology | Purpose |
|---|---|
| Next.js 14+ | React framework with App Router |
| TypeScript | Type-safe development |
| Tailwind CSS | Utility-first styling |
| React Hook Form | Form state management |
| Zod | Schema validation |
| Sonner | Toast notifications |
| @hookform/resolvers | Zod integration with React Hook Form |
src/
โโโ app/ # Next.js App Router routes
โ โโโ (dashboard)/ # Dashboard route group
โ โ โโโ dashboard/ # Dashboard overview page
โ โ โโโ candidates/ # Candidate list & detail pages
โ โ โโโ resumes/ # Resume list & detail pages
โ โ โโโ job-descriptions/ # Job description pages
โ โ โโโ applications/ # Application pages
โ โ โโโ evaluations/ # Evaluation pages
โ โโโ layout.tsx # Root layout with providers
โ
โโโ components/ # Reusable UI components
โ โโโ ui/ # Base UI primitives
โ โโโ common/ # Shared components (DataTable, EmptyState, ConfirmDialog)
โ โโโ layout/ # Layout components (AppShell, Sidebar, Header)
โ โโโ feedback/ # Status components (Loading, Toast, Empty)
โ โโโ forms/ # Form components (FileUploadInput)
โ
โโโ features/ # Business domain modules
โ โโโ files/ # File upload and management
โ โโโ candidates/ # Candidate feature module
โ โโโ resumes/ # Resume feature module
โ โโโ job-descriptions/ # Job description feature module
โ โโโ applications/ # Application feature module
โ โโโ evaluations/ # Evaluation feature module
โ
โโโ lib/ # Shared utilities and configuration
โ โโโ api/ # API client and endpoints
โ โโโ constants/ # App-wide constants
โ โโโ types/ # Shared TypeScript types
โ โโโ utils/ # Helper functions
โ โโโ validations/ # Zod validation schemas
โ
โโโ config/ # Application configuration
โ โโโ routes.config.ts # Route constants
โ โโโ navigation.config.ts # Navigation structure
โ โโโ env.config.ts # Environment variables
โ
โโโ providers/ # Global app providers
โโโ hooks/ # App-wide custom hooks
Each feature module (e.g., features/candidates/) follows this structure:
module-name/
โโโ api/ # API functions for the module
โโโ components/ # UI components specific to the module
โโโ hooks/ # Custom hooks for data fetching
โโโ types/ # TypeScript types
โโโ validations/ # Zod validation schemas (if needed)
Design Principle: Business logic is organized by feature, not by layer. Each module owns its API calls, components, hooks, and types. This keeps code colocated and makes features independently maintainable.
- Node.js 18+ โ Runtime environment
- npm or yarn โ Package manager
- Backend API running โ The frontend requires the NestJS backend at
http://localhost:3001/api
# Clone the repository
git clone https://github.com/DangHuuLong/Ai-Recruiter-Mini-Frontend.git
cd Ai-Recruiter-Mini-Frontend
# Install dependencies
npm installCreate a .env.local file at the project root:
NEXT_PUBLIC_API_BASE_URL=http://localhost:3001/api| Variable | Description | Example |
|---|---|---|
NEXT_PUBLIC_API_BASE_URL |
Backend API base URL | http://localhost:3001/api |
Note: Variables prefixed with
NEXT_PUBLIC_are exposed to the browser. Do not store secrets here.
# Development server with hot reload
npm run dev
# Production build
npm run build
# Start production server
npm run startThe application starts at http://localhost:3000.
| Script | Description |
|---|---|
npm run dev |
Start development server with hot reload |
npm run build |
Build for production |
npm run start |
Start production server |
npm run lint |
Run ESLint to check code quality |
npm run format |
Format code with Prettier |
npm run format:check |
Check formatting without changes |
npm run type-check |
Run TypeScript type checking |
All route paths and navigation items are centralized in src/config/:
routes.config.tsโ Stores shared route constantsnavigation.config.tsโ Defines dashboard navigation structure
This prevents hardcoding route strings throughout the app and keeps navigation data outside components.
The frontend uses a shared API client in src/lib/api/:
api-client.tsโ Core HTTP client for API communicationapi-endpoints.tsโ Backend endpoint constantsapi-types.tsโ Shared API response and request typesapi-error.tsโ Normalized error handling
Features call the shared API client instead of using fetch directly. This ensures consistent request handling, error normalization, and configuration across all modules.
The dashboard uses a consistent layout applied via src/app/(dashboard)/layout.tsx:
DashboardLayout
โโโ AppShell
โ โโโ Sidebar (Navigation)
โ โโโ Content Area
โ โโโ Header (Top bar)
โ โโโ MainContent (Page content with shared spacing)
โ โโโ Page Specific Content
All pages within the dashboard group automatically inherit this structure.
Form validation uses React Hook Form and Zod:
- Common rules โ Stored in
src/lib/validations/for reuse - Feature-specific schemas โ Stored in each feature's
validations/folder
This keeps validation logic out of components and reusable across forms.
Key shared components in src/components/:
| Component | Purpose |
|---|---|
DataTable |
Displays list data in a consistent table layout |
DetailPageLayout |
Wraps detail/show pages with consistent structure |
EmptyState |
Shows when no data is available |
LoadingState |
Displays loading skeleton screens |
ConfirmDialog |
Confirms destructive actions |
FileUploadInput |
Reusable file upload with drag-and-drop |
Toast |
User feedback notifications |
The frontend expects the backend to follow a consistent response contract:
{
"success": true,
"message": "OK",
"data": { ... },
"meta": { ... }
}{
"success": false,
"statusCode": 400,
"message": "Validation failed",
"errors": [],
"timestamp": "2024-01-01T00:00:00Z",
"path": "/api/..."
}The API client automatically parses and normalizes these responses and errors.
Manage candidate profiles:
- List all candidates
- Create new candidates
- View candidate details
- Update candidate information
Manage resume uploads:
- Upload resume files (PDF, DOCX)
- View resume details
- Link resumes to candidates
- Validate file types and size
Define job positions:
- Create job descriptions with skill requirements
- View job details
- Update job information
- Extract and structure job requirements
Manage candidate applications:
- Create applications (link Candidate + Job + Resume)
- View application status
- Update application state
- Track application timeline
Run and view AI evaluations:
- Trigger evaluation for an application
- View evaluation results with multi-criteria scoring
- Review matched and missing skills
- View generated interview questions
- Access evaluation breakdown and explanations
- Use shared layout components for pages
- Reuse table and detail components for data display
- Apply consistent spacing and padding via Tailwind's theme tokens
- Use shared validation error messages
- Use skeleton loaders when layout is stable
- Use loading spinners for overlays or uncertain layouts
- Show progress feedback for file uploads
- Show form validation errors near the relevant fields
- Use toast notifications for action success/failure
- Display empty states when no data exists
- Provide clear error messages from API responses
- Use toast notifications for quick feedback on actions
- Confirm destructive actions (delete, reject, etc.) with dialogs
- Show loading states during API calls
- Provide clear empty states with optional action buttons
Forms use React Hook Form with Zod schemas for validation:
// Define validation schema
import { z } from 'zod';
const candidateSchema = z.object({
firstName: z.string().min(1, 'First name is required'),
email: z.string().email('Invalid email address'),
});
// Use in form
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
const form = useForm({
resolver: zodResolver(candidateSchema),
});Frontend validation provides instant user feedback. The backend remains the source of truth for validation.
The FileUploadInput component handles file selection with:
- Click-to-upload
- Drag-and-drop support
- File type validation (PDF, DOCX by default)
- File size validation (5 MB maximum)
- Visual feedback
Features that need file uploads wrap this component with their own upload logic and API calls.
Current test coverage focus areas:
- API client and error handling
- Form validation schemas
- Navigation active state logic
- Component rendering and interactions
Run tests:
npm run test
npm run test:watch| Area | Status |
|---|---|
| Project setup & folder structure | โ Complete |
| Navigation & routing | โ Complete |
| Dashboard layout | โ Complete |
| Shared components | โ Complete |
| API client configuration | โ Complete |
| Form validation | โ Complete |
| Candidate feature | ๐ In progress |
| Resume feature | ๐ In progress |
| Job description feature | ๐ In progress |
| Application feature | ๐ In progress |
| Evaluation feature | ๐ In progress |
- ๐ Authentication and authorization
- ๐ง Email notifications for application updates
- ๐ Analytics and reporting dashboard
- ๐ Multi-language support (i18n)
- ๐ Advanced search and filtering
- ๐ฑ Mobile app version
- ๐ฏ Keyboard shortcuts for power users
- โฟ Enhanced accessibility features
- ๐งช Expanded test coverage
- ๐ณ Docker setup for development
Detailed documentation is available in the docs/ folder:
FRONTEND_CONFIGURATION.mdโ Routes, API, validation, components, and folder structureFRONTEND_FOLDER_STRUCTURE.mdโ Comprehensive guide to each directory
- Create a new folder under
src/features/module-name/ - Add subdirectories:
api/,components/,hooks/,types/ - Create your API functions in
api/ - Create your custom hooks in
hooks/ - Create your UI components in
components/ - Export public interfaces from
index.ts
- Create a folder under
src/app/(dashboard)/feature-name/ - Add a
page.tsxfile - Use the
DetailPageLayoutor existing layout structure - Import and use feature components
- Call feature API functions via custom hooks
- Create
src/features/feature-name/validations/ - Define Zod schemas
- Use in form with
zodResolver - Import validation from feature folder in form component
When contributing to this project:
- Follow the folder structure โ Place code in the appropriate module
- Use TypeScript โ All code should be typed
- Reuse components โ Check if a shared component exists before creating new UI
- Keep validation centralized โ Don't write validation logic in components
- Normalize API calls โ Use the shared API client
- Run linting and formatting before committing:
npm run lint
npm run formatFor issues, questions, or feature requests:
- GitHub Issues: Create an issue
- Backend Repo: Ai-Recruiter-Mini-Backend
This project is part of the AI Recruiter Mini suite. Refer to the LICENSE file in the repository for details.
Built with โค๏ธ by DangHuuLong using Next.js, TypeScript & Tailwind CSS
Frontend Repository โข
Backend Repository