A dynamic full-stack portfolio website built using HTML, CSS,Tailwind CSS, JavaScript, Node.js (core HTTP module), and MySQL.
This project demonstrates deep backend understanding by implementing custom routing, request handling, and API logic without using any framework like Express.js.
This is not a static portfolio โ it is a fully dynamic, database-driven system where all content is managed via an admin dashboard.
Client (Browser)
โ
Node.js (HTTP Module - Custom Server)
โ
MySQL Database
http moduleThis project intentionally avoids Express to:
| Layer | Technology |
|---|---|
| Frontend | HTML, CSS,Tailwind CSS, JavaScript |
| Backend | Node.js (HTTP module) |
| Database | MySQL |
| Auth | Google OAuth |
| Animation | AOS (Animate on Scroll) |
Manage:
All sections are dynamically controlled via the database.
Main tables:
admins โ Google authenticationprojects โ Portfolio datablogs โ Articlesreviews โ Testimonialscontacts โ Messagessections โ Dynamic homepage contentCREATE TABLE admins (
id INT AUTO_INCREMENT PRIMARY KEY,
google_id VARCHAR(255) UNIQUE,
name VARCHAR(100),
email VARCHAR(100) UNIQUE,
profile_pic TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE projects (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
short_description TEXT,
full_description TEXT,
preview_image TEXT,
animation_type VARCHAR(100),
tech_stack VARCHAR(255),
github_link VARCHAR(255),
live_link VARCHAR(255),
is_featured BOOLEAN DEFAULT FALSE,
display_order INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE blogs (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
author_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (author_id) REFERENCES admins(id)
);
CREATE TABLE reviews (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
role VARCHAR(100),
message TEXT,
rating INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE contacts (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sections (
id INT AUTO_INCREMENT PRIMARY KEY,
section_name VARCHAR(100),
title VARCHAR(255),
content TEXT,
image_url TEXT,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
admins (1) โ blogs (many)
All APIs are manually implemented using Node.js http module.
GET /api/auth/googleGET /api/auth/google/callbackGET /api/auth/logoutGET /api/projectsPOST /api/projectsPUT /api/projects/:idDELETE /api/projects/:idGET /api/blogsPOST /api/blogsPUT /api/blogs/:idDELETE /api/blogs/:idGET /api/reviewsPOST /api/reviewsDELETE /api/reviews/:idPOST /api/contactsGET /api/contactsDELETE /api/contacts/:idGET /api/sectionsPOST /api/sectionsPUT /api/sections/:idDELETE /api/sections/:idMy-Portfolio/
โ
โโโ server.js # Core HTTP server
โโโ .env
โโโ package.json
โ
โโโ db/
โ โโโ connection.js # MySQL connection
โ
โโโ public/ # Frontend files
โ โโโ index.html
โ โโโ projects.html
โ โโโ blog.html
โ โโโ contact.html
โ โโโ admin.html
โ โโโ css/
โ โโโ js/
โ
โโโ sql/
โโโ schema.sql
git clone https://github.com/Mr-Ali01/samir-ali-portfolio.git
cd My-Portfolio
npm install
Create .env file:
PORT=5000
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=yourpassword
DB_NAME=portfolio_db
GOOGLE_CLIENT_ID=your_client_id
GOOGLE_CLIENT_SECRET=your_secret
node server.js
Server runs on:
http://localhost:5000
Frontend (fetch API)
โ
Node.js (Custom HTTP Server)
โ
MySQL Database
โ
JSON Response
โ
Dynamic UI Rendering
Built a full-stack portfolio using Node.js core HTTP module without Express, implementing custom routing, request handling, and REST APIs. Integrated MySQL for dynamic content and Google OAuth for authentication.
This project demonstrates:
โ Strong backend fundamentals โ Full-stack development skills โ Real-world system design โ Ability to work without frameworks
If you like this project, give it a โญ on GitHub!