Skip to content

M-R-Saad/UpLink

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

8 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

UpLink Logo

UpLink

πŸš€ Find Your Next Opportunity

A full-stack job board platform built with Next.js β€” connecting job seekers with employers through an SEO-optimized, server-rendered interface with in-app resume building, smart job alerts, and role-based dashboards.

Next.js React MongoDB TailwindCSS NextAuth License

Live Demo Β· Report Bug Β· Request Feature


πŸ“‘ Table of Contents


πŸ“– About The Project

UpLink is a full-stack MERN job board platform built with Next.js 16 (App Router). It connects job seekers with employers through a clean, modern interface that is fully server-rendered for SEO β€” meaning job listings and company profiles are indexed by Google.

The platform supports three distinct user roles, each with a dedicated dashboard:

πŸ‘€ Job Seeker 🏒 Employer πŸ›‘οΈ Admin
Browse & apply for jobs Post & manage job listings Platform-wide oversight
Build a resume in-app Track applicants per listing Approve company registrations
Set up smart job alerts Update applicant statuses Manage users, jobs & categories
Bookmark jobs for later View hiring analytics Moderate company reviews

The project leverages Next.js App Router capabilities β€” SSR/SSG for SEO, API route handlers (no separate backend), edge middleware for auth, generateMetadata for dynamic meta tags, and next/image for optimized image delivery.


✨ Key Features

πŸ” Job Seekers

  • Browse all jobs with search, filter (category, type, location, salary, remote), and sort
  • View SEO-optimized job detail pages (server-rendered)
  • Apply with in-app or uploaded resume + cover letter
  • Resume Builder β€” multi-step form with live preview β†’ generates downloadable PDF
  • Track all applications with real-time status updates
  • Bookmark/save jobs to apply later
  • Smart Job Alerts β€” set keywords & categories β†’ get email notifications via Resend when matching jobs are posted
  • Leave company reviews with ratings

🏒 Employers

  • Register a company with logo, description, industry, and social links
  • Post job listings with Tiptap rich text editor for descriptions
  • Manage listings β€” edit, pause, close, or delete
  • View all applicants per job with downloadable resumes
  • Update applicant status pipeline: pending β†’ reviewed β†’ shortlisted β†’ rejected β†’ hired
  • Employer dashboard with analytics β€” total jobs, applicants, and application trends (Recharts)

πŸ›‘οΈ Admins

  • Platform-wide dashboard with aggregate stats and charts
  • Manage all users (seekers + employers) β€” roles & status
  • Approve or reject company registrations
  • Moderate all job posts and company reviews
  • CRUD for job categories

πŸ› οΈ Tech Stack

Category Technology Purpose
Framework Next.js 16 (App Router) SSR/SSG, API routes, middleware, image optimization
UI Library React 19 Component-based UI
Styling Tailwind CSS v4 Utility-first CSS
Animations Framer Motion Page transitions & micro-interactions
Authentication NextAuth.js v5 (Auth.js) Credentials + Google OAuth, JWT sessions
Database MongoDB + Mongoose 9 Document-based data storage with ODM
Data Fetching TanStack Query v5 (client) / fetch (server) Caching, loading states, auto refetch
Forms React Hook Form + Zod Validated forms with shared client/server schemas
Rich Text Tiptap 3 Job description editor (bold, lists, links, headings)
Charts Recharts Dashboard analytics visualizations
State Management Zustand Resume builder & filter state
File Upload Cloudinary + Multer Resume PDFs & company logos
PDF Generation @react-pdf/renderer In-app resume β†’ downloadable PDF
Email Resend + React Email Job alert & welcome email notifications
Date Utilities date-fns Date formatting & manipulation
Notifications React Hot Toast Success/error toasts
Icons React Icons UI iconography
Deployment Vercel Full-stack hosting (frontend + API routes)

πŸš€ Getting Started

