You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
QuickHire is a monorepo containing two independently runnable applications:
App
Directory
Description
Frontend
/ (root)
Next.js 16 App Router, server-rendered React UI
Backend
/server
Express.js 5 REST API with MongoDB and JWT auth
Key features:
Public job board with full-text search and filtering by category, location, and employment type
Employer dashboard with job management, applicant tracking with status labels (Pending, Reviewed, Shortlisted, Rejected), messaging inbox, and a schedule calendar
Role-based access control with three roles: jobseeker, employer, admin
Stateless JWT authentication via Bearer tokens, with Next.js Edge Middleware protecting dashboard routes before page render
In-browser image cropping for company logos with base64 storage (up to 2 MB)
Newsletter subscriber management
Rate limiting (100 requests per 15-minute window per IP) and secure HTTP headers via Helmet
Frontend origin allowed by CORS (e.g. http://localhost:3000)
PORT
No
5000
Port the Express server listens on
Frontend — .env.local
Create a file at .env.local in the root directory:
NEXT_PUBLIC_API_URL=http://localhost:5000/api
Variable
Required
Default
Description
NEXT_PUBLIC_API_URL
No
http://localhost:5000/api
Express API base URL used by the browser
Getting Started
1. Clone the repository
git clone https://github.com/shoaibramim/QuickHire.git
cd QuickHire
2. Install dependencies
Install frontend and backend dependencies separately:
# Frontend (from the root directory)
npm install
# Backendcd server
npm install
cd ..
3. Configure environment variables
Create server/.env and .env.local as described in the Environment Variables section above.
4. (Optional) Seed the database
Populate the database with sample employers, jobs, applications, messages, and schedule events:
cd server
npm run seed
This drops all existing collections and inserts fresh demo data including 10 employer accounts, jobs across 8 categories, applications, messages, and schedule events.
5. Start the development servers
Open two terminal windows and run each command in a separate terminal:
# Terminal 1 — Backend (from the /server directory)cd server
npm run dev
# Terminal 2 — Frontend (from the root directory)
npm run dev
Static logo key; overridden by postedBy.companyLogo at query time
tags
String[]
Category tags used for filtering
description
String
Rich text HTML
postedBy
ObjectId (User)
Reference to the employer
status
Active | Closed | Draft
Default: Active
featured
Boolean
Default: false
applicantCount
Number
Incremented on each application submission
Application
Field
Type
Notes
jobId
ObjectId (Job)
Required
name, email, resumeLink
String
Required; resumeLink must be a valid http/https URL
coverNote
String
Optional
status
Pending | Reviewed | Shortlisted | Rejected
Default: Pending
Message
Field
Type
Notes
ownerId
ObjectId (User)
Employer who owns this inbox message
from
String
Sender display name
avatar
String
Optional sender avatar URL
preview
String
Short message preview
fullText
String
Optional full message body
unread
Boolean
Default: true
time
String
Human-readable timestamp string (e.g. "2h ago")
ScheduleEvent
Field
Type
Notes
ownerId
ObjectId (User)
Employer owner
title
String
Required
time
String
e.g. "10:00 AM"
date
String
e.g. "Mar 2, 2026"
type
Interview | Meeting | Review
Required
withPerson
String
Optional — name of the other participant
Subscriber
Field
Type
Notes
email
String
Required, unique, lowercase
subscribedAt
Date
Set automatically on creation
Authentication
Strategy: Stateless JWT via Bearer token in the Authorization header
Login flow:POST /api/auth/login returns a signed JWT valid for 15 minutes (configurable via JWT_ACCESS_EXPIRES_IN)
Token storage: Browser localStorage under the key qh_token
Protected API routes: Include the token in every request as Authorization: Bearer <token>
Protected page routes: Next.js Edge Middleware (src/middleware.ts) checks for the token in the qh_token cookie or the Authorization header before the page renders; unauthenticated requests are redirected to /?signin=required
Role enforcement: The requireRole(["employer", "admin"]) middleware returns 403 for users with insufficient permissions
Password hashing: bcryptjs with a cost factor of 12
Deployment
Backend (Vercel)
The server/ directory includes a vercel.json that configures the Express app as a Vercel serverless function. All requests are routed through server/api/index.ts.
Set the same environment variables listed in server/.env as Vercel project environment variables.
Frontend (Vercel)
Deploy the root directory as a standard Next.js project on Vercel. Set NEXT_PUBLIC_API_URL to the deployed backend URL.
About
QuickHire is a simple, production-ready job board application built with Next.js (App Router), TypeScript, and TailwindCSS. It provides a clean, professional interface for users to browse and apply for jobs, and an admin dashboard to manage job postings.