ProFolio is a full-stack web application that lets users register, authenticate via OTP (email or SMS), fill in their professional details, and instantly generate a stunning personal portfolio website β no coding required.
Sign Up β OTP Verification β Dashboard β Fill Details β Portfolio Generated! π
Login Page
OTP Verification
π Dashboard & Portfolio Builder
Welcome Dashboard
Fill Portfolio Details
AI Features Overview
Competitive Programming Profiles
Portfolio Saved Successfully β
π¨ Generated Portfolio Output
Hero Section
About Me
My Skills
Education & Projects
Competitive Coding Profiles
Contact Section
β
Sign up with email or phone number
β
Passwordless login via 5-digit OTP
β
OTP delivery via Nodemailer (email) and Twilio (SMS)
β
OTP auto-expires and is single-use
β
Secure sessions with JWT
π§βπΌ Portfolio Builder
β
Personal Info β Name, Age, Email, Phone, Address, Language
β
Skills with animated circular progress indicators
β
Education timeline (School β College β University)
β
Projects with GitHub repository links
β
Competitive Programming β LeetCode & CodeChef ratings
β
Contact form with social links (GitHub, LinkedIn, Instagram, Email)
β
Beautiful dark-themed generated portfolio
π€ AI-Powered Capabilities
β
Instant Portfolio Creation
β
Customizable Templates
β
AI-Optimized Content Suggestions
β
Easy File Integration
β
SEO & Visibility Boost
β
Auto-Save & Backup
β
Analytics & Insights
β
Multi-Device Access
Technology
Purpose
HTML5 / CSS3
Markup & Styling
JavaScript (ES6+)
Client-side interactivity
React / Vite
Component-based UI
Technology
Purpose
Node.js
Runtime environment
Express.js
Web framework & REST API
JWT
Secure session tokens
Service
Purpose
Nodemailer
Email OTP via Gmail SMTP
Twilio
SMS OTP
Technology
Purpose
MongoDB
User data, sessions, portfolios
Mongoose
ODM & schema modeling
profolio/
β
βββ π backend/
β βββ π config/
β β βββ db.js # MongoDB connection
β β βββ nodemailer.js # Email transport setup
β βββ π controllers/
β β βββ authController.js # Signup, OTP send/verify
β β βββ portfolioController.js # Create, update, fetch portfolio
β βββ π middleware/
β β βββ authMiddleware.js # JWT verification
β β βββ rateLimiter.js # OTP rate limiting
β βββ π models/
β β βββ User.js # User schema
β β βββ OTP.js # OTP schema (hashed + expiry)
β β βββ Portfolio.js # Full portfolio schema
β βββ π routes/
β β βββ authRoutes.js # /api/auth/*
β β βββ portfolioRoutes.js # /api/portfolio/*
β βββ π services/
β β βββ emailService.js # Nodemailer OTP sender
β β βββ smsService.js # Twilio OTP sender
β βββ .env
β βββ server.js
β βββ package.json
β
βββ π frontend/
β βββ π src/
β β βββ π pages/
β β β βββ Login.jsx
β β β βββ OTPVerify.jsx
β β β βββ Dashboard.jsx
β β β βββ PortfolioForm.jsx
β β β βββ Portfolio.jsx # Generated portfolio output
β β βββ App.jsx
β β βββ main.jsx
β βββ vite.config.js
β βββ package.json
β
βββ README.md
git clone https://github.com/yourusername/profolio.git
cd profolio
# Backend
cd backend
npm install
# Frontend
cd ../frontend
npm install
Create a .env file in /backend:
# ββ Server βββββββββββββββββββββββββββββββββββββββ
PORT = 5000
NODE_ENV = development
# ββ Database βββββββββββββββββββββββββββββββββββββ
MONGO_URI = mongodb+srv://<username>:<password>@cluster.mongodb.net/profolio_db
# ββ JWT ββββββββββββββββββββββββββββββββββββββββββ
JWT_SECRET = your_super_secret_jwt_key
JWT_EXPIRES_IN = 7d
# ββ OTP Settings βββββββββββββββββββββββββββββββββ
OTP_EXPIRY_MINUTES = 10
OTP_LENGTH = 5
# ββ Nodemailer (Email OTP) ββββββββββββββββββββββββ
EMAIL_HOST = smtp.gmail.com
EMAIL_PORT = 587
EMAIL_USER = your_email@gmail.com
EMAIL_PASS = your_gmail_app_password
# ββ Twilio (SMS OTP) βββββββββββββββββββββββββββββ
TWILIO_ACCOUNT_SID = ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN = your_twilio_auth_token
TWILIO_PHONE_NUMBER = +1234567890
β οΈ Never commit .env to Git β add it to .gitignore.
# Terminal 1 β Backend (http://localhost:5000)
cd backend
npm run dev
# Terminal 2 β Frontend (http://localhost:5173)
cd frontend
npm run dev
Method
Endpoint
Description
Auth
POST
/signup
Register with email or phone
β
POST
/send-otp
Send OTP via email or SMS
β
POST
/verify-otp
Verify OTP & receive JWT
β
GET
/logout
Invalidate session
β
π§βπΌ Portfolio β /api/portfolio
Method
Endpoint
Description
Auth
POST
/create
Submit portfolio details
β
GET
/:username
Fetch generated portfolio
β
PUT
/update
Update portfolio
β
DELETE
/delete
Delete portfolio
β
POST /api/auth/verify-otp
Content-Type: application/json
{
" contact" : " user@example.com" ,
" otp" : " 49961"
}
{
"success" : true ,
"token" : " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." ,
"user" : { "id" : " 64abc..." , "email" : " user@example.com" }
}
{
"portfolioName" : " My Portfolio" ,
"personalInfo" : {
"name" : " Ishan Bagra" ,
"age" : 20 ,
"email" : " ishanbagra18@gmail.com" ,
"phone" : " 6377253179" ,
"address" : " A-116 Kardhani, Jaipur, Rajasthan"
},
"skills" : [
{ "name" : " JavaScript" , "level" : 89 },
{ "name" : " Node.js" , "level" : 75 },
{ "name" : " React.js" , "level" : 80 },
{ "name" : " HTML" , "level" : 90 },
{ "name" : " CSS" , "level" : 70 },
{ "name" : " Angular" , "level" : 65 }
],
"education" : [
{ "degree" : " B.Tech" , "institution" : " IIIT Kota" , "year" : " 2022 - Present" },
{ "degree" : " College" , "institution" : " iiitkota" , "year" : " 2020 - 2022" },
{ "degree" : " School" , "institution" : " St Teresa" , "year" : " 2008 - 2020" }
],
"projects" : [
{ "title" : " Skylink" , "description" : " Real-time in-flight communication system" , "githubUrl" : " ..." },
{ "title" : " Love-Advisor" , "description" : " AI chatbot to resolve interpersonal conflicts" , "githubUrl" : " ..." },
{ "title" : " Dicegame" , "description" : " A predictable dice game for timepass" , "githubUrl" : " ..." }
],
"competitiveProgramming" : {
"leetcode" : { "profile" : " https://leetcode.com/u/ishanbagra/" , "rating" : 1518 },
"codechef" : { "profile" : " https://www.codechef.com/START141D" , "rating" : 1489 }
},
"contact" : {
"github" : " https://github.com/..." ,
"linkedin" : " https://linkedin.com/in/..." ,
"instagram" : " https://instagram.com/..." ,
"email" : " ishanbagra18@gmail.com"
}
}
# 1. Fork this repo
# 2. Create your feature branch
git checkout -b feature/your-feature
# 3. Commit (Conventional Commits style)
git commit -m " feat: add your feature"
# 4. Push & open a Pull Request
git push origin feature/your-feature
Licensed under the MIT License β see LICENSE for details.
Built with β€οΈ by Ishan Bagra
β Star this repo if you found it helpful! β