A full-stack web platform that connects students to collaborate on projects. Users can create projects, post openings for specific roles, browse and apply to join other teams, and manage their profiles — all in one place.
- Features
- Tech Stack
- Project Structure
- Getting Started
- Environment Variables
- API Overview
- CI/CD
- Contributing
- User Authentication – Register and log in with JWT-based auth (bcrypt password hashing).
- Project Management – Create, update, and delete projects; only the project owner can modify or delete their project.
- Openings – Project owners can post role openings (e.g. "Frontend Dev", "ML Engineer") with skill requirements.
- Applications – Authenticated users can apply to project openings; owners can review and manage applications.
- Profiles – Users maintain a profile with their skills, college, and bio.
- Browse & Search – Discover projects by title, description, tags, or domain, with domain filtering.
- Dashboard – Personal dashboard showing your projects and applications at a glance.
| Layer | Technology |
|---|---|
| Frontend | React 18, Vite, Tailwind CSS, TypeScript |
| Backend | NestJS, TypeScript |
| Database | PostgreSQL 16 |
| ORM | Prisma |
| Auth | JWT (Passport.js), bcrypt |
| Containerisation | Docker, Docker Compose |
| CI/CD | GitHub Actions |
project-collab-app/
├── backend/
│ ├── prisma/ # Prisma schema & migrations
│ └── pro-backend/ # NestJS application
│ └── src/
│ ├── auth/ # JWT strategy, local strategy, guards
│ ├── users/ # User module
│ ├── profiles/ # Profile module
│ ├── projects/ # Projects CRUD
│ ├── openings/ # Project openings
│ └── applications/ # Role applications
├── frontend/
│ └── pro-frontend/ # React + Vite application
│ └── src/
│ ├── pages/ # Route-level page components
│ ├── components/ # Reusable UI components
│ ├── api/ # API client functions
│ ├── context/ # React context providers
│ └── types/ # TypeScript interfaces
├── infra/
│ ├── docker-compose.yml # Development stack
│ ├── docker-compose.prod.yml # Production stack
│ └── .env.example # Environment variable template
└── docs/
├── architecture.png
└── roadmap.md
The easiest way to run the full stack locally is with Docker Compose.
-
Clone the repository
git clone https://github.com/ManbirS07/project-collab-app.git cd project-collab-app -
Create the environment file
cp infra/.env.example infra/.env # Edit infra/.env and set a strong JWT_SECRET -
Start all services
cd infra docker compose up --buildService URL Frontend http://localhost:4173 Backend API http://localhost:3000 PostgreSQL localhost:5432 -
Stop the stack
docker compose down
cd backend/pro-backend
# Install dependencies
npm install
# Generate Prisma client
npx prisma generate --schema ../prisma/schema.prisma
# Run database migrations
npx prisma migrate deploy --schema ../prisma/schema.prisma
# Start in development mode (watch)
npm run start:dev
# Start in production mode
npm run start:prodcd frontend/pro-frontend
# Install dependencies
npm install
# Start development server
npm run dev
# Build for production
npm run buildCopy infra/.env.example to infra/.env and fill in the values:
| Variable | Description | Default |
|---|---|---|
POSTGRES_USER |
PostgreSQL username | app |
POSTGRES_PASSWORD |
PostgreSQL password | app |
POSTGRES_DB |
PostgreSQL database name | collab |
JWT_SECRET |
Secret key used to sign JWTs | change-me |
BACKEND_IMAGE |
Docker image for the backend (production) | — |
FRONTEND_IMAGE |
Docker image for the frontend (production) | — |
All protected routes require a Bearer <token> header obtained from POST /auth/login.
| Method | Path | Auth | Description |
|---|---|---|---|
POST |
/auth/register |
Public | Register a new user |
POST |
/auth/login |
Public | Log in and receive a JWT |
GET |
/projects |
Public | List all projects |
POST |
/projects/create |
JWT | Create a new project |
GET |
/projects/:id |
JWT | Get project by ID |
PATCH |
/projects/:id |
Owner | Update a project |
DELETE |
/projects/:id |
Owner | Delete a project |
POST |
/projects/:id/openings |
Owner | Add an opening to a project |
GET |
/projects/:id/openings |
JWT | List openings for a project |
GET |
/projects/:id/applications |
Owner | View applications for a project |
GET |
/projects/:id/memberships |
JWT | View project members |
- Fork the repository and create a feature branch.
- Make your changes with clear, descriptive commit messages.
- Ensure linting and tests pass locally before opening a pull request.
- Open a pull request against
mainand describe what you changed and why.