A modern, ultra-responsive portfolio website for DevOps engineers with real-time admin panel, email integration, and stunning animations. Built with Node.js, Express, and vanilla JavaScript.
- Ultra-modern UI with gradient animations and particle effects
- Custom animated cursor with smooth tracking
- Responsive design that works on all devices
- Timeline experience section with achievements display
- Interactive skills showcase with progress bars
- Project filtering by category
- Smooth scrolling navigation
- Contact form with real email delivery
- Inline editing - No popups, edit directly in the admin panel
- Real-time updates - See changes instantly
- Full CRUD operations for all sections:
- Profile & Statistics
- Experience with location and achievements
- Skills (Hard, Soft, Tools)
- Education
- Certifications
- Projects with features
- Visual feedback with toast notifications
- Backup & Restore functionality
- SMTP email integration with Nodemailer
- Beautiful HTML email templates
- Auto-reply functionality to visitors
- Fallback system - saves locally if email fails
- Support for multiple email providers (Gmail, Outlook, Yahoo, etc.)
- JSON file storage (default)
- SQLite database support (optional)
- Automatic backups before updates
# Clone the repository
git clone <your-repo-url>
cd portfolio
# Install dependencies
npm install
# Initialize project structure
npm run initCreate a .env file in the root directory:
# Server Configuration
PORT=3000
NODE_ENV=development
# Storage (false = JSON, true = SQLite)
USE_DATABASE=false
# SMTP Email Configuration
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=[email protected]
SMTP_PASS=your-app-password
RECIPIENT_EMAIL=[email protected]
SEND_AUTO_REPLY=true
SITE_URL=http://localhost:3000- Go to Google Account Settings
- Enable 2-factor authentication
- Generate app password:
- Visit App Passwords
- Select "Mail" and generate
- Use this 16-character password as
SMTP_PASS
# Development mode with auto-reload
npm run dev
# Production mode
npm startVisit http://localhost:3000 to see your portfolio!
portfolio/
βββ server.js # Express server with SMTP
βββ package.json # Dependencies
βββ init.js # Setup script
βββ .env # Environment variables
βββ .gitignore # Git ignore file
βββ README.md # Documentation
βββ contacts.json # Contact form submissions
βββ portfolio.db # SQLite database (optional)
βββ public/
βββ index.html # Main HTML file
βββ css/
β βββ style.css # Optimized styles
βββ js/
β βββ main.js # Frontend logic
β βββ complete-admin-panel.js # Admin panel
βββ data/
β βββ portfolio.json # Portfolio data
β βββ portfolio-backup.json # Automatic backup
βββ images/ # Image assets
- Click the Admin Panel button in the navigation
- Navigate through tabs:
- Profile: Update name, title, bio, statistics
- Experience: Add jobs with location and achievements
- Skills: Manage hard, soft, and tool skills
- Education: Add degrees and certifications
- Projects: Showcase work with features and links
- Edit directly in the forms - no popups!
- Click Update for individual items
- Click Save All Changes to persist
Edit CSS variables in public/css/style.css:
:root {
--bg-primary: #0a0a0a;
--accent-cyan: #06b6d4;
--gradient-1: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
/* ... more variables */
}Edit public/data/portfolio.json:
{
"personal": {
"name": "Your Name",
"title": "Your Title",
"email": "[email protected]"
}
}SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SECURE=false
# Use app-specific passwordSMTP_HOST=smtp-mail.outlook.com
SMTP_PORT=587
SMTP_SECURE=falseSMTP_HOST=smtp.mail.yahoo.com
SMTP_PORT=587
SMTP_SECURE=falseContact your provider for SMTP settings:
- Namecheap:
smtp.privateemail.com - GoDaddy:
smtpout.secureserver.net - Zoho:
smtp.zoho.com
npm install -g vercel
vercel# Create Heroku app
heroku create your-portfolio-name
# Set environment variables
heroku config:set SMTP_HOST=smtp.gmail.com
heroku config:set [email protected]
heroku config:set SMTP_PASS=your-app-password
# ... set other variables
# Deploy
git push heroku main# Install Railway CLI
npm install -g @railway/cli
# Login and initialize
railway login
railway init
# Set environment variables in Railway dashboard
# Then deploy
railway up# Install PM2
npm install -g pm2
# Start application
pm2 start server.js --name portfolio
# Setup auto-restart
pm2 save
pm2 startup
# Monitor
pm2 monit- Push code to GitHub
- Create new app in DigitalOcean
- Connect GitHub repository
- Set environment variables
- Deploy
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/portfolio |
Get portfolio data |
| POST | /api/portfolio |
Update portfolio data (admin) |
| POST | /api/contact |
Submit contact form |
| GET | /api/backup |
Download portfolio backup |
| POST | /api/restore |
Restore from backup |
| GET | /api/health |
Health check with email status |
- Check SMTP credentials in
.env - Ensure 2FA is enabled for Gmail
- Use app-specific password, not regular password
- Check
/api/healthendpoint for email status
- Clear browser cache
- Check browser console for errors
- Ensure
complete-admin-panel.jsis loaded
- Already optimized with
requestAnimationFrame - Disable custom cursor on mobile automatically
- Check if particle count needs reduction
- Check write permissions for
public/data/ - Verify JSON structure is valid
- Check server logs for errors
- Never commit
.envfile - It's in.gitignore - Use environment variables for sensitive data
- Enable HTTPS in production
- Sanitize user inputs (already implemented)
- Regular backups of portfolio data
- Use app-specific passwords for email
npm start # Start production server
npm run dev # Start with nodemon (auto-reload)
npm run init # Initialize project structure
npm run backup # Create manual backup- Fork the repository
- Create feature branch (
git checkout -b feature/AmazingFeature) - Commit changes (
git commit -m 'Add AmazingFeature') - Push to branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Icons from Lucide React
- Particle effects inspired by particles.js
- Email templates styled with modern gradients
- Built with love for the DevOps community
Having issues?
- Check the Troubleshooting section
- Open an issue on GitHub
- Contact via the portfolio contact form
Built with β€οΈ by DevOps Engineers for DevOps Engineers
Last Updated: 2024