Prerequisites

  • Node.js β‰₯ 18.x
  • npm β‰₯ 9.x (or yarn / pnpm)
  • MongoDB instance (MongoDB Atlas recommended)
  • Google Cloud project with OAuth credentials
  • Cloudinary account (Sign up free)
  • Resend account (Sign up free)

Installation

  1. Clone the repository

    git clone https://github.com/yourusername/uplink.git
    cd uplink
  2. Install dependencies

    npm install
  3. Set up environment variables

    Create a .env file in the root directory (see Environment Variables below).

  4. Start the development server

    npm run dev

    The app will be available at http://localhost:3000.

Build for Production

npm run build
npm start           # Start the production server

πŸ” Environment Variables

Create a .env file in the project root with the following variables:

# ─── MongoDB ──────────────────────────────────────
MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/uplink?retryWrites=true&w=majority

# ─── NextAuth ─────────────────────────────────────
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=your_nextauth_secret_key

# ─── Google OAuth ─────────────────────────────────
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret

# ─── Cloudinary ───────────────────────────────────
CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secret
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=your_cloud_name
NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET=your_unsigned_preset

# ─── Resend (Email) ──────────────────────────────
RESEND_API_KEY=your_resend_api_key
RESEND_FROM_EMAIL=alerts@yourdomain.com

⚠️ Important: Never commit your .env file to version control. It is already included in .gitignore.


πŸ“ Project Structure

