A production-ready developer portfolio built with React + Vite + Tailwind CSS + Framer Motion (frontend) and Node.js + Express + MongoDB Atlas (backend).
Contact Me Using https://kshitish-portfolio.onrender.com
portfolio/
βββ client/ # React frontend (deploy to Vercel)
β βββ src/
β β βββ components/ # Navbar, Hero, About, Skills, Projects, Experience, ContactForm, Footer
β β βββ pages/ # Home, ProjectDetail, Contact
β β βββ data/ # portfolio.js (edit YOUR info here)
β βββ vercel.json
β βββ .env.example
βββ server/ # Express backend (deploy to Render)
βββ config/ # db.js, notifications.js
βββ controllers/ # contactController.js
βββ models/ # Message.js
βββ routes/ # contact.js
βββ index.js
βββ .env.example
# Backend
cd server
npm install
cp .env.example .env # Fill in your values
# Frontend
cd ../client
npm install
cp .env.example .env # Set VITE_API_URL=http://localhost:5000# Terminal 1 β Backend
cd server
node index.js # or: npx nodemon index.js
# Terminal 2 β Frontend
cd client
npm run devFrontend runs at: http://localhost:5173
Backend runs at: http://localhost:5000
Edit client/src/data/portfolio.js to update:
- Your name, role, bio, email, location
- Social links (GitHub, LinkedIn, Twitter)
- Projects (title, description, tags, images, links)
- Skills and categories
- Work experience
- Go to mongodb.com/atlas β Create free account
- Create a new M0 free cluster
- Database Access β Add user with password
- Network Access β Add
0.0.0.0/0(allow all IPs) - Connect β Copy connection string (replace
<password>)
- Push your
server/folder to a GitHub repo - Go to render.com β New Web Service
- Connect your GitHub repo
- Settings:
- Build Command:
npm install - Start Command:
node index.js - Environment: Node
- Build Command:
- Add Environment Variables:
MONGO_URI=mongodb+srv://... EMAIL_USER=your@gmail.com EMAIL_PASS=your_app_password TWILIO_SID=ACxxxxxxxxx TWILIO_AUTH_TOKEN=xxxxxxxxx TWILIO_PHONE=+1234567890 OWNER_PHONE=+0987654321 ALLOWED_ORIGINS=https://yourportfolio.vercel.app NODE_ENV=production PORT=10000 - Deploy β Copy your Render URL (e.g.
https://portfolio-api.onrender.com)
- Push your
client/folder to GitHub - Go to vercel.com β New Project β Import repo
- Vercel auto-detects Vite β no config needed
- Add Environment Variable:
VITE_API_URL=https://portfolio-api.onrender.com - Deploy β Your portfolio is live! π
- Google Account β Security β Enable 2-Step Verification
- Search "App passwords" β Create one for "Mail"
- Use the 16-character password as
EMAIL_PASS
- Sign up at twilio.com (free trial)
- Get Account SID, Auth Token from dashboard
- Buy/use a trial phone number β set as
TWILIO_PHONE - Set
OWNER_PHONEto your personal number to receive SMS alerts
POST https://your-backend.onrender.com/api/contact
// Request
{
"name": "John Doe",
"email": "john@example.com",
"subject": "Project Inquiry",
"message": "Hi! I'd love to work with you on a project."
}
// Success Response (201)
{
"success": true,
"message": "Thanks for reaching out! I'll get back to you soon.",
"data": {
"id": "64a1b2c3d4e5f6g7h8i9j0k",
"createdAt": "2024-01-15T10:30:00.000Z"
}
}
// Error Response (400)
{
"success": false,
"message": "Validation failed",
"errors": [
{ "field": "email", "message": "Please enter a valid email" }
]
}- Helmet β Security headers
- CORS β Restricted to your frontend origin
- Rate Limiting β 100 req/15min global, 5 contact submissions/hour
- Input Validation β express-validator on all fields
- Input Sanitization β XSS protection via escape()
- dotenv β Secrets never in code
cd client
npm run build # Outputs to client/dist/Vercel runs this automatically on deploy.
| Layer | Technology |
|---|---|
| Frontend | React 18, Vite, Tailwind CSS v3, Framer Motion |
| Routing | React Router DOM v6 |
| Icons | React Icons (Feather + HeroIcons) |
| SEO | React Helmet Async |
| Backend | Node.js, Express.js |
| Database | MongoDB Atlas + Mongoose |
| Nodemailer + Gmail SMTP | |
| SMS | Twilio |
| Security | Helmet, CORS, express-rate-limit, express-validator |
| Logging | Morgan |
| Deploy | Vercel (frontend) + Render (backend) |