A single-page portfolio for a student frontend developer / full-stack lead. Theme: classic off-white background, black text, gold accents, with terminal-style panels in the Hero, Skills, and Projects sections. The Contact form is fully functional and posts to a real Express + MongoDB API.
portfolio-mern/
├── frontend/ React + Vite app (all UI, sections, theme)
└── backend/ Express + MongoDB API (contact form)
whoami, role, location, status.frontend, backend, database-and-tools)
showing npm ls style output with animated gold progress bars.git clone / npm run dev
style commands, plus a description card with tech stack tags and links.POST /api/contact) that saves to MongoDB
(with an automatic local-file fallback) and can optionally email you via
Nodemailer.You need Node.js 18+ installed. MongoDB is optional — the backend runs and the contact form still works even with no database connected.
cd backend
npm install
cp .env.example .env # edit if you want Mongo + email working
npm run dev # starts on http://localhost:5000
In a second terminal:
cd frontend
npm install
cp .env.example .env # optional, defaults already point to localhost:5000
npm run dev # starts on http://localhost:5173
Open http://localhost:5173 — the site is live, and the contact form actually sends data to the backend.
Edit one file to change almost everything (name, role, about text, skills, projects, education, achievements, socials, email):
frontend/src/data/portfolioData.js
Colors / theme (off-white, black, gold) live in:
frontend/src/index.css → the :root { --bg, --ink, --gold, ... } block
By default, if you don’t configure anything, submitted messages are still
saved reliably to backend/data/messages.json, so the form always works.
To make it production-grade:
backend/.env as MONGO_URI.SMTP_USER,
SMTP_PASS, and CONTACT_RECEIVER_EMAIL in backend/.env.You can view all stored messages anytime at:
GET http://localhost:5000/api/contact
.env.example in your host’s dashboard.VITE_CONTACT_API_URL to
your deployed backend’s /api/contact URL, then npm run build.CLIENT_ORIGIN in the backend .env to your deployed frontend URL
so CORS allows it.