uplink/
β”œβ”€β”€ app/                                # Next.js App Router
β”‚   β”œβ”€β”€ layout.jsx                      # Root layout β€” fonts, providers, toaster
β”‚   β”œβ”€β”€ globals.css                     # Global styles & Tailwind imports
β”‚   β”œβ”€β”€ not-found.jsx                   # Custom 404 page
β”‚   β”œβ”€β”€ loading.jsx                     # Global loading UI
β”‚   β”‚
β”‚   β”œβ”€β”€ (public)/                       # 🌐 Public pages (SSR/SSG)
β”‚   β”‚   β”œβ”€β”€ layout.jsx                  #    Navbar + Footer wrapper
β”‚   β”‚   β”œβ”€β”€ page.jsx                    #    Home / Landing page (SSG)
β”‚   β”‚   β”œβ”€β”€ about/page.jsx             #    About page (SSG)
β”‚   β”‚   β”œβ”€β”€ jobs/
β”‚   β”‚   β”‚   β”œβ”€β”€ page.jsx               #    All jobs listing (SSR)
β”‚   β”‚   β”‚   └── [id]/page.jsx          #    Job detail (SSR + generateMetadata)
β”‚   β”‚   └── companies/
β”‚   β”‚       β”œβ”€β”€ page.jsx               #    All companies (SSR)
β”‚   β”‚       └── [id]/page.jsx          #    Company profile (SSR + generateMetadata)
β”‚   β”‚
β”‚   β”œβ”€β”€ (auth)/                         # πŸ”‘ Auth pages (centered layout)
β”‚   β”‚   β”œβ”€β”€ layout.jsx                  #    Centered card layout
β”‚   β”‚   β”œβ”€β”€ login/page.jsx             #    Login (credentials + Google)
β”‚   β”‚   └── register/page.jsx          #    Register (with role selection)
β”‚   β”‚
β”‚   β”œβ”€β”€ dashboard/                      # πŸ‘€ Job Seeker area
β”‚   β”‚   β”œβ”€β”€ layout.jsx                  #    Sidebar + content layout
β”‚   β”‚   β”œβ”€β”€ page.jsx                    #    Dashboard home β€” stats & activity
β”‚   β”‚   β”œβ”€β”€ applications/page.jsx       #    My applications tracker
β”‚   β”‚   β”œβ”€β”€ saved/page.jsx             #    Bookmarked jobs
β”‚   β”‚   β”œβ”€β”€ alerts/page.jsx            #    Job alert preferences
β”‚   β”‚   β”œβ”€β”€ profile/page.jsx           #    Edit profile, skills, experience
β”‚   β”‚   └── resume/page.jsx            #    Resume builder (multi-step)
β”‚   β”‚
β”‚   β”œβ”€β”€ employer/                       # 🏒 Employer area
β”‚   β”‚   β”œβ”€β”€ layout.jsx                  #    Sidebar + content layout
β”‚   β”‚   β”œβ”€β”€ dashboard/page.jsx         #    Employer dashboard β€” stats & charts
β”‚   β”‚   β”œβ”€β”€ company/page.jsx           #    Edit company profile
β”‚   β”‚   └── jobs/
β”‚   β”‚       β”œβ”€β”€ page.jsx               #    Manage posted jobs
β”‚   β”‚       β”œβ”€β”€ new/page.jsx           #    Post new job
β”‚   β”‚       └── [id]/
β”‚   β”‚           β”œβ”€β”€ edit/page.jsx      #    Edit existing job
β”‚   β”‚           └── applicants/page.jsx #    View applicants per job
β”‚   β”‚
β”‚   β”œβ”€β”€ admin/                          # πŸ›‘οΈ Admin area
β”‚   β”‚   β”œβ”€β”€ layout.jsx                  #    Sidebar + content layout
β”‚   β”‚   β”œβ”€β”€ page.jsx                    #    Admin dashboard β€” platform stats
β”‚   β”‚   β”œβ”€β”€ users/page.jsx             #    Manage all users
β”‚   β”‚   β”œβ”€β”€ companies/page.jsx         #    Approve/reject companies
β”‚   β”‚   β”œβ”€β”€ jobs/page.jsx              #    Moderate job posts
β”‚   β”‚   β”œβ”€β”€ categories/page.jsx        #    Manage job categories
β”‚   β”‚   └── reviews/page.jsx           #    Manage company reviews
β”‚   β”‚
β”‚   └── api/                            # ⚑ API Route Handlers
β”‚       β”œβ”€β”€ auth/[...nextauth]/route.js #    NextAuth handler
β”‚       β”œβ”€β”€ jobs/                       #    Jobs CRUD + apply
β”‚       β”œβ”€β”€ applications/              #    Application tracking
β”‚       β”œβ”€β”€ companies/                 #    Companies + reviews
β”‚       β”œβ”€β”€ profile/route.js           #    User profile
β”‚       β”œβ”€β”€ resume/route.js            #    Resume data
β”‚       β”œβ”€β”€ saved/route.js             #    Saved/bookmarked jobs
β”‚       β”œβ”€β”€ alerts/                    #    Job alert preferences
β”‚       β”œβ”€β”€ categories/               #    Job categories (admin)
β”‚       β”œβ”€β”€ users/                    #    User management (admin)
β”‚       β”œβ”€β”€ upload/route.js            #    Cloudinary file upload
β”‚       └── admin/                    #    Admin stats & company approval
β”‚
β”œβ”€β”€ components/                         # React Components
β”‚   β”œβ”€β”€ ui/                             #    Reusable primitives (Button, Input, Badge, Modal, etc.)
β”‚   β”œβ”€β”€ shared/                         #    Navbar, Footer, Sidebars, Providers
β”‚   β”œβ”€β”€ home/                           #    Landing page sections
β”‚   β”œβ”€β”€ jobs/                           #    JobCard, Filters, Search, ApplyModal
β”‚   β”œβ”€β”€ companies/                      #    CompanyCard, Header, Reviews
β”‚   β”œβ”€β”€ resume/                         #    ResumeBuilder, StepNav, Preview, PDF
β”‚   β”œβ”€β”€ dashboard/                      #    Seeker dashboard components
β”‚   β”œβ”€β”€ employer/                       #    Employer dashboard components
β”‚   └── admin/                          #    Admin dashboard components
β”‚
β”œβ”€β”€ lib/                                # Server-side utilities
β”‚   β”œβ”€β”€ auth.js                         #    NextAuth v5 config (providers, callbacks)
β”‚   β”œβ”€β”€ db.js                           #    MongoDB singleton connection
β”‚   β”œβ”€β”€ cloudinary.js                   #    Cloudinary upload helper
β”‚   β”œβ”€β”€ resend.js                       #    Resend email client
β”‚   β”œβ”€β”€ templates/                      #    React Email templates
β”‚   └── utils.js                        #    Shared utility functions
β”‚
β”œβ”€β”€ models/                             # Mongoose schemas (9 models)
β”œβ”€β”€ schemas/                            # Zod validation schemas (shared client + server)
β”œβ”€β”€ hooks/                              # Custom React hooks (TanStack Query wrappers)
β”œβ”€β”€ store/                              # Zustand stores (resume builder, filters)
β”œβ”€β”€ public/                             # Static assets & logos
β”œβ”€β”€ middleware.js                        # Next.js edge middleware (auth + role protection)
β”œβ”€β”€ next.config.mjs                     # Next.js configuration
β”œβ”€β”€ postcss.config.mjs                  # PostCSS configuration
β”œβ”€β”€ package.json
└── .gitignore

