Team 37 for the OSU 2025 Capstone Project UniFreelancer Academy
UniFreelancer Academy is a collaborative learning platform that empowers freelancers and students to upskill through peer-led micro-courses, real-world projects, and mentorship.
UniFreelancer Academy connects aspiring professionals with mentors and micro-learning experiences designed around practical freelancing skills.
Live Site: https://unifreelancer-1.onrender.com
This repository hosts the codebase, documentation, and project management rails for our capstone development.
Aidan Caughey | Testing Manager | caugheya@oregonstate.edu
Aiden McCoy | Backend Development | mccoaide@oregonstate.edu
Baron Baker | Database Manager | bakerbar@oregonstate.edu
Daniel Molina | Frontend Development | molindan@oregonstate.edu
Nafizur Rahman | Frontend Development | rahmanna@oregonstate.edu
We follow a structured Git workflow to ensure code quality and collaboration efficiency:
- All new work is done in a feature branch.
- Changes are submitted via Pull Request (PR).
- Each PR requires at least one code review before merging.
- After approval, the PR can be merged into the main branch.
| Layer | Technology |
|---|---|
| Frontend | React (Create React App) |
| Backend | Node.js / Express |
| Database | MongoDB Atlas |
| Authentication | JWT |
| Payments | Stripe |
| Media Storage | Cloudinary |
| Video Meetings | Zoom Meeting SDK |
| AI / LLM | Ollama |
| Hosting | Render |
The following environment variables are required to run the application. They must be set in a .env file inside the server/ directory for local work, or configured as environment variables in your Render dashboard for production.
# Server
PORT=5000
# Database
MONGO_URI=your_mongodb_connection_string
# Authentication
JWT_SECRET=your_jwt_secret
# Frontend
FRONTEND_URL=http://localhost:3000
REACT_APP_API_URL=http://localhost:5000
# Cloudinary (media uploads)
CLOUDINARY_CLOUD_NAME=your_cloudinary_cloud_name
CLOUDINARY_API_KEY=your_cloudinary_api_key
CLOUDINARY_API_SECRET=your_cloudinary_api_secret
# Stripe (payments)
STRIPE_SECRET_KEY=your_stripe_secret_key
STRIPE_WEBHOOK_SECRET=your_stripe_webhook_secret
REACT_APP_STRIPE_PUBLISHABLE_KEY=your_stripe_publishable_key
# Zoom Meeting SDK
ZOOM_MEETING_SDK_KEY=your_zoom_sdk_key
ZOOM_MEETING_SDK_SECRET=your_zoom_sdk_secret
# AI / LLM (Ollama via Render or remote host)
AI_PROVIDER=ollama
REMOTE_LLM_URL=your_remote_ollama_url
REMOTE_LLM_SECRET=your_remote_llm_secretNever commit .env files to version control. Use gitignore. See CONTRIBUTING.md for security guidelines.
- Create a free account at https://www.mongodb.com/cloud/atlas.
- Create a new cluster.
- Under Database Access, create a database user with read/write permissions.
- Under Network Access, add your IP address, or
0.0.0.0/0(allow all). - Click Connect, then Connect your application, and copy the connection string.
- Replace
<password>in the connection string with your database user's password and set it asMONGO_URI.
- Create an account at https://stripe.com.
- From the Stripe Dashboard, go to Developers, then API Keys.
- Copy the Secret key into
STRIPE_SECRET_KEY. - Copy the Publishable key into
REACT_APP_STRIPE_PUBLISHABLE_KEY. - For webhooks, go to Developers, then Webhooks, then Add endpoint.
- Set the endpoint URL to
https://your-backend-url/api/webhook. - Select events to listen for (
checkout.session.completed,invoice.paid). - Copy the Signing secret into
STRIPE_WEBHOOK_SECRET.
- Set the endpoint URL to
- To test webhooks locally, install the Stripe CLI and run:
stripe listen --forward-to localhost:5000/api/webhook
- Create a free account at https://cloudinary.com.
- From your dashboard, copy:
- Cloud Name into
CLOUDINARY_CLOUD_NAME - API Key into
CLOUDINARY_API_KEY - API Secret into
CLOUDINARY_API_SECRET
- Cloud Name into
- Create a developer account at https://marketplace.zoom.us.
- Click Develop, then Build App, and choose Meeting SDK as the app type.
- After creating the app, copy:
- SDK Key into
ZOOM_MEETING_SDK_KEY - SDK Secret into
ZOOM_MEETING_SDK_SECRET
- SDK Key into
- Add your frontend origin (
http://localhost:3000) to the app's allowed origins.
UniFreelancer Academy uses Ollama to power AI-assisted features. In production, Ollama runs on a remote server reached via REMOTE_LLM_URL.
Running Ollama locally:
- Install Ollama from https://ollama.com.
- Pull a model:
ollama pull llama3
- Start the Ollama server (runs on port 11434 by default):
ollama serve
- Set your local env variables:
AI_PROVIDER=ollama REMOTE_LLM_URL=http://localhost:11434 REMOTE_LLM_SECRET=
For production (Render or VPS):
- Deploy Ollama on a separate Render service or VPS.
- Set
REMOTE_LLM_URLto the public URL of that service. - Set
REMOTE_LLM_SECRETto a shared secret used to authenticate requests between the backend and the LLM service.
The application is hosted on Render. The backend and frontend are deployed as separate Render services.
Backend (Web Service):
- Connect your GitHub repository to Render.
- Set the Root Directory to
server. - Set Build Command to
npm install && npm run build. - Set Start Command to
npm start. - Add all server environment variables under the Environment tab in the Render dashboard.
Frontend (Static Site):
- Add a new Static Site on Render.
- Set the Root Directory to
client. - Set Build Command to
npm install && npm run build. - Set Publish Directory to
build. - Add
REACT_APP_API_URLandREACT_APP_STRIPE_PUBLISHABLE_KEYas environment variables.
After deploying the backend, update FRONTEND_URL on the backend service and REACT_APP_API_URL on the frontend service to use the live Render URLs.
Prerequisites:
- Node.js (v18 or higher)
- npm or yarn
- Git
- MongoDB Atlas account or a local MongoDB instance
- Accounts for Stripe, Cloudinary, and Zoom (see above)
1. Clone the repository:
git clone https://github.com/UniFreelancerAcademy/UniFreelancer.git
cd UniFreelancer2. Install dependencies for both server and client:
cd server && npm install
cd ../client && npm install3. Create environment files:
Create server/.env using the variable lists in the Configuration section above.
4. Start the backend (Terminal 1):
cd server
npm run build
npm start5. Start the frontend (Terminal 2):
cd client
npm start6. Verify Installation:
Visit http://localhost:3000 to confirm the frontend loads and connects to the backend.