Resource Vault is a simple web platform designed to help students quickly access useful learning resources in one place.
Many students spend a lot of time searching across different websites for study materials, tutorials, and helpful links. Resource Vault aims to solve this problem by providing a centralized platform where students can easily find curated resources.
β’ Organized learning resources β’ Clean and simple user interface β’ Easy navigation for students β’ Fast and lightweight website
https://resource-vault-alpha.vercel.app/
The goal of this project is to create a centralized resource hub where students can quickly access helpful study materials without wasting time searching across multiple platforms.
- Add search functionality
- Add categorized resources
- Allow students to submit resources
- Build a backend for dynamic content
resource-vault/
βββ backend/
β βββ src/
β β βββ index.js
β β βββ models/ User.js, Topic.js
β β βββ routes/ auth.js, topics.js, uploads.js
β β βββ middleware/ auth.js
β βββ uploads/ (uploaded files stored here locally)
β βββ package.json
β
βββ frontend/
β βββ src/
β β βββ App.jsx
β β βββ pages/ AuthPage, DashboardPage
β β βββ components/ TopicCard, TopicModal, ResourceModal, Toast
β β βββ hooks/ useAuth.jsx
β β βββ utils/ api.js
β βββ package.json
β
βββ .gitignore
βββ README.md
- Sign up at https://cloud.mongodb.com
- Create free M0 cluster
- Create a DB user, allow all IPs (
0.0.0.0/0) - Copy your connection string
cd backend
cp .env.example .env # fill in your values
npm install
npm run dev # http://localhost:5000cd frontend
cp .env.example .env # VITE_API_URL=http://localhost:5000
npm install
npm run dev # http://localhost:5173- Push to GitHub
- Render β New Web Service β connect repo
- Root dir:
backend| Build:npm install| Start:node src/index.js - Add env vars (MONGODB_URI, JWT_SECRET, FRONTEND_URL, NODE_ENV=production)
- Deploy β get URL like
https://resource-vault-api.onrender.com
β οΈ File uploads on Render free tier: Files are stored on disk, which resets on each deploy. For permanent file storage, use Cloudinary or AWS S3 (both have free tiers). See "Upgrading File Storage" section below.
- Vercel β New Project β import repo
- Root dir:
frontend - Env var:
VITE_API_URL=https://your-render-url.onrender.com - Deploy β get URL like
https://resource-vault.vercel.app - Go back to Render β update
FRONTEND_URLto your Vercel URL
For permanent file storage replace local disk with Cloudinary (easiest free option):
cd backend && npm install cloudinary multer-storage-cloudinaryThen in routes/uploads.js replace the multer.diskStorage with:
const cloudinary = require('cloudinary').v2
const { CloudinaryStorage } = require('multer-storage-cloudinary')
cloudinary.config({ cloud_name: process.env.CLOUDINARY_NAME, api_key: process.env.CLOUDINARY_KEY, api_secret: process.env.CLOUDINARY_SECRET })
const storage = new CloudinaryStorage({ cloudinary, params: { folder: 'resource-vault', resource_type: 'raw' } })Add to .env: CLOUDINARY_NAME, CLOUDINARY_KEY, CLOUDINARY_SECRET (from cloudinary.com free account)
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| POST | /api/auth/register |
β | Create account |
| POST | /api/auth/login |
β | Login |
| GET | /api/auth/me |
β | Current user |
| GET | /api/topics |
β | All topics |
| POST | /api/topics |
β | Create topic |
| PUT | /api/topics/:id |
β | Update topic |
| DELETE | /api/topics/:id |
β | Delete topic + files |
| POST | /api/topics/:id/resources |
β | Add link |
| DELETE | /api/topics/:id/resources/:rid |
β | Delete link |
| POST | /api/uploads/:topicId |
β | Upload files (multipart) |
| DELETE | /api/topics/:id/files/:fid |
β | Delete file |
| Layer | Tech |
|---|---|
| Frontend | React 18, Vite, React Router, Axios, CSS Modules |
| Backend | Node.js, Express, Multer |
| Database | MongoDB Atlas + Mongoose |
| Auth | JWT + bcrypt |
| File storage | Local disk (dev) / Cloudinary (prod) |
| Deploy | Vercel + Render |
PDF, Word (.doc/.docx), PowerPoint (.ppt/.pptx), Excel (.xls/.xlsx), Text (.txt/.md) Max size: 20MB per file, up to 20 files per upload batch