πŸ—ΊοΈ Pages & Routes

🌐 Public Pages β€” Server-Rendered for SEO

Page Route Rendering Description
Home / SSG Hero, featured jobs, top companies, how it works, stats
All Jobs /jobs SSR Full job listings with search, filter, and pagination
Job Detail /jobs/[id] SSR Individual job info, requirements, apply button β€” SEO meta
All Companies /companies SSR Browse all approved companies
Company Profile /companies/[id] SSR Company info, open positions, reviews β€” SEO meta
About /about SSG Platform story and mission

πŸ”‘ Auth Pages

Page Route Description
Login /login Credentials + Google OAuth sign-in
Register /register Account creation with role selection (Seeker / Employer)

πŸ‘€ Job Seeker Dashboard

Page Route Description
Dashboard /dashboard Overview stats, recent applications
My Applications /dashboard/applications All applications with status tracking
Saved Jobs /dashboard/saved Bookmarked jobs list
Job Alerts /dashboard/alerts Manage keyword/category alert preferences
Profile /dashboard/profile Edit personal info, skills, experience, education
Resume Builder /dashboard/resume Multi-step form β†’ live preview β†’ downloadable PDF

🏒 Employer Dashboard

Page Route Description
Dashboard /employer/dashboard Job stats, applicant chart, recent applications
Company Profile /employer/company Edit company info, logo, social links
Manage Jobs /employer/jobs All posted jobs with edit/pause/delete
Post New Job /employer/jobs/new Create job listing with Tiptap rich text editor
Edit Job /employer/jobs/[id]/edit Modify existing listing
View Applicants /employer/jobs/[id]/applicants Applicants per job with status management

πŸ›‘οΈ Admin Dashboard

Page Route Description
Dashboard /admin Platform-wide stats and analytics
Manage Users /admin/users All users with role/status controls
Manage Companies /admin/companies Approve or reject company registrations
Manage Jobs /admin/jobs Moderate all job posts
Manage Categories /admin/categories CRUD for job categories
Manage Reviews /admin/reviews Moderate company reviews

πŸ“‘ API Reference

All API routes live under app/api/ and are served from the same Next.js deployment β€” no separate backend server required.

Access Levels: 🌐 Public Β· πŸ‘€ Seeker Β· 🏒 Employer Β· πŸ›‘οΈ Admin Β· πŸ”’ Authenticated


πŸ”‘ Auth β€” /api/auth

Method Endpoint Access Description
* /api/auth/[...nextauth] 🌐 Public NextAuth.js handler (login, callback, session)

πŸ’Ό Jobs β€” /api/jobs

Method Endpoint Access Description
GET /api/jobs 🌐 Public Get all jobs (?search, ?category, ?type, ?location, ?salary, ?remote, ?page, ?limit)
POST /api/jobs 🏒 Employer Create new job post
GET /api/jobs/[id] 🌐 Public Get single job detail
PATCH /api/jobs/[id] 🏒 Employer (owner) Update job post
DELETE /api/jobs/[id] 🏒 Owner / πŸ›‘οΈ Admin Delete job post
POST /api/jobs/[id]/apply πŸ‘€ Seeker Apply for job

