- Melissa Rejuan
- James Jacob
SideQuest helps students discover side projects, find collaborators across fields, and manage teams. Users can browse projects, create and edit their own, maintain profiles, request to join roles, and track memberships from a personal dashboard.
Authentication uses Passport Local with Express sessions stored in MongoDB. Data lives in MongoDB Atlas (users, projects, team_memberships).
Below is a screenshot of the SideQuest application running.
- Open the frontend (local: http://localhost:5173).
- Browse Projects to explore public projects (no login required).
- Sign Up or Log In (seeded demo password:
Password123!). - Edit My Profile, Create Project, apply to roles, and manage requests on Dashboard.
- Node.js and npm
- A MongoDB Atlas cluster (or connection string from a teammate)
- Your IP address allowed under Atlas Network Access (or
0.0.0.0/0for development)
From the project root:
npm install
npm install --prefix client
npm install --prefix serverCopy the example env file and fill in your values:
cp .env.example .envEdit .env:
MONGODB_URI=mongodb+srv://USERNAME:PASSWORD@YOUR_CLUSTER.mongodb.net/?retryWrites=true&w=majority
MONGODB_DB_NAME=sidequest_db
PORT=3000
SESSION_SECRET=replace-with-a-long-random-stringNever commit .env. Do not put real Mongo credentials in this README.
If Atlas Network Access does not allow your IP, the server will fail to start with a TLS/SSL connection error.
- Users: import at least 1,000 users into
sidequest_db.users(team seed / Atlas import). - Projects: from the project root, with users already present:
npm run seed- Passwords for seeded users (bcrypt demo hash):
npm run rehash-passwordsDemo password for seeded users:
Password123!
- Optional memberships for dashboard demos:
npm run seed-team-membershipsFrom the project root:
npm run devThis starts the Express API and the Vite React client together.
| Service | URL |
|---|---|
| Frontend | http://localhost:5173 |
| Backend API | http://localhost:3000 |
| Health check | http://localhost:3000/api/health |
| Database health | http://localhost:3000/api/health/database |
npm run client
npm run servernpm run formatThis section describes how the SideQuest repository is organized. The goal is to keep the project modular, easy to navigate, and scalable.
sidequest/
├── client/
├── server/
├── database/
├── docs/
├── .env.example
├── .gitignore
├── prettier.config.js
├── LICENSE
├── README.md
└── package.json
The root of the project contains project-wide configuration and documentation.
| File | Purpose |
|---|---|
package.json |
Root scripts for running both the frontend and backend simultaneously. |
.env.example |
Template showing required environment variables (never commit .env). |
.gitignore |
Files and folders excluded from Git. |
client/eslint.config.js |
Frontend ESLint configuration. |
prettier.config.js |
Shared code formatting configuration. |
README.md |
Main project documentation. |
LICENSE |
MIT License. |
The client folder contains the React frontend created with Vite.
client/
├── public/
├── src/
├── package.json
└── vite.config.js
Contains static files served directly by Vite.
Examples:
- favicon
- logos
- static images
Contains all React source code.
Stores static assets imported by React.
Examples:
- icons
- project logos
- images
Reusable UI components that can be shared across multiple features.
Examples:
- Navbar
- Footer
- Loading Spinner
- Status Badge
- Skill Tag
These components should not contain application logic.
The majority of our application will live here.
Each feature is responsible for one area of the application.
Current planned features:
features/
auth/
profiles/
projects/
teamMemberships/
dashboard/
Responsible for authentication.
Expected responsibilities:
- Login
- Registration
- Logout
- Authentication Context
- Protected Routes
- Authentication API requests
Responsible for user profiles.
Expected responsibilities:
- View profile
- Edit profile
- Skills
- Interests
- Availability
- Portfolio links
- GitHub links
Responsible for project management.
Expected responsibilities:
- Create projects
- Edit projects
- Delete projects
- Browse projects
- Search projects
- Filter projects
- View project details
- Manage project roles
This will likely become the largest feature in the project.
Responsible for managing relationships between users and projects.
Examples:
- Join requests
- Pending requests
- Accepted members
- Leaving projects
- Team roster
- Completed project visibility
The MongoDB collection will also be named:
team_memberships
Each document represents one user's relationship to one project.
Responsible for displaying information relevant to the logged-in user.
Examples:
- Projects I Own
- Projects I've Joined
- Pending Requests
- Recruiting Projects
The dashboard will pull information from multiple collections.
Top-level pages rendered by React Router.
Examples:
Landing Page
Projects
Project Details
Create Project
Dashboard
Profile
Login
Register
Pages should primarily compose existing components rather than contain large amounts of business logic.
Contains API functions that communicate with the Express backend using Fetch.
Examples:
getProjects();
createProject();
updateProfile();Keeping API calls separate prevents components from becoming cluttered.
Contains global styling.
Examples:
- global.css
- typography.css
- CSS variables
Feature-specific styling should remain beside its component using CSS Modules.
Shared helper functions.
Examples:
- formatting dates
- validation
- skill normalization
- constants
Top-level React component.
Responsible for:
- Rendering routes
- Global layout
React application entry point.
Responsible for:
- Rendering React into the DOM
- Loading global CSS
The server folder contains the Express backend.
server/
├── config/
├── controllers/
├── middleware/
├── routes/
├── services/
├── utils/
├── app.js
├── server.js
└── package.json
Configuration files.
Examples:
- MongoDB connection
- Passport configuration
- Session configuration
Controllers receive requests from Express routes and coordinate application logic.
Example:
GET /projects
↓
projectController.getProjects()
↓
projectService.getProjects()
↓
MongoDB
Controllers should remain relatively lightweight.
Reusable Express middleware.
Examples:
- Authentication
- Project ownership validation
- Error handling
- ObjectId validation
Defines API endpoints.
Examples:
/auth
/users
/projects
/teamMemberships
Routes should primarily map URLs to controller functions.
Contains business logic and database operations.
Examples:
- Query MongoDB
- Create users
- Update projects
- Accept join requests
Services help keep controllers clean.
Helper functions shared across the backend.
Examples:
- Normalize skills
- Remove sensitive user information
- Formatting helpers
Creates and configures the Express application.
Responsibilities include:
- Middleware
- Sessions
- Passport
- Route registration
Starts the Express server.
Responsibilities:
- Connect to MongoDB
- Start listening on the configured port
database/
├── seed/
└── createIndexes.js
Contains scripts for generating synthetic data.
Examples:
- Users
- Projects
- Team memberships
Seed scripts generate synthetic projects (1,000+) and optional team memberships. Users should be imported or seeded separately into MongoDB.
Stores MongoDB index creation scripts to improve query performance.
docs/
├── project-proposal.md
├── api-routes.md
├── database-schema.md
└── mockups/
Contains planning documents.
Examples:
- Proposal
- API documentation
- Database schemas
- UI mockups
The application currently plans to use three collections.
Stores user accounts and profile information.
Stores project listings, project metadata, and available project roles.
Stores each user's relationship to a project.
Possible statuses include:
- pending
- accepted
- declined
- left
- removed
This design allows us to represent both join requests and active team members using a single collection.
- Build features incrementally—do not create files until they are needed.
- Keep React components small and focused on one responsibility.
- Separate UI, business logic, and database operations whenever possible.
- Favor reusable components over duplicated code.
- Organize code by feature on the frontend and by responsibility on the backend.
