AI-powered recruitment and candidate assessment platform. Provides end-to-end hiring pipeline management with AI-driven resume parsing, coding assessments, video interviews, candidate shortlisting, and real-time communication for recruiters and candidates.
- Overview
- Tech Stack
- Project Structure
- Prerequisites
- Setup Instructions
- Environment Variables
- Running the Application
- Available Scripts
- Backend Services
- Architecture
- Routing
- State Management
- Contributing
- License
DeepScreen is a full-stack recruitment platform built with Next.js (App Router). It connects three backend services to deliver an AI-native hiring experience:
- Candidate portal -- Browse jobs, submit applications, take coding assessments, complete AI interviews, attend live video interviews, manage resumes, and message recruiters.
- Recruiter portal -- Post jobs, review applications, configure assessments and AI interviews, schedule live interviews, shortlist candidates via AI scoring, and chat with candidates.
- Staff/Organization portal -- Multi-tenant organization management with team roles, analytics, and centralized configuration for assessments, AI interviews, and live interviews.
Key capabilities include:
- AI-powered resume parsing via a dedicated microservice
- Automated candidate shortlisting with skill/experience/project scoring
- Coding assessments with a Monaco code editor and auto-grading
- AI interviews with speech recognition and natural language evaluation
- Live video interviews powered by LiveKit with screen sharing and chat
- Real-time messaging between recruiters and candidates
- Role-based dashboards with granular navigation
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| Language | JavaScript (JSX) |
| Styling | Tailwind CSS v4 |
| Animation | Motion (Framer Motion) |
| State Management | Zustand v5 + React Context |
| Server State | TanStack React Query v5 |
| Icons | React Icons (Heroicons v2) |
| Charts | Visx (by Airbnb) |
| Code Editor | Monaco Editor |
| PDF Generation | React-PDF |
| Video/RTC | LiveKit |
| Cryptography | @noble/curves, @noble/hashes |
| Package Manager | Bun (npm-compatible) |
deepscreen-client/
├── app/ # Next.js App Router pages
│ ├── auth/ # Authentication (login, register, verify, OAuth)
│ ├── candidate/ # Candidate portal (dashboard, applications, assessments, interviews, resumes)
│ ├── chats/ # Real-time messaging (candidate + recruiter)
│ ├── interview/ # Live video interview join flow
│ ├── jobs/ # Public job listings and apply flow
│ ├── organizations/ # Staff/org management (multi-tenant)
│ ├── recruiter/ # Recruiter portal (jobs, applications, assessments, interviews, analytics)
│ └── users/ # Profile and settings
├── components/
│ ├── ai-interview/ # AI interview components (candidate + recruiter)
│ ├── applications/ # Shared application UI components
│ ├── assessments/ # Coding assessment components
│ ├── auth/ # Auth showcase/decorative components
│ ├── display/ # Bar chart (Visx wrapper)
│ ├── interview/ # Live interview components (LiveKit room, scheduling)
│ ├── jobs/ # Job card and form components
│ ├── layout/ # App shell (sidebar, navbar, layout wrapper)
│ └── resume/ # Resume builder, review modal, templates
├── constants/ # Layout config, menu config, shared constants
├── context/ # Auth context (legacy) and Zustand auth store
├── public/ # Static assets (images, icons)
├── utils/ # API clients and configuration
│ ├── api.js # Main Django backend API client
│ ├── resume_api.js # Resume parsing microservice client
│ ├── interview_api.js # LiveKit/RTC API client
│ └── config.js # Centralized environment configuration
├── .env.local # Environment variables (see below)
├── next.config.mjs # Next.js configuration
├── tailwind.config.mjs # Tailwind CSS configuration
├── jsconfig.json # Path alias (@/ maps to ./)
└── package.json # Dependencies and scripts
- Node.js 18.17 or later (LTS recommended)
- Bun (recommended) or npm / yarn / pnpm
- Git (for version control)
- A running instance of the DeepScreen Django backend (default: http://localhost:8000)
- A running instance of the DeepScreen Rocket resume microservice (default: http://localhost:10000)
- A LiveKit server or cloud project (for video interviews)
-
Install Node.js Download and install the LTS version from https://nodejs.org
-
Install Bun (recommended -- faster installs and builds) Open PowerShell as Administrator and run:
powershell -c "irm bun.sh/install.ps1 | iex"Restart your terminal, then verify:
bun --versionAlternatively, use npm (comes with Node.js):
npm --version -
Clone and install dependencies
git clone <repository-url> cd deepscreen-client bun installor with npm:
npm install -
Configure environment Copy or edit
.env.localwith your backend URLs (defaults work for local development). -
Start the development server
bun run devor:
npm run dev
-
Install Node.js Using Homebrew:
brew install nodeOr download from https://nodejs.org
-
Install Bun (recommended)
curl -fsSL https://bun.sh/install | bashVerify:
bun --version -
Clone and install dependencies
git clone <repository-url> cd deepscreen-client bun install -
Configure environment Edit
.env.localwith your backend URLs. -
Start the development server
bun run dev
-
Install Node.js Using apt (Debian/Ubuntu):
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejsUsing dnf (Fedora):
sudo dnf install nodejs -
Install Bun (recommended)
curl -fsSL https://bun.sh/install | bashVerify:
bun --version -
Clone and install dependencies
git clone <repository-url> cd deepscreen-client bun install -
Configure environment Edit
.env.localwith your backend URLs. -
Start the development server
bun run dev
Create or edit .env.local in the project root:
# Main Django backend API
NEXT_PUBLIC_API_URL=http://localhost:8000
# LiveKit WebSocket URL (local or cloud)
NEXT_PUBLIC_LIVEKIT_URL=wss://your-livekit-instance.livekit.cloud
# Resume parsing microservice
NEXT_PUBLIC_RESUME_API_URL=http://localhost:10000
# RTC API endpoint (usually same as main API with /rtc suffix)
NEXT_PUBLIC_RTC_API_URL=http://localhost:8000/rtc
For production deployment, uncomment and update the Render URLs in .env.local.
bun run dev
Opens at http://localhost:3000. Hot reload is enabled.
bun run build
bun run start
bun run lint
| Script | Command | Description |
|---|---|---|
dev |
next dev |
Start development server with hot reload |
build |
next build |
Create optimized production build |
start |
next start |
Start production server |
lint |
next lint |
Run ESLint across the project |
The frontend communicates with three backend services:
| Service | Default URL | Purpose |
|---|---|---|
| DeepScreen Server | http://localhost:8000 | Main Django REST API (auth, jobs, applications, assessments, interviews, organizations, chat) |
| DeepScreen Rocket | http://localhost:10000 | Resume parsing microservice (PDF extraction, skill parsing) |
| LiveKit | wss://*.livekit.cloud | WebRTC video/audio for live interviews |
The main Django backend provides endpoints under /api/ (though the frontend strips this prefix in some API utilities). The chat API is prefixed with /chat/. The resume API operates independently on a separate port.
The application uses a dynamic layout system (LayoutWrapper) that selects between three shells based on the current route:
- No layout -- Full-screen pages (chat rooms, assessment sessions, resume builder, interview join)
- Navbar only -- Public pages (home, job listings, pricing, about)
- Sidebar + content -- Dashboard pages (all authenticated routes for candidates, recruiters, and staff)
The sidebar is role-aware, rendering different navigation items for CANDIDATE, RECRUITER, and STAFF roles.
Two parallel auth implementations exist (migration in progress):
- Zustand store (
context/authStore.js) -- Primary auth system. Handles login, registration, email verification, OAuth, and token management with JWT expiry checking. - React Context (
context/AuthContext.jsx) -- Legacy wrapper used by the root layout.
The application reads the JWT access token from localStorage and attaches it as a Bearer token to all API requests.
All API calls use native fetch wrapped in custom utilities. Each utility:
- Injects the JWT token from localStorage
- Sets
Content-Type: application/json(removed for FormData) - Parses JSON responses
- Throws structured errors with
{ status, message, errors }on non-2xx responses - Handles DRF-style validation error formatting
| Path | Description |
|---|---|
/ |
Home page (role-based redirect) |
/auth/login |
Login with email or Google OAuth |
/auth/register |
Multi-step registration |
/jobs |
Public job listings |
/jobs/[id] |
Job detail |
| Path | Description |
|---|---|
/candidate |
Dashboard |
/candidate/applications |
Track application pipeline |
/candidate/assessments |
Take coding assessments |
/candidate/ai-interview |
Complete AI interviews |
/candidate/interview |
Attend live video interviews |
/candidate/resumes |
Manage and build resumes |
| Path | Description |
|---|---|
/recruiter |
Dashboard with stats and funnel |
/recruiter/jobs |
Manage job postings |
/recruiter/applications |
Review and shortlist candidates |
/recruiter/assessments |
Configure coding assessments |
/recruiter/ai-interview |
Configure AI interviews |
/recruiter/interview |
Schedule live interviews |
/recruiter/analytics |
Hiring analytics |
| Path | Description |
|---|---|
/organizations/[slug] |
Organization dashboard |
/organizations/[slug]/jobs |
Org job management |
/organizations/[slug]/team |
Team and role management |
/organizations/[slug]/assesments |
Org assessment configs |
/organizations/[slug]/ai-interviews |
Org AI interview configs |
/organizations/[slug]/interviews |
Org live interview configs |
/organizations/[slug]/analytics |
Org analytics |
| Path | Description |
|---|---|
/chats/candidate |
Candidate messaging |
/chats/recruiter |
Recruiter messaging inbox |
/users/profile |
User profile |
/users/settings |
Account settings |
- Zustand v5 (
context/authStore.js) -- Primary auth and user state - React Context (
context/AuthContext.jsx) -- Legacy auth provider - TanStack React Query v5 -- Server state for data fetching and caching
- Component-local state with
useStateanduseEffectfor UI state
The useAuth() hook provides a unified interface to the auth store, returning { user, login, logout, register, ... }.
- Fork the repository
- Create a feature branch (
git checkout -b feature/your-feature) - Commit changes (
git commit -m "Add your feature") - Push the branch (
git push origin feature/your-feature) - Open a Pull Request
Please follow the existing code conventions:
- Use
"use client"for all pages and components (no Server Components) - Use
motion/reactfor animations - Follow Tailwind CSS utility patterns
- Use the existing API client utilities for all backend communication
Educational and Non-Commercial Use License
Copyright (c) 2026 BazilSuhail
DeepScreen Rocket -- Heavy-Lifting AI Microservice for Resume Parsing, Semantic Embedding, and AI-Powered Candidate Shortlisting.
Permission is hereby granted to any person obtaining a copy of this software and associated documentation files (the "Software"), to use, copy, modify, merge, and distribute the Software for educational and non-commercial purposes only, subject to the following conditions:
-
Non-Commercial Use Only -- This Software may not be used, in whole or in part, for commercial purposes, including but not limited to: selling, licensing, leasing, using the Software in a product or service that generates revenue, or deploying it as a hosted service for a fee.
-
Attribution -- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
No Warranty -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
For commercial licensing inquiries, contact the copyright holder.