A minimalistic, hacker-themed portfolio website with terminal aesthetics, typewriter effects, and Matrix-inspired design elements.
- Terminal Boot Sequence: Authentic system startup with typewriter effects
- Interactive Typewriter: Cycles through intriguing messages with realistic typing/backspacing
- Matrix Rain Effect: Subtle background animation with Japanese characters
- Terminal Navigation: Command-line style navigation between sections
- Responsive Design: Fully mobile-responsive with slide-out menu
- Multiple Themes: Switch between green, amber, blue, and red terminal themes
- Glitch Effects: Random glitch animations for extra hacker authenticity
- Contact Form: Professional contact form with loading states and validation
- Easter Eggs: Hidden features including Konami code activation
- SEO Optimized: Clean HTML structure and meta tags
samjackaman.dev/
βββ index.html # Main HTML structure
βββ style.css # All styling and animations
βββ script.js # Interactive functionality
βββ README.md # This file
This website is built with vanilla HTML, CSS, and JavaScript - no build process required!
- Clone or download the files to your desired location
- Upload all files to your web server or hosting platform
- Configure the contact form (see below)
- Access via your domain - the site will work immediately
Compatible with:
- Netlify (drag & drop deployment)
- Vercel
- GitHub Pages
- Any static file hosting service
- Apache/Nginx servers
- CDN deployments
Create a simple Dockerfile:
FROM nginx:alpine
COPY . /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]Build and run:
docker build -t samjackaman-site .
docker run -p 8080:80 samjackaman-siteSimply open index.html in any modern browser. For best results during development, use a local server:
# Python 3
python -m http.server 8000
# Node.js (with live-server)
npx live-server
# PHP
php -S localhost:8000The contact form currently uses a simulation function. To make it functional, you have several options:
Replace the simulateFormSubmission method in script.js with actual form submission:
async simulateFormSubmission(data) {
const response = await fetch('/api/contact', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
});
if (!response.ok) {
throw new Error('Form submission failed');
}
return response.json();
}- Sign up at Formspree.io
- Get your form endpoint
- Update the form submission:
async simulateFormSubmission(data) {
const response = await fetch('https://formspree.io/f/YOUR_FORM_ID', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
});
if (!response.ok) {
throw new Error('Form submission failed');
}
}- Add
netlifyattribute to the form in HTML:
<form class="contact-form" id="contact-form" netlify>- Update the JavaScript to use Netlify's form handling:
async simulateFormSubmission(data) {
const response = await fetch('/', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
'form-name': 'contact',
...data
})
});
if (!response.ok) {
throw new Error('Form submission failed');
}
}- Sign up at EmailJS
- Include their SDK in your HTML:
<script src="https://cdn.jsdelivr.net/npm/@emailjs/browser@3/dist/email.min.js"></script>- Update the submission function:
async simulateFormSubmission(data) {
return emailjs.send('YOUR_SERVICE_ID', 'YOUR_TEMPLATE_ID', data, 'YOUR_PUBLIC_KEY');
}Update the following sections in index.html:
- About Section: Update the JSON object with your details
- Skills Section: Modify skill categories and percentages
- Projects Section: Replace with your actual projects
- Contact Info: Update all contact details and social links
Typewriter Messages: Edit the typewriterMessages array in script.js:
const typewriterMessages = [
"Your custom message here...",
"Another intriguing message...",
// Add more messages
];ASCII Art: Replace the ASCII art in the sidebar (search for ascii-art class)
Colors & Themes: Modify CSS custom properties in style.css:
:root {
--primary-green: #00ff41; /* Main accent color */
--secondary-green: #00aa2b; /* Secondary accent */
--text-primary: #00ff41; /* Primary text color */
/* ... other variables */
}- Add HTML structure in
index.html - Add navigation link with
data-sectionattribute - Style in
style.css - Update navigation system in
script.js
- Ctrl/Cmd + K: Switch color themes
- Enter/Space: Skip boot sequence
- Escape: Close mobile menu
- Konami Code: Hidden easter egg (ββββββββBA)
- Click anywhere: Skip boot sequence
- Hover effects: Navigation and interactive elements
- Mobile swipe: Responsive navigation
Click "theme --switch" in the navigation or use Ctrl+K to cycle through:
- Matrix Green (default)
- Amber Terminal
- Blue Terminal
- Red Alert
Reduce Matrix Rain Effect: In script.js, modify the opacity or disable:
// Reduce intensity
this.canvas.style.opacity = '0.05';
// Or disable completely
// this.matrixRain.start();Optimize Animations: Adjust animation timing in CSS:
/* Faster typewriter effect */
.typewriter { animation-duration: 0.5s; }
/* Reduce glitch frequency */
/* Change interval in script.js from 10000 to 30000 */The site is fully responsive, but you can adjust breakpoints in style.css:
@media (max-width: 768px) { /* Tablet styles */ }
@media (max-width: 480px) { /* Mobile styles */ }Recommended: Modern browsers (Chrome, Firefox, Safari, Edge)
Supported Features:
- CSS Grid & Flexbox
- CSS Custom Properties
- ES6+ JavaScript
- Canvas API
- Fetch API
Fallbacks: The site degrades gracefully in older browsers, with core functionality maintained.
- Touch-friendly: All interactive elements are touch-optimized
- Slide menu: Mobile navigation with smooth animations
- Responsive text: Scales appropriately for all screen sizes
- Performance: Optimized animations for mobile devices
- No external dependencies: All code is self-contained
- Form validation: Client-side validation with server-side recommended
- XSS Protection: Safe innerHTML usage throughout
- HTTPS Ready: Designed for secure hosting
To add analytics, include your tracking code before the closing </head> tag:
<!-- Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=GA_TRACKING_ID"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'GA_TRACKING_ID');
</script>Contact form not working: Check browser console for errors and verify your form submission setup.
Animations not smooth: Ensure hardware acceleration is enabled in your browser.
Mobile menu not appearing: Verify CSS media queries and JavaScript event listeners.
Matrix effect performance issues: Reduce canvas opacity or disable on lower-end devices.
- Console Easter Egg: Check browser console for ASCII art
- Accessibility: ARIA labels and keyboard navigation
- SEO Friendly: Semantic HTML and meta tags
- Print Styles: Clean printing layout
- Dark Mode: Already implemented as default theme
This project is open source. Feel free to customize and use for your own portfolio!
Created with passion for clean code and beautiful design. Ready to deploy? Just upload and go! π