A beautiful, modern portfolio website built with Vue 3, GSAP animations, and Vite.
- π¨ Modern, attractive design with gradients
- β¨ Smooth animations with GSAP
- π± Fully responsive
- π Fast development with Vite
- π Professional social media integration
- πΌ Work experience timeline
- π― Featured projects showcase
- π οΈ Technology stack display
- Node.js (v16 or higher)
- npm or yarn
- XAMPP (for local deployment)
npm installnpm run devVisit http://localhost:5173
This will start the Vite development server with hot module replacement.
npm run buildThe built files will be in the dist folder.
-
Build the project:
npm run build
-
Copy files to XAMPP:
- Copy ALL contents from the
distfolder - Paste them into your XAMPP htdocs folder (e.g.,
C:\xampp\htdocs\safwan\)
- Copy ALL contents from the
-
Add your profile image:
- Add your profile photo as
profile.jpgin theassetsfolder - The image should be at least 320x320 pixels for best quality
- Add your profile photo as
-
Start XAMPP:
- Open XAMPP Control Panel
- Start Apache
- Access your portfolio at
http://localhost/safwan/
If you want to develop directly in XAMPP without building:
- Keep your Vue source files in the project
- Use Vite dev server on port 5173 during development
- Only build and copy to XAMPP when ready for production
The portfolio has been pre-populated with Safwan Hakim's information. Update the following:
- Add your profile photo as
profile.jpgin theassetsfolder - The image path is already configured:
/assets/profile.jpg
Update with your personal information:
- Name: Currently "SAFWAN HAKIM"
- Role: Currently "Associate Software Manager"
- Location: Currently "Selangor, Malaysia"
- Social links (Email, LinkedIn, GitHub)
- Experience description
- Personal introduction text
- Personality traits (currently: Curious Cat, Problem Solver, Skeptical Thinker)
- Current experience is already populated
- Modify dates, companies, and responsibilities as needed
- Current projects are already added (Festivent, EZDisposal, Entrusol, TTDI Meatpoint)
- Update project URLs, descriptions, and tech stacks
Currently displays 24 technologies including:
- Languages: PHP, HTML, CSS, JavaScript, jQuery
- Frameworks: Laravel, Yii2, Node.js, Vue.js, WordPress, Node-Red
- Tools: Docker, MySQL, CouchDB, Redis, AWS, Git, Raspberry Pi, Arduino, MQTT, Nginx, Postman, Cloudflare, Hostinger
Add or remove technologies as needed.
All components use Tailwind CSS for styling. Edit component files to customize colors, spacing, and layout.
The portfolio includes:
- Hero - Introduction with social media links
- About - Personal info and statistics
- Technologies - Skills and tools you use
- Experience - Professional work history timeline
- Projects - Featured projects with images
- Services - What you can hire me for
- Pricing - Transparent starting prices (MYR) + monthly care plan
- Certificates - Credentials and training
- Footer - Contact CTA (WhatsApp / email)
Plus a floating AI chatbot that answers questions about services, pricing, and experience.
The chat widget streams replies from Ollama Cloud (default model: gemma4:31b-cloud).
The API key stays server-side only β the browser calls /api/ollama/chat, and the proxy
injects the Authorization header:
- Dev: Vite dev server proxy (see
vite.config.js) - Prod: nginx proxy with the key injected via envsubst (see
nginx.conf, rate-limited per IP)
- Get an API key at https://ollama.com/settings/keys
- Copy
.env.exampleto.envand setOLLAMA_API_KEY=... - Dev:
npm run dev(ordocker compose up -dβ the key is passed through) - Prod:
docker build -t portfolio . && docker run -p 80:80 -e OLLAMA_API_KEY=your-key portfolio
Without a key the widget still works β it falls back to a friendly "WhatsApp me instead" message.
To change the model, set VITE_OLLAMA_MODEL (e.g. deepseek-v3.1:cloud, gpt-oss:120b-cloud).
- Vue 3 (Composition API)
- GSAP (Scroll animations)
- Vite (Build tool)
- Tailwind CSS (Utility-first CSS via CDN)
- SVG Icons (Email, LinkedIn, GitHub)
- DevIcons CDN (Technology logos)
safwan/
βββ src/
β βββ components/
β β βββ Navbar.vue (Navigation bar)
β β βββ HeroSection.vue (Introduction section)
β β βββ AboutSection.vue (About me section)
β β βββ TechSection.vue (Technologies showcase)
β β βββ ExperienceSection.vue (Work experience)
β β βββ ProjectsSection.vue (Featured projects)
β βββ App.vue (Root component)
β βββ main.js (Application entry point)
β βββ style.css (Global styles & animations)
βββ assets/ (Profile images go here)
β βββ profile.jpg (Add your profile photo)
βββ dist/ (Built files - generated by Vite)
βββ index.html (HTML entry point)
βββ package.json (Dependencies & scripts)
βββ vite.config.js (Vite configuration)
βββ logo.svg (Favicon)
βββ README.md (This file)
- vue (^3.4.0) - Progressive JavaScript framework
- gsap (^3.12.0) - Animation library for scroll effects
- @vitejs/plugin-vue (^5.0.0) - Vite plugin for Vue
- vite (^5.0.0) - Build tool and dev server
No environment variables required for basic usage.
The project uses Vite for:
- Fast HMR (Hot Module Replacement)
- Optimized production builds
- Code splitting
- Asset optimization
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
- Technology icons are loaded from CDN (jsdelivr and GitHub)
- Ensure you have an active internet connection
- Some icons use Simple Icons which are black and white by design
- Make sure
profile.jpgexists in theassets/folder - Image should be a JPG/PNG format
- Recommended size: 320x320 pixels or larger
- Run
npm installto ensure all dependencies are installed - Delete
node_modulesandpackage-lock.json, then runnpm installagain - Make sure you're using Node.js v16 or higher
This is a personal portfolio template. Feel free to use and modify for your own projects.
Built with β€οΈ using Vue 3, GSAP, and Tailwind CSS