A modern job platform connecting undergraduate students with internships and entry-level positions.
- π Create a professional profile
- π Browse internships and entry-level jobs
- π One-click job applications
- π Track application status in real-time
- π’ Company profile management
- π Post and manage job listings
- π₯ Review candidate applications
- β Accept/reject applicants
| Technology | Purpose |
|---|---|
| Next.js 14 | React framework with App Router |
| TypeScript | Type safety |
| Tailwind CSS | Utility-first styling |
| Supabase Auth | Authentication |
| TanStack Query | Server state management |
| React Hook Form | Form handling |
| Zod | Schema validation |
| Technology | Purpose |
|---|---|
| NestJS | Node.js framework |
| Prisma 7 | Database ORM |
| PostgreSQL | Database (via Supabase) |
| Passport JWT | JWT authentication |
| class-validator | DTO validation |
| Service | Purpose |
|---|---|
| Supabase | Auth, Database, Storage |
gradwork/
βββ frontend/ # Next.js 14 application
β βββ src/
β β βββ app/ # App Router pages
β β β βββ (auth)/ # Auth pages (login, register)
β β β βββ (dashboard)/ # Protected dashboard pages
β β β βββ page.tsx # Landing page
β β βββ components/ # Reusable UI components
β β βββ hooks/ # Custom React hooks
β β βββ lib/ # Utilities (API client, Supabase)
β βββ package.json
β
βββ backend/ # NestJS application
β βββ src/
β β βββ auth/ # Authentication module
β β βββ users/ # User profile management
β β βββ jobs/ # Job CRUD operations
β β βββ applications/ # Application management
β β βββ prisma/ # Prisma service
β βββ prisma/
β β βββ schema.prisma # Database schema
β βββ package.json
β
βββ llm/ # Development logs
βββ environment_llm.txt # Project specifications
βββ mvp_log.md # Development progress
- Node.js 20+ (via nvm)
- npm or yarn
- Supabase account
git clone https://github.com/yourusername/gradwork.git
cd gradwork- Create a new project at supabase.com
- Go to Settings β API and note your:
- Project URL
- Anon/Public key
- Go to Settings β JWT Keys β Legacy JWT Secret for the JWT secret
- Go to Authentication β Providers β Email and disable "Confirm email" for development
Frontend (frontend/.env.local):
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
NEXT_PUBLIC_API_BASE_URL=http://localhost:4000Backend (backend/.env):
PORT=4000
NODE_ENV=development
FRONTEND_URL=http://localhost:3000
DATABASE_URL="postgresql://postgres:[password]@db.[project-id].supabase.co:5432/postgres"
SUPABASE_PROJECT_URL=https://your-project.supabase.co
SUPABASE_JWT_SECRET=your-jwt-secret# Frontend
cd frontend
npm install
# Backend
cd ../backend
npm installcd backend
npx prisma migrate dev# Terminal 1 - Backend (port 4000)
cd backend
npm run start:dev
# Terminal 2 - Frontend (port 3000)
cd frontend
npm run devVisit http://localhost:3000 to see the app!
| Method | Endpoint | Description |
|---|---|---|
| POST | /auth/register |
Create user profile |
| GET | /auth/me |
Get current user |
| Method | Endpoint | Description |
|---|---|---|
| GET | /users/profile |
Get own profile |
| PATCH | /users/profile/student |
Update student profile |
| PATCH | /users/profile/company |
Update company profile |
| Method | Endpoint | Description |
|---|---|---|
| GET | /jobs |
List all jobs |
| GET | /jobs/:id |
Get job details |
| POST | /jobs |
Create job (Company) |
| PATCH | /jobs/:id |
Update job (Owner) |
| DELETE | /jobs/:id |
Delete job (Owner) |
| Method | Endpoint | Description |
|---|---|---|
| GET | /applications/my |
My applications (Student) |
| GET | /applications/received |
Received applications (Company) |
| POST | /applications |
Apply to job (Student) |
| PATCH | /applications/:id/status |
Update status (Company) |
model User {
id visually String @id
email String @unique
role Role @default(STUDENT)
studentProfile StudentProfile?
companyProfile CompanyProfile?
jobs Job[]
applications Application[]
}
model Job {
id String @id
title String
description String
location String
type JobType
salary String?
company User @relation
applications Application[]
}
model Application {
id String @id
status ApplicationStatus @default(PENDING)
student User @relation
job Job @relation
}Modern dark theme with gradient effects, inspired by Vercel/Next.js design.
Role-based dashboard with sidebar navigation for students and companies.
Browse and filter job opportunities with application tracking.
- User signs up via Supabase Auth (email/password)
- Supabase issues JWT token
- Frontend stores session and sends token to backend
- Backend verifies JWT via Supabase JWKS endpoint
- Protected routes require valid JWT in Authorization header
- Resume upload (Supabase Storage)
- Job search and filters
- Email notifications
- Admin dashboard
- AI-powered job matching
MIT License - feel free to use this for your own projects!
gradWork v0.1 - Built for undergraduates, by developers who care.