πŸ“‹ Applications β€” /api/applications

Method Endpoint Access Description
GET /api/applications πŸ‘€ Seeker Get my applications
PATCH /api/applications/[id] 🏒 Employer Update application status

🏒 Companies β€” /api/companies

Method Endpoint Access Description
GET /api/companies 🌐 Public Get all approved companies
POST /api/companies 🏒 Employer Create company profile
GET /api/companies/[id] 🌐 Public Get company detail + open jobs
PATCH /api/companies/[id] 🏒 Employer (owner) Update company
GET /api/companies/[id]/reviews 🌐 Public Get company reviews
POST /api/companies/[id]/reviews πŸ‘€ Seeker Submit a review

πŸ‘€ Profile β€” /api/profile

Method Endpoint Access Description
GET /api/profile πŸ‘€ Seeker Get my profile
PATCH /api/profile πŸ‘€ Seeker Update profile (skills, experience, education)

πŸ“„ Resume β€” /api/resume

Method Endpoint Access Description
GET /api/resume πŸ‘€ Seeker Get my resume data
POST /api/resume πŸ‘€ Seeker Save resume builder data

πŸ”– Saved Jobs β€” /api/saved

Method Endpoint Access Description
GET /api/saved πŸ‘€ Seeker Get bookmarked jobs
POST /api/saved πŸ‘€ Seeker Bookmark a job
DELETE /api/saved πŸ‘€ Seeker Remove bookmark

πŸ”” Job Alerts β€” /api/alerts

Method Endpoint Access Description
GET /api/alerts πŸ‘€ Seeker Get my job alerts
POST /api/alerts πŸ‘€ Seeker Create new alert (keywords + categories)
PATCH /api/alerts/[id] πŸ‘€ Seeker Update alert
DELETE /api/alerts/[id] πŸ‘€ Seeker Delete alert

πŸ“‚ Categories β€” /api/categories

Method Endpoint Access Description
GET /api/categories 🌐 Public Get all categories with job counts
POST /api/categories πŸ›‘οΈ Admin Create category
PATCH /api/categories/[id] πŸ›‘οΈ Admin Update category
DELETE /api/categories/[id] πŸ›‘οΈ Admin Delete category

πŸ‘₯ Users β€” /api/users

Method Endpoint Access Description
GET /api/users πŸ›‘οΈ Admin Get all users
PATCH /api/users/[id] πŸ›‘οΈ Admin Update role or status
DELETE /api/users/[id] πŸ›‘οΈ Admin Delete user

πŸ“Š Admin β€” /api/admin

Method Endpoint Access Description
GET /api/admin/stats πŸ›‘οΈ Admin Platform-wide stats for dashboard
PATCH /api/admin/companies/[id]/approve πŸ›‘οΈ Admin Approve or reject company registration

☁️ Upload β€” /api/upload

Method Endpoint Access Description
POST /api/upload πŸ”’ Auth Upload file to Cloudinary β€” returns URL

πŸ—„οΈ Database Models

The application uses 9 Mongoose models with a normalized MongoDB schema:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    User      │────▢│   Profile    β”‚     β”‚   Category   β”‚
β”‚              β”‚     β”‚  (seeker)    β”‚     β”‚              β”‚
β”‚  role:       β”‚     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚  jobseeker   β”‚                                 β”‚
β”‚  employer    β”‚     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”
β”‚  admin       │────▢│   Company    │────▢│     Job      β”‚
β”‚              β”‚     β”‚  (employer)  β”‚     β”‚              β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚                    β”‚                    β”‚
       β”‚             β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”
       β”‚             β”‚   Review     β”‚     β”‚ Application  β”‚
       β”‚             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β”œβ”€β”€β”€β”€β–Ά SavedJob (user + job ref)
       └────▢ JobAlert (keywords + categories)
Model Key Fields Description
User name, email, password, role, photoURL, isActive User accounts β€” jobseeker, employer, admin
Profile skills, experience[], education[], links Job seeker extended profile
Company name, logo, description, industry, size, isApproved Employer company profile with admin approval
Job title, description (HTML), category, type, salary, location, deadline Job listings posted by employers
Application job, applicant, resumeURL, coverLetter, status Job applications with status pipeline
SavedJob user, job Bookmarked jobs (user ↔ job reference pair)
JobAlert user, keywords[], categories[] Email alert subscriptions
Category name, slug, icon, jobCount Job categories with associated counts
Review company, user, rating, comment, isApproved Company reviews with admin moderation

πŸ” Authentication & Authorization

Auth Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Browser    │────▢│  NextAuth   │────▢│   MongoDB    │────▢│  JWT Token  β”‚
β”‚              β”‚     β”‚  Providers  β”‚     β”‚  User Lookup β”‚     β”‚  (session)  β”‚
β”‚  Login Form  β”‚     β”‚             β”‚     β”‚  or Create   β”‚     β”‚             β”‚
β”‚  Google SSO  β”‚     β”‚ credentials β”‚     β”‚              β”‚     β”‚ role stored β”‚
β”‚              β”‚     β”‚ google      β”‚     β”‚              β”‚     β”‚ in token    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
                                                                    β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”
                    β”‚                 Next.js Middleware                   β”‚
                    β”‚                                                      β”‚
                    β”‚  /dashboard/*  β†’ requires jobseeker role             β”‚
                    β”‚  /employer/*   β†’ requires employer role              β”‚
                    β”‚  /admin/*      β†’ requires admin role                 β”‚
                    β”‚  /login        β†’ redirects if already logged in      β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Providers

  • Credentials β€” Email + password (bcrypt hashed)
  • Google OAuth β€” One-click Google sign-in

Session Strategy

  • JWT-based sessions β€” role (jobseeker | employer | admin) embedded in the token
  • Server components: access session via auth() from lib/auth.js
  • Client components: access session via useSession() from next-auth/react

Route Protection

  • Edge Middleware (middleware.js) β€” intercepts requests before page loads, checks auth + role, redirects unauthorized users
  • API Routes β€” additionally verify session via auth() for protected endpoints

🧩 Key Technical Highlights

⚑ Next.js App Router

  • SSR on job & company pages for Google indexing
  • SSG on static pages (Home, About) for instant loads
  • generateMetadata for dynamic SEO meta tags
  • API route handlers β€” no separate Express server
  • Edge middleware for auth at the CDN level
  • next/image for optimized image delivery

πŸ“ Resume Builder

  • Multi-step form (Personal β†’ Experience β†’ Education β†’ Skills β†’ Links)
  • Live preview panel that updates in real-time
  • @react-pdf/renderer generates downloadable PDF
  • PDF uploaded to Cloudinary, URL stored in profile
  • State managed with Zustand store

πŸ”” Smart Job Alerts

  • Seekers define keywords + categories
  • New job posts trigger alert matching
  • Email notifications sent via Resend API
  • React Email templates for rich HTML emails

βœ… Shared Validation

  • Zod schemas in schemas/ folder
  • Shared between client (React Hook Form resolver) and server (API route validation)
  • Single source of truth for all validation rules
  • Type-safe error messages

🀝 Contributing

Contributions are welcome! Here's how you can help:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Please make sure to follow the existing code style, use the Zod schemas for any new validation, and test your changes thoroughly.


πŸ“„ License

Distributed under the MIT License. See LICENSE for more information.


UpLink

Built with ❀️ using Next.js, React, MongoDB, and Tailwind CSS

⬆️ Back to Top

About

πŸ’Ό A modern full-stack job board platform built with Next.js, featuring SEO-optimized job listings, in-app resume builder, smart job alerts, and role-based dashboards for job seekers, employers, and administrators.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors