- 📱 Responsive design
- 🎨 Tailwind CSS for styling
- 🔒 Password-protected contact details with AES-256-GCM encryption
- 🖨️ Print-to-PDF functionality via browser
- 🤖 Auto-deployment to GitHub Pages with encrypted contact details
- 🚀 Hosted on GitHub Pages
The contact details are encrypted and require two GitHub secrets:
-
Go to your repository on GitHub
-
Navigate to Settings → Secrets and variables → Actions
-
Click New repository secret and add:
Secret 1:
CONTACT_DETAILS<div class="text-gray-600 flex flex-col sm:flex-row items-center justify-center gap-2 sm:gap-4"> <a href="mailto:your.email@example.com" class="hover:text-blue-600 transition-colors">your.email@example.com</a> <span class="hidden sm:inline">•</span> <span>+1 234 567 890</span> </div>
Secret 2:
ENCRYPTION_PASSWORDyour-secure-password-here
- Go to your repository on GitHub
- Navigate to Settings → Pages
- Under Source, select Deploy from a branch
- Choose gh-pages branch and / (root) folder
- Click Save
The site will be available at: https://<username>.github.io/cv/ 🌐
Important: The workflow will automatically create the gh-pages branch on first push to main.
-
In the DNS provider, add a CNAME record:
- Name:
cv - Value:
<username>.github.io
- Name:
-
In GitHub repository settings → Pages:
- Enter the custom domain:
cv.yourdomain.com - Click Save
- Wait for DNS check to complete
- Enable Enforce HTTPS 🔒
- Enter the custom domain:
To test the encryption locally:
-
Copy the example files:
cp contact-details.html.example contact-details.html cp contact-details.txt.example contact-details.txt
-
Edit
contact-details.htmlwith your actual contact details -
Edit
contact-details.txtwith your password -
Generate encrypted test file:
npm run encrypt
-
Open
index-test.htmlin your browser -
Click "Click to view contact details" and enter your password
npm run encrypt- Generate encrypted HTML for testing (index-test.html)npm run encrypt:plain- Generate unencrypted HTML (index-unencrypted.html)npm run test- Same as encrypt, with confirmation message
- Contact details are encrypted using AES-256-GCM with PBKDF2 key derivation (100,000 iterations)
- Encryption happens in the GitHub Actions workflow using secrets
- Only the encrypted version is deployed to GitHub Pages
- The password and contact details never appear in the repository
- Uses browser's native Web Crypto API (no external dependencies)
- Password prompt appears when user clicks the unlock button
- Wrong password shows an animated error popup with vibration (if supported)
- Decrypted content replaces the button seamlessly
- The "Download PDF" button opens the browser's native print dialog
- Print CSS removes the unlock button and formats for PDF
@page { margin: 0; }removes headers/footers for clean PDF output- Users can print with decrypted contact details (if unlocked) or without
This is a personal CV website. Feel free to fork and adapt for your own use. 💼