Open-source platform for conducting AI-powered mock interviews with real-time evaluation and analytics.
Before contributing, ensure you have:
- Node.js >= 18.0.0
- pnpm >= 9.0.0 (This project uses pnpm as the package manager)
- Docker (Optional, for containerized setup)
- PostgreSQL (Optional, if not using Docker)
# Fork the repository on GitHub, then clone your fork
git clone https://github.com/manu0990/evalu8.git
cd evalu8Choose one of the following setup methods:
# Start all services (postgres, web, and ws-server)
docker compose up
# Start only specific services
docker compose up web # Only web app (+ postgres)
docker compose up ws-server # Only WebSocket server (+ postgres)
# Run in detached mode with (background)
docker compose up -d # All services
# Rebuild and start individual services
docker compose up --build web
docker compose up --build ws-server
# Stop all services
docker compose downNote: When you start
weborws-server, Docker Compose automatically startspostgresas a dependency.
# Clone the repository
git clone https://github.com/manu0990/evalu8.git
cd evalu8
# Install dependencies
pnpm install
# Get a db connection (install PostgreSQL locally or use a cloud service)
# To use Docker to run PostgreSQL:
docker run -d \
--name evalu8-db \
-e POSTGRES_USER=evalu8_user \
-e POSTGRES_PASSWORD=evalu8_password \
-e POSTGRES_DB=evalu8_db \
-p 5432:5432 \
postgres:alpine
# Set up environment variables
cp .env.example .env # Edit .env with your actual values
# Run database migrations
pnpm db:migrate
# Generate Prisma client
pnpm db:generate
# Start all development servers
pnpm devAccess the applications:
- Web App: http://localhost:3000
- WebSocket Server: ws://localhost:8080
evalu8/
βββ apps/
β βββ web/ # Next.js frontend (Port 3000)
β β βββ src/
β β β βββ app/ # Next.js App Router
β β β βββ components/ # React components
β β β βββ lib/ # Utilities & configurations
β β βββ package.json
β βββ ws-server/ # WebSocket server (Port 8080)
β βββ src/
β βββ package.json
βββ docker/
β βββ Dockerfile.web # Docker configuration for web app
β βββ Dockerfile.ws # Docker configuration for WebSocket server
βββ packages/
β βββ db/ # Prisma ORM & Database
β β βββ prisma/
β β β βββ schema.prisma # Database schema
β β β βββ migrations/ # Database migrations
β β βββ package.json
β βββ ui/ # Shared UI components (shadcn/ui)
β βββ eslint-config/ # Shared ESLint configurations
β βββ typescript-config/ # Shared TypeScript configurations
β βββ tailwind-config/ # Shared Tailwind CSS setup
βββ .env.example # Environment variables template (root)
βββ .env # Your environment variables (root, git-ignored)
βββ docker-compose.dev.yaml # Docker Compose configuration
βββ package.json # Root package configuration
βββ pnpm-workspace.yaml # pnpm workspace configuration
βββ turbo.json # Turborepo configuration
-
apps/web- Next.js 15.4.2 frontend with React 19.1.0- AI-powered interview interface and evaluation dashboard
- NextAuth.js authentication with Google & GitHub
- Modern UI with Tailwind CSS v4 and shadcn/ui components
- Theme support (dark/light mode)
-
apps/ws-server- WebSocket server for real-time communication- Handles real-time interview sessions
- Built with Node.js and
wslibrary (v8.18.3)
-
packages/db- Database layer with Prisma ORM 6.13.0- PostgreSQL configuration and migrations
- Type-safe database client
-
packages/ui- Shared React component library- Reusable components built with Radix UI
- Consistent styling with Tailwind CSS
-
packages/eslint-config- ESLint configurations for code quality -
packages/typescript-config- TypeScript 5.8.2 configurations -
packages/tailwind-config- Shared Tailwind CSS 4.1.5 setup
Each package/app is 100% TypeScript with strict type checking.
- Next.js 15.4.2 with App Router
- React 19.1.0 with TypeScript 5.8.3
- Tailwind CSS 4.1.5 for styling
- shadcn/ui - Custom component library built on Radix UI
- NextAuth.js 4.24.11 for authentication
- Node.js WebSocket server
- ws 8.18.3 for WebSocket communication
- PostgreSQL database
- Prisma ORM 6.13.0
- Turborepo 2.5.6 for monorepo management
- pnpm 9.0.0 for package management
- ESLint 9.31.0 for code linting
- Prettier 3.6.2 for code formatting
- TypeScript 5.8.3 with strict mode
- Axios 1.11.0 for HTTP requests
- React Hook Form + Zod for form handling
- Lucide React 0.536.0 for icons
- bcryptjs for password hashing
- next-themes 0.4.6 for theme support
This project uses the following development utilities:
- TypeScript 5.8.3 - Static type checking with strict mode
- ESLint 9.31.0 - Code linting and quality checks
- Prettier 3.6.2 - Automatic code formatting
- Turborepo 2.5.6 - Efficient monorepo task management with caching
- pnpm 9.0.0 - Fast, disk space efficient package manager
- Prisma 6.13.0 - Next-generation ORM for database management
# Start all development servers
pnpm dev
# Build all apps and packages
pnpm build
# Lint all code
pnpm lint
# Type check all packages
pnpm check-types
# Format code with Prettier
pnpm formatBuild only a specific application from the root directory:
# Build only the web app
pnpm build --filter=web
# Build only the WebSocket server
pnpm build --filter=ws-server
# Build only the database package
pnpm build --filter=@repo/db
# Build only the UI package
pnpm build --filter=@repo/uiRun a specific app in development mode:
# Run only the web app
pnpm dev --filter=web
# Run only the WebSocket server
pnpm dev --filter=ws-server# Run migrations in development
pnpm db:migrate
# Deploy migrations to production
pnpm db:migrate:deploy
# Generate Prisma client
pnpm db:generate
# Push schema changes directly to database
pnpm db:push
# Open Prisma Studio (database GUI)
pnpm db:studio
# Reset database and run all migrations
pnpm db:resetTip: Use Turborepo filters to run commands on specific packages.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Client (Browser) β
β http://localhost:3000 β
ββββββββββββββββββ¬βββββββββββββββββββββββ¬ββββββββββββββββββββββ
β β
HTTP/HTTPS Requests WebSocket Connection
β β
βββββββββΌββββββββ ββββββββΌβββββββ
β Next.js App β β WS Server β
β (Port 3000) β β (Port 8080) β
β β β β
β - App Router β β - Real-time β
β - NextAuth β β - Sessions β
β - API Routes β β β
βββββββββ¬ββββββββ ββββββββ¬βββββββ
β β
βββββββββββββ¬βββββββββββ
β
Prisma Client
β
ββββββββΌβββββββ
β PostgreSQL β
β Database β
β β
β - Users β
β - Sessions β
β - Meetings β
βββββββββββββββ
Shared Packages:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β @repo/db β @repo/ui β @repo/eslint-config β etc. β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
-
Web Application (
apps/web)- Next.js 15 with App Router
- Server-side rendering and API routes
- NextAuth.js for authentication
- Communicates with PostgreSQL via Prisma
-
WebSocket Server (
apps/ws-server)- Real-time bidirectional communication
- Handles live interview sessions
- Event-driven architecture
-
Database Layer (
packages/db)- Prisma ORM for type-safe queries
- PostgreSQL for data persistence
- Centralized schema and migrations
-
Shared Packages
@repo/ui- Reusable React components@repo/eslint-config- Code quality rules@repo/typescript-config- TS configurations@repo/tailwind-config- Styling setup
All environment variables should be defined in the root .env file:
# Database Connection
DATABASE_URL="postgresql://evalu8_user:evalu8_password@localhost:5432/evalu8_db"
# NextAuth Configuration
NEXTAUTH_URL="http://localhost:3000"
NEXTAUTH_SECRET="your-secret-key-here" # Generate with: openssl rand -base64 32
# OAuth Providers (Optional)
GOOGLE_CLIENT_ID="your-google-client-id"
GOOGLE_CLIENT_SECRET="your-google-client-secret"
GITHUB_CLIENT_ID="your-github-client-id"
GITHUB_CLIENT_SECRET="your-github-client-secret"
# WebSocket Server
WS_PORT=8080
# Environment
NODE_ENV="development"| Variable | Description | Required |
|---|---|---|
DATABASE_URL |
PostgreSQL connection string | β Yes |
NEXTAUTH_SECRET |
Secret for NextAuth.js session encryption | β Yes |
NEXTAUTH_URL |
Base URL for NextAuth callbacks | β Yes |
GOOGLE_CLIENT_ID |
Google OAuth client ID | |
GOOGLE_CLIENT_SECRET |
Google OAuth client secret | |
GITHUB_CLIENT_ID |
GitHub OAuth client ID | |
GITHUB_CLIENT_SECRET |
GitHub OAuth client secret | |
WS_PORT |
WebSocket server port | β Yes |
NODE_ENV |
Environment mode (development/production) | β Yes |
- β
Never commit
.envfiles - They are in.gitignore - β
Always commit
.env.examplefiles - Templates for other developers - β
Use strong secrets - Generate with
openssl rand -base64 32 - β Different values per environment - Dev, staging, and prod should differ
- β Rotate secrets regularly - Change secrets periodically
We welcome contributions! Please follow these steps:
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature - Make your changes and commit:
git commit -am 'Add new feature' - Push to the branch:
git push origin feature/your-feature - Open a Pull Request
Read our detailed Contribution Guidelines before getting started.
This project is licensed under the ISC License.
- Turborepo - Monorepo management
- Next.js - React framework
- Prisma - Database ORM
- NextAuth.js - Authentication
- Tailwind CSS - Styling
- shadcn/ui - UI components
- WebSocket (ws) - Real-time communication
- pnpm - Package manager
Turborepo can use Remote Caching to share build caches across machines:
# Authenticate with Vercel (free for all plans)
turbo login
# Link your Turborepo to Remote Cache
turbo link