Live Demo: [https://jacobpillai.github.io/personal-portfolio/]
Timeline: 1 week (University Assignment)
Current Status: 0% planning stage, 60% Complete - Foundation Ready, Building Content Sections for documentation
About (oneβliner for GitHub): Personal portfolio built with HTML, CSS, Bootstrap, and vanilla JavaScript featuring projects, skills, and a working EmailJS contact form.
Full description: This repository contains my personal portfolio website showcasing selected projects, technical skills, and contact information. It is a responsive, mobileβfirst site using Bootstrap 5, custom CSS, and JavaScript for interactivity. The contact form is integrated via EmailJS to enable serverless messaging. The site is intended for recruiters and collaborators to quickly view my work and reach out.
- What: Added downloadable resume in multiple formats and a dedicated resume page with print support.
- Why: Gives recruiters an offline, ATSβfriendly copy; supports formal applications that require PDF/DOCX; TXT ensures maximum compatibility with parsers.
- Files (repo paths):
assets/cv/Jacob_Pillai_Resume.pdfassets/cv/Jacob_Pillai_Resume.docxassets/cv/Jacob_Pillai_CV.txt
- Resume Page:
pages/resume.html- Upgraded with Bootstrap layout and a top button group: PDF / DOCX / TXT / Print.
- Bottom helper bar repeats the download options and shows a short format tip.
- Print button uses
window.print(); page has simple print CSS for clean export.
- Homepage integrations:
index.html- Navbar: added
Resumelink βpages/resume.html. - Hero: visible βDownload CVβ CTA β
pages/resume.html. - Footer: direct quickβdownload buttons for PDF, DOCX, and TXT, plus a βView Resumeβ link.
- Navbar: added
- Accessibility: Buttons/links include clear labels and use semantic anchors with the
downloadattribute.
- Replace the files in
assets/cv/with the same filenames (recommended):Jacob_Pillai_Resume.pdfJacob_Pillai_Resume.docxJacob_Pillai_CV.txt
- If you change filenames, update both:
pages/resume.htmltop and bottom button groupsindex.htmlfooter quickβdownload buttons
- Commit and push:
git add assets/cv/* pages/resume.html index.html git commit -m "docs(resume): refresh resume files and links" git push
- Open
pages/resume.htmland click PDF/DOCX/TXT; ensure downloads start. - From the homepage footer, try the direct PDF/DOCX/TXT buttons.
- Use Ctrl+F5 if the browser caches old files.
- Keep the TXT resume ATSβfriendly (plain text, no special formatting).
- Prefer singleβcolumn layout and standard fonts when exporting PDF from DOCX.
- Avoid committing any secrets; only public resume assets live under
assets/cv/.
From C:\Users\jacob\Documents\Portfolio_site:
git init
git branch -M main
git remote add origin https://github.com/JacobPillai/personal-portfolio.git
git add .
git commit -m "feat: initial portfolio"
git push -u origin mainIf it says that the origin link already exists:
git remote set-url origin https://github.com/JacobPillai/personal-portfolio.git
git push -u origin main- In the repo: Settings β Pages β Source:
Deploy from a branch - Branch:
mainand folder:/root - Save. Your site will be served at the Pages URL shown.
- Authenticate with a Personal Access Token (PAT): GitHub requires a PAT for HTTPS pushes. When prompted for password, paste your PAT. To avoid repeated prompts on Windows, ensure credential manager is enabled:
git config --global credential.helper manager
- Remote already exists: Fix the remote target.
git remote -v git remote set-url origin https://github.com/JacobPillai/personal-portfolio.git
- Branch name mismatch (
mastervsmain): Standardize tomain.git branch -M main git push -u origin main
- Nonβfastβforward / rejected pushes: Pull with rebase, resolve conflicts, then push.
git fetch origin main git rebase origin/main # resolve conflicts β git add <files> git rebase --continue git push -u origin main - Merge conflicts: Open conflicted files, keep intended changes, then:
git add <resolved-files> git commit --no-edit || git rebase --continue
- Large/accidental files: Remove from history and ignore going forward.
git rm -r --cached assets/temp || git rm --cached <big-file> echo "assets/temp/" >> .gitignore git add . && git commit -m "chore: ignore temp/large files"
- Line endings on Windows: Prevent churn.
git config --global core.autocrlf true - Pages 404 or not updating: Ensure
index.htmlis at repo root, Pages is set tomain//root, and wait 2β3 minutes; purge cache with a noβcache refresh. - Keep secrets safe: Do not commit private keys/tokens. EmailJS public keys are okay by design, but never commit private credentials.
Quick safety checklist before git push:
- Run
git statusto review changes - Verify
.gitignoreexcludes temporary/large files - Pull latest (
git fetch && git rebase origin/main) if collaborating
- Name: Jacob Jayen Pillai
- Institution: INTI International College Subang
- Program: IT Student specializing in Frontend Development
- Email: jacobjayenpillai@gmail.com
- Assignment: Frontend Developer Portfolio Website
- Professional Showcase: Create a portfolio to demonstrate skills to tech companies and recruiters
- Learning Objective: Master HTML5, CSS3, JavaScript, Bootstrap, and EmailJS fundamentals
- Career Development: Build an online presence for internship and job applications
- Technical Growth: Practice modern web development techniques and responsive design
- Primary: Tech company recruiters and hiring managers
- Secondary: Potential clients and networking contacts
- Focus: User engagement, professional presentation, mobile accessibility
- Frontend: HTML5, CSS3, JavaScript ES6+
- Framework: Bootstrap 5.3.2 (responsive design)
- Icons: Font Awesome 6.4.0
- Fonts: Google Fonts (Inter + Poppins)
- Email Service: EmailJS (serverless contact form)
- Deployment: GitHub Pages / Netlify / Vercel (TBD)
- Semantic HTML Structure: Accessible, SEO-friendly markup
- Responsive CSS Design: Mobile-first approach using Bootstrap + custom CSS
- JavaScript DOM Manipulation: Interactive features and form handling
- EmailJS Integration: Serverless contact form functionality
- Professional Portfolio Development: Understanding modern web design principles
- Primary: Tech companies and IT recruiters
- Secondary: General companies looking for web development talent
- Focus: User engagement and intuitive navigation
Portfolio_site/
βββ index.html β
COMPLETE - Main portfolio page
βββ style.css β
COMPLETE - Bold & Professional theme
βββ script.js β
COMPLETE - Interactive functionality
βββ README.md β
COMPLETE - This documentation
βββ image/
β βββ jacob.jpg β
ADDED - Profile photo
βββ [Future additions]
βββ assets/ π PLANNED - Additional media
βββ projects/ π PLANNED - Project screenshots
βββ docs/ π PLANNED - Technical documentation
- index.html (120 lines): Complete semantic structure with Bootstrap integration
- style.css (382 lines): Professional CSS with animations and responsive design
- script.js (380 lines): Full JavaScript functionality including EmailJS setup
- image/jacob.jpg: Personal profile photo for hero and about sections
:root {
--primary-color: #101820; /* Rich Black */
--accent-color: #FEE715; /* Vivid Yellow */
--neutral-color: #F8F9FA; /* Light Gray */
--dark-color: #2C3E50; /* Dark Blue Gray */
--gradient-primary: linear-gradient(135deg, #101820 0%, #2C3E50 100%);
--gradient-accent: linear-gradient(135deg, #FEE715 0%, #FFD700 100%);
}- Body Text: Inter (Google Fonts) - Clean, professional readability
- Headings: Poppins (Google Fonts) - Bold, modern display font
- Font Weights: 300, 400, 500, 600, 700 for visual hierarchy
- YouTube References: codewithsadee, codehal, howtowebdev, javascript mastery
- Specific Video: Modern Portfolio Design
- GitHub Reference: @ritesh-0309
- Design Philosophy: Bold, professional, engaging with smooth animations
- Responsive navigation with smooth scrolling
- Mobile hamburger menu
- Brand/logo area
- Professional introduction
- Dynamic typing effect or animation
- Profile image/avatar
- Clear call-to-action buttons
- Social media quick links
- Student background and journey
- Learning philosophy and goals
- Tech stack visualization
- Professional interests
- Frontend Technologies: HTML5, CSS3, JavaScript ES6+
- Frameworks: Bootstrap 5
- Tools: EmailJS, Git/GitHub
- Interactive skill bars or cards
- Certification badges (if any)
- YouTube Content: Embedded videos or thumbnails
- GitHub Repositories: Live project links
- Project Cards: Technology used, descriptions, live demos
- Filter/category system (optional)
- Professional Links: LinkedIn, GitHub
- Content Links: YouTube channel
- Social media cards with follow buttons
- EmailJS Contact Form: Name, email, message fields
- Form validation with JavaScript
- Success/error message handling
- Loading states during form submission
- Contact information display
- Copyright information
- Additional social links
- Quick navigation links
- Semantic elements (
<header>,<nav>,<main>,<section>,<article>,<footer>) - Accessibility attributes (ARIA labels, alt texts)
- Meta tags for SEO optimization
- Open Graph tags for social sharing
- Bootstrap 5: Grid system, components, utilities
- Custom CSS: Unique styling and animations
- Responsive Design: Mobile-first breakpoints
- CSS Animations: Smooth transitions, hover effects
- Modern CSS: Flexbox, Grid, CSS Variables
- DOM manipulation and event handling
- Form validation and EmailJS integration
- Smooth scrolling navigation
- Mobile menu toggle
- Loading animations
- Scroll-triggered animations (optional)
- Service configuration at EmailJS Dashboard
- Template creation for contact form
- JavaScript integration with error handling
- User feedback system
- Complete HTML structure with all sections
- Integrate Bootstrap CDN and basic styling
- Set up responsive navigation
- Establish color scheme and typography
- Build and style Hero section
- Create About Me and Skills sections
- Implement Projects section with media integration
- Apply consistent styling across all sections
- Integrate EmailJS contact form
- Add JavaScript interactivity
- Implement responsive behavior
- Test cross-browser compatibility
- Complete testing on multiple devices
- Optimize performance and accessibility
- Update documentation
- Prepare for deployment
- Text editor (VS Code recommended)
- Modern web browser for testing
- EmailJS account setup
- Basic knowledge of HTML, CSS, JavaScript
- Clone or download project files
- Open
index.htmlin browser for live preview - Use Live Server extension for auto-refresh during development
- Test on multiple screen sizes using browser dev tools
Before we proceed with development, please provide the following information:
- Full Name: Jacob Jayen Pillai
- Professional Title: "Student Learning to be Frontend Developer"
- Institution: INTI International College Subang
- Bio: IT student learning programming and tools to leverage for improving productivity and business capabilities
- Photo:
image/jacob.jpg(profile photo for hero section) - Experience: Former IT Support Intern at Universal Robina Corporation
- LinkedIn: jacob-jayen-pillai-130a6233b
- GitHub: JacobPillai (5+ repositories)
- YouTube: @jacobpillai (30+ subscribers)
- Instagram: jacob_0922_
- Facebook: Profile Link
- Car Site: Live Demo
- Note Taking & Task Management: Live Demo
- Audio Editing Tool: Featured in YouTube content
- Video 1: ZIgk-ZD0mB0
- Video 2: ibxrZUSMny4
- Video 3: ygAJTwzMLAw
- Video 4: gDOzmTmSBM8
- Video 5: NMq1B9GY3ZM
- Primary: HTML5, CSS3, JavaScript ES6+, Bootstrap 5
- Tools: EmailJS, Git/GitHub, VS Code
- Learning: Frontend Development best practices
- Emphasis: Responsive design, user experience, modern web standards
CRITICAL: The foundation is complete! Here's exactly where to continue:
The index.html currently has a placeholder at line 114:
<!-- Placeholder for other sections - to be added next -->
<div id="sections-placeholder"></div>Replace this placeholder with:
- About Me section (with stats: 5+ projects, 30+ subscribers, etc.)
- Skills section (HTML 85%, CSS 80%, JavaScript 75%, Bootstrap 90%, Git 70%, EmailJS 65%)
- Projects section (Car Site, Note App, Audio Editor with live links)
- Videos section (5 YouTube videos with thumbnail gallery)
- Contact section (EmailJS form with validation)
- Footer section
Update these variables in script.js lines 7-9:
const EMAILJS_SERVICE_ID = 'your_service_id'; // Get from Jacob's EmailJS account
const EMAILJS_TEMPLATE_ID = 'your_template_id'; // Get from Jacob's EmailJS account
const EMAILJS_USER_ID = 'your_user_id'; // Get from Jacob's EmailJS accountmkdir assets
mkdir assets/images
mkdir assets/iconsFollowing GitHub's accessibility guidelines, ensure:
- All images have descriptive alt text
- Proper heading hierarchy (no skipped levels)
- Descriptive link text (avoid "click here")
- Plain language throughout
This README will be updated throughout development to track:
- Completed features
- Encountered challenges and solutions
- Code improvements and optimizations
- Deployment steps and final results
This section documents our development journey, following best practices from amarpan's README guide to maintain clear project documentation.
Milestone: Establish core HTML structure and Bootstrap integration
What We Built:
- β Complete HTML5 semantic structure with Bootstrap 5.3
- β Professional navigation with responsive mobile menu
- β Hero section with personal branding and social links
- β Meta tags for SEO optimization and social sharing
- β CDN integration (Bootstrap, Font Awesome, Google Fonts, EmailJS)
Key Features Implemented:
- Responsive navigation with Jacob's branding (
JacobPillai) - Professional hero section with call-to-action buttons
- Social media integration (GitHub, LinkedIn, YouTube, Instagram)
- Mobile-first responsive design approach
- Accessibility features with ARIA labels
Milestone: Implement Bold & Professional color scheme with modern CSS
Design Achievements:
- β Primary Color Scheme: Rich Black (#101820) + Vivid Yellow (#FEE715)
- β Typography System: Inter (body) + Poppins (headings) fonts
- β Modern CSS: CSS Variables, gradients, animations, and shadows
- β Responsive Design: Mobile-first breakpoints for all devices
- β Interactive Elements: Hover effects, smooth transitions, micro-interactions
CSS Features Implemented:
/* Color Variables */
--primary-color: #101820; /* Rich Black */
--accent-color: #FEE715; /* Vivid Yellow */
--gradient-primary: linear-gradient(135deg, #101820 0%, #2C3E50 100%);
--gradient-accent: linear-gradient(135deg, #FEE715 0%, #FFD700 100%);Visual Enhancements:
- Professional navigation with backdrop blur effect
- Hero section with animated geometric background
- Profile image with yellow border and hover scaling effect
- Smooth fade-in and slide-up animations
- Bouncing scroll indicator animation
Milestone: Add comprehensive interactivity and EmailJS integration
JavaScript Features Implemented:
- β EmailJS Integration: Complete setup (ready for service configuration)
- β Theme Toggle: Dark/Light mode with localStorage persistence
- β Navigation: Smooth scrolling + active link highlighting
- β Form Handling: Real-time validation with visual feedback
- β Video Integration: YouTube thumbnail click-to-open functionality
- β UI Enhancements: Scroll-to-top button, mobile menu auto-close
- β Performance: Image preloading and IntersectionObserver animations
Advanced Features:
- Real-time form validation with Bootstrap validation classes
- Skill progress bar animations triggered on scroll
- Console easter egg message for developers
- Mobile-optimized touch interactions
Problem: When attempting to replace the entire HTML content in one operation, the system encountered a timeout error due to the large file size difference.
Error Message:
Encountered a timeout when computing the diff between the original and modified contents
Solution Applied:
- Incremental Updates: Broke down the HTML structure into smaller, manageable chunks
- Strategic Approach: Started with essential foundation (head, navigation, hero) then built incrementally
- File Management: Used targeted search-replace operations instead of full file replacement
Lesson Learned: When working with large file transformations, incremental updates are more reliable than wholesale replacements.
Problem: Initial navbar brand linked to #home anchor, but user preferred direct file reference.
Change Made:
<!-- Before -->
<a class="navbar-brand fw-bold" href="#home">
<!-- After -->
<a class="navbar-brand fw-bold" href="index.html">Impact: Improved navigation UX by allowing users to refresh/reload the homepage directly.
Overall Progress: 60% Complete
| Component | Status | Progress |
|---|---|---|
| β HTML Foundation | Completed | 100% |
| β CSS Design System | Completed | 100% |
| β JavaScript Core | Completed | 100% |
| π§ About Section | Pending | 0% |
| π§ Skills Section | Pending | 0% |
| π§ Projects Gallery | Pending | 0% |
| π§ YouTube Videos | Pending | 0% |
| π§ Contact Form | Pending | 0% |
| π§ EmailJS Config | Pending | 0% |
| π§ Testing & QA | Pending | 0% |
| π§ Deployment | Pending | 0% |
- Build About Me section with professional bio and stats
- Create Skills showcase with progress bars and icons
- Implement Projects gallery with live links
- Add YouTube videos section with thumbnail gallery
- Configure EmailJS service with Jacob's email
- Test contact form functionality
- Add success/error message handling
- Implement form security measures
- Cross-browser compatibility testing
- Mobile device testing
- Performance optimization
- Deploy to hosting platform (GitHub Pages/Netlify/Vercel)
- Framework Choice: Vanilla HTML/CSS/JS + Bootstrap for maximum compatibility
- Color Scheme: Bold & Professional theme for strong visual impact
- Architecture: Component-based CSS with CSS variables for maintainability
- Performance: Lazy loading, image preloading, and optimized animations
- Accessibility: ARIA labels, semantic HTML, and keyboard navigation support
Tech Stack:
- Frontend: HTML5, CSS3, JavaScript ES6+
- Framework: Bootstrap 5.3.2
- Icons: Font Awesome 6.4.0
- Fonts: Google Fonts (Inter, Poppins)
- Email Service: EmailJS
- Tools: VS Code, Browser DevTools
File Structure Established:
Portfolio_site/
βββ index.html β
Complete
βββ style.css β
Complete
βββ script.js β
Complete
βββ README.md β
In Progress
βββ image/
β βββ jacob.jpg β
Added
βββ [Future assets]
Current State: Foundation is 100% complete and functional. You can view the hero section by opening index.html in a browser.
What's Working:
- β Professional navigation with Jacob's branding
- β Stunning hero section with animations
- β All CSS styling and JavaScript functionality
- β EmailJS framework (needs configuration)
- β Theme toggle, smooth scrolling, form validation ready
What's Missing:
- π§ About, Skills, Projects, Videos, Contact sections in HTML
- π§ EmailJS service configuration
- π§ Final testing and deployment
EXACT NEXT TASK: Add the About Me section after the hero section. Jacob's bio, stats (5+ projects, 30+ subscribers, 1+ year learning, 100% dedicated), and professional background are all documented above.
Following best practices from Modern Portfolio Development and learning from portfolio examples on GitHub, we successfully completed all major content sections.
Duration: 2 hours development time
Sections Added: Projects, Videos, Contact, Footer
Lines of Code Added: ~400 HTML + ~350 CSS
Key Achievement: Full portfolio functionality with professional presentation
This section documents every challenge encountered, solution implemented, and lesson learned during Phase 4 development.
- Real Live Projects: Car Site (Vercel), Note Taking App (GitHub Pages), Audio Editor (YouTube featured)
- Interactive Elements: Hover overlays, live demo links, GitHub repository links
- Technology Badges: HTML5, CSS3, JavaScript, Bootstrap, Local Storage, Web Audio API
- Professional Design: Card-based layout with image zoom effects and animated overlays
- 4 Featured Videos: Programming tutorials, web development, JavaScript fundamentals, tech tips
- Interactive Thumbnails: YouTube API integration for high-quality thumbnails
- Click-to-Watch: Opens videos in new tabs with proper attribution
- Channel Branding: Consistent Jacob Pillai channel promotion with subscriber count
- EmailJS Integration: Ready-to-use contact form with validation
- Form Validation: Real-time client-side validation with Bootstrap feedback
- Contact Information Cards: Email, LinkedIn, GitHub with direct action links
- Loading States: Professional UX with submission feedback and error handling
- Social Media Links: GitHub, LinkedIn, YouTube, Instagram with hover effects
- Copyright Information: Professional footer with current year
- Scroll-to-Top Button: Smooth scrolling enhancement for user experience
β Problem: When attempting to add large HTML sections in single operations, encountered timeout errors
Error: Encountered a timeout when computing the diff between the original and modified contents
β Solution Applied:
- Incremental Development Approach - Broke large sections into smaller, manageable chunks
- Placeholder Strategy - Used intermediate placeholders to manage large additions
- Sequential Section Building - Added Projects β Videos β Contact β Footer in stages
π― Best Practice Learned:
- Always use incremental updates for large file modifications
- Implement placeholder divs for complex sections before adding full content
- Test each section independently before combining
π§ Actionable Implementation:
<!-- Instead of adding 200+ lines at once -->
<div id="sections-placeholder"></div>
<!-- Add sections incrementally -->
<section id="projects">...</section>
<div id="videos-placeholder"></div>β Problem: User reported text visibility issues due to color mismatches across different sections
β Solution Applied:
- Comprehensive Color Audit - Reviewed every text element for WCAG compliance
- CSS Variable Consistency - Applied standardized color variables throughout
- Section-Specific Overrides - Used
!importantdeclarations where needed - Dark Theme Support - Added complete dark mode compatibility
π― Best Practice Learned:
- Always test contrast ratios during development, not after
- Use CSS custom properties for maintainable color systems
- Implement dark theme support from the beginning
π§ Actionable Implementation:
/* Standardized approach for text contrast */
#section .section-title {
color: var(--primary-color) !important;
}
#section .section-subtitle {
color: var(--text-light) !important;
}
/* Dark theme automatic handling */
.dark-theme #section .section-title {
color: white !important;
}β Problem: Ensuring consistent experience across desktop, tablet, and mobile devices for 4 new sections
β Solution Applied:
- Mobile-First Development - Started with mobile styles, then enhanced for larger screens
- Systematic Breakpoint Testing - Used consistent breakpoints (768px, 576px)
- Component-Specific Responsive Rules - Each section got tailored mobile optimizations
- Touch-Friendly Interactions - Ensured all interactive elements work on touch devices
π― Best Practice Learned:
- Design mobile experience first, then enhance for desktop
- Test every interactive element on actual mobile devices
- Use consistent breakpoint system across entire project
π§ Actionable Implementation:
/* Mobile-first approach */
.project-card {
/* Mobile styles first */
padding: 1rem;
}
@media (min-width: 768px) {
.project-card {
/* Desktop enhancements */
padding: 2rem;
}
}β Problem: Multiple animated sections could impact page performance
β Solution Applied:
- CSS-Only Animations - Used CSS transitions instead of JavaScript for better performance
- IntersectionObserver API - Triggered animations only when elements enter viewport
- Image Optimization - Used optimized external images and proper loading strategies
- Minimal JavaScript - Kept JavaScript functionality focused and efficient
π― Best Practice Learned:
- Prefer CSS animations over JavaScript for simple transitions
- Use IntersectionObserver for scroll-based animations
- Always optimize images and external resources
π§ Actionable Implementation:
// Efficient scroll-based animation
const observer = new IntersectionObserver(function(entries) {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);β Problem: Setting up EmailJS requires external service configuration that can't be automated
β Solution Applied:
- Complete Framework Setup - Built entire EmailJS integration ready for configuration
- Clear Documentation - Provided exact steps for EmailJS account setup
- Error Handling - Implemented comprehensive error handling for form submission
- Fallback Options - Included direct email links as backup contact method
π― Best Practice Learned:
- Build complete integration frameworks even when external setup is required
- Always provide fallback options for critical functionality
- Document exact configuration steps for future maintenance
π§ Actionable Implementation:
// Complete EmailJS framework ready for configuration
const EMAILJS_SERVICE_ID = 'your_service_id'; // Update these values
const EMAILJS_TEMPLATE_ID = 'your_template_id';
const EMAILJS_USER_ID = 'your_user_id';
// With comprehensive error handling
emailjs.send(EMAILJS_SERVICE_ID, EMAILJS_TEMPLATE_ID, formData)
.then(response => showFormStatus('success', 'Message sent!'))
.catch(error => showFormStatus('error', 'Please try again.'));/* Each section has its own CSS namespace */
#projects { /* Projects styles */ }
#videos { /* Videos styles */ }
#contact { /* Contact styles */ }
/* Reusable component classes */
.section-title { /* Consistent styling */ }
.section-subtitle { /* Consistent styling */ }- Plan β Build β Test β Integrate - Each section developed independently
- Version Control Mindset - Each major addition treated as a checkpoint
- Documentation During Development - Real-time progress tracking
- Loading States - Every interactive element provides feedback
- Error Handling - Graceful fallbacks for all potential failures
- Accessibility - ARIA labels, keyboard navigation, screen reader support
- CSS-First Animations - Hardware accelerated transitions
- Image Optimization - External CDN usage for better loading
- Minimal JavaScript - Efficient DOM manipulation and event handling
| Metric | Before Phase 4 | After Phase 4 | Improvement |
|---|---|---|---|
| HTML Lines | 120 | 776 | +547% content |
| CSS Lines | 382 | 1,235 | +223% styling |
| JavaScript Functions | 12 | 15 | +25% functionality |
| Sections Complete | 2 | 6 | 200% more content |
| Interactive Elements | 5 | 20+ | 300% more engagement |
| Mobile Breakpoints | Basic | Complete | Full responsive |
- Basic structure with hero and navigation
- Limited interactive elements
- Basic responsive design
- Modular CSS Architecture - Each section has dedicated styles
- Consistent Component Design - Reusable classes and patterns
- Comprehensive Error Handling - Graceful fallbacks everywhere
- Professional UX Patterns - Loading states, hover effects, animations
- Complete Responsive Design - Tested across all device sizes
- β Break large features into smaller, manageable pieces
- β Design mobile experience first, then enhance
- β Plan color scheme and contrast early
- β Document every challenge and solution immediately
- β Test each section independently before integration
- β Use placeholders for complex multi-section additions
- β Implement error handling from the beginning
- β Keep external dependencies (EmailJS) well-documented
- β Every interactive element needs feedback states
- β Provide multiple ways to achieve the same goal (contact)
- β Test on actual devices, not just browser dev tools
- β Performance matters as much as appearance
// Update these in script.js lines 7-9:
const EMAILJS_SERVICE_ID = 'service_xxxxxxx';
const EMAILJS_TEMPLATE_ID = 'template_xxxxxxx';
const EMAILJS_USER_ID = 'xxxxxxxxxxxxxxx';Steps:
- Create account at EmailJS.com
- Set up email service (Gmail recommended)
- Create contact form template
- Copy credentials to script.js
- Test contact form functionality
- GitHub Pages Setup - Enable Pages in repository settings
- Custom Domain (Optional) - Configure CNAME if desired
- Performance Testing - Google PageSpeed Insights verification
- Cross-Browser Testing - Chrome, Firefox, Safari, Edge
- Meta Tags - Add Open Graph and Twitter Card meta tags
- Structured Data - Implement JSON-LD schema markup
- Sitemap - Generate XML sitemap for search engines
- Analytics - Add Google Analytics tracking (optional)
This section documents the EmailJS integration challenges encountered and resolved during development, following our approach of recording both successes and failures with detailed reasoning.
Date Resolved: January 2025
Error Type: HTTP 400 - "The Public Key is invalid"
Root Cause: Incorrect EmailJS SDK initialization method for v3+
During contact form testing, EmailJS consistently returned a 400 Bad Request error with the message:
The Public Key is invalid meaning there's no key encrypting and decrypting the message or receiving the request at all. Therefore, To find your exact ID, visit your emailjs dashboard https://dashboard.emailjs.com/admin/account
Initial Assumptions (Incorrect):
- β Public key was wrong/corrupted
- β Template variables didn't match
- β Service ID or Template ID issues
Step 1: Template Variable Mismatch (Partially Correct)
- Issue Found: Form data structure didn't match EmailJS template variables
- Original Form Data:
{ to_email: 'jacobjayenpillai@gmail.com', from_name: document.getElementById('name').value, from_email: document.getElementById('email').value, subject: document.getElementById('subject').value, message: document.getElementById('message').value, reply_to: document.getElementById('email').value }
- Expected Template Variables:
{{name}},{{email}},{{title}},{{message}} - Solution Applied: Updated form data to match exact template variables
Step 2: Root Cause Discovery (Initialization Method)
- Issue Found: Using deprecated initialization syntax for EmailJS v3+
- Incorrect Code:
// WRONG - Object format (deprecated in v3+) emailjs.init({ publicKey: EMAILJS_PUBLIC_KEY, });
- Correct Code:
// CORRECT - String format for v3+ emailjs.init(EMAILJS_PUBLIC_KEY);
Final Working Configuration:
// EmailJS Configuration - WORKING β
const EMAILJS_SERVICE_ID = 'service_oq04ybe'; // Gmail Service
const EMAILJS_TEMPLATE_ID = 'template_73m38z2'; // Contact Us Template
const EMAILJS_PUBLIC_KEY = 'gJ-E18JRSDyKcCUpy'; // Valid Public Key
// Correct initialization for EmailJS v3+
(function() {
emailjs.init(EMAILJS_PUBLIC_KEY); // String parameter, not object
})();
// Form data matching template variables exactly
const formData = {
name: document.getElementById('name').value, // {{name}}
email: document.getElementById('email').value, // {{email}}
title: document.getElementById('subject').value, // {{title}}
message: document.getElementById('message').value // {{message}}
};EmailJS Template Variables (dashboard):
- Subject:
Contact Us: {{title}} - Content includes:
{{name}},{{email}},{{message}} - To Email:
jacobjayenpillai@gmail.com - From Email: Uses default email from service
- Reply To:
{{email}}
EmailJS SDK Version: v3+ (loaded via CDN)
<script src="https://cdn.jsdelivr.net/npm/@emailjs/browser@3/dist/email.min.js"></script>π Diagnostic Approach:
- Always check template variable names first - they must match exactly
- Verify initialization syntax matches your EmailJS SDK version
- Use enhanced error logging to get specific error details
- Test with known working values before assuming configuration issues
π Reference Documentation:
- EmailJS Installation Guide
- EmailJS GitHub SDK Repository
- Template variables must use double curly braces:
{{variable_name}}
- Using object initialization
{publicKey: "key"}with v3+ SDK - Mismatched template variable names between form and EmailJS dashboard
- Assuming public key is invalid when error might be initialization method
- Not checking SDK version compatibility with initialization syntax
β Success Verification:
- Console shows:
β EmailJS SUCCESS: 200 OK - Form displays success message to user and will appear in their gmail shortly after.
- Email arrives at
jacobjayenpillai@gmail.comand appears as a email - No 400 Bad Request errors in browser console again
Last Updated: 7 Aug 2025
Project Status: 100% Complete - EmailJS Working & Production Ready
Assignment Deadline: 1 week from start date
Current Milestone: Fully functional portfolio with working contact form for potiential employers and recruiters