Transform one JSON Resume into a complete portfolio ecosystem: responsive website, interactive resume builder, AI-powered cover letter generator, and more. Built with Next.js 16, TypeScript, Tailwind CSS. Deploy to GitHub Pages in 10 minutes. Fully tested, customizable, and SEO-optimized.
Visit: https://ismail.kattakath.com
| Guide | Purpose | Audience |
|---|---|---|
| Quick Start | Deploy in 10 minutes | π€ End Users |
| Architecture | Technical deep-dive | π¨βπ» Developers |
| Claude Guide | Development reference | π€ Claude Code Sessions |
| Contributing | Contribution guidelines | π€ Contributors |
| Changelog | Version history | π Everyone |
| Detailed Guides | Feature-specific docs | π Power Users |
π New here? Start with QUICKSTART.md to get your portfolio live in 10 minutes!
- Zero Config Required - Works out of the box with sample data
- Single Source of Truth - Update one JSON file, changes everywhere
- JSON Resume Standard - Industry-standard format, portable across tools
- Optional Password Protection - Edit pages open by default, secure them if needed
- GitHub Pages Ready - Free hosting with automated deployment
- Fully Tested - 125+ tests ensure reliability
- SEO Optimized - Auto-generated sitemap and meta tags
- Mobile First - Beautiful on all devices
# Fork this repository on GitHub, then:
git clone https://github.com/YOUR-USERNAME/jsonresume-to-everything.git
cd jsonresume-to-everything# Install dependencies
npm install
# Start development server
npm run devOpen http://localhost:3000 - you'll see a working portfolio with sample data!
This is the most important step - make it yours!
Edit the single data file:
# Open in your editor
code src/data/resume.jsonUpdate your information (following JSON Resume v1.0.0 standard):
{
"basics": {
"name": "Your Name",
"label": "Your Professional Title",
"email": "[email protected]",
"phone": "+1 (123) 456-7890",
"url": "https://yourwebsite.com",
"summary": "Your professional summary...",
"location": {
"city": "Your City",
"region": "Your State/Province",
"countryCode": "US"
},
"profiles": [
{
"network": "GitHub",
"url": "https://github.com/yourusername"
},
{
"network": "LinkedIn",
"url": "https://linkedin.com/in/yourusername"
}
]
},
"work": [...],
"education": [...],
"skills": [...],
"certificates": [...]
}Need detailed guidance? See the Default Data Setup Guide for:
- Complete field explanations
- Best practices for each section
- Date formatting guidelines
- Skills organization tips
- Common customizations
Pro tip: Your changes will hot-reload automatically in the dev server!
Enable GitHub Pages:
- Push your changes to GitHub
- Go to repository Settings β Pages
- Source: GitHub Actions
- Done! Your site deploys automatically on every push to
main
Your portfolio will be live at: https://YOUR-USERNAME.github.io/jsonresume-to-everything/
Want a custom domain? See Custom Domain Setup below.
Update src/data/resume.json β basics section:
- Name, email, phone, location
- Professional title (
label) - Website URL
- Social media profiles (GitHub, LinkedIn)
Takes 5 minutes | Detailed Guide β
Update src/data/resume.json β work array:
- Company names and positions
- Employment dates (ISO format: YYYY-MM-DD)
- Achievements with metrics
- Technologies used
Takes 15 minutes | Detailed Guide β
Update src/data/resume.json β skills array:
- Group skills by category
- List technologies and tools
- Indicate proficiency levels
Takes 5 minutes | Detailed Guide β
Update src/data/resume.json:
educationarray - degrees and schoolscertificatesarray - certifications
Takes 5 minutes | Detailed Guide β
Edit pages are publicly accessible by default. Want to secure them?
# 1. Generate password hash
node scripts/generate-password-hash.mjs "your-password"
# 2. Add to .env.local
echo "NEXT_PUBLIC_EDIT_PASSWORD_HASH=<your-hash>" > .env.local
# 3. Add to GitHub Secrets for productionTakes 5 minutes | Complete Setup Guide β
- Hero - Name, title, contact info (from
resume.json) - About - Professional summary (from
basics.summary) - Skills - Technical expertise by category (from
skills) - Experience - Work history with achievements (from
work) - Contact - Email, phone, social links (from
basics)
- Interactive editor with live preview
- Drag-and-drop section reordering
- Import/Export JSON Resume format
- Password protected for security
- Print ready - triggers browser print dialog
- Cover Letter Mode - Switch between resume and cover letter editing with a tab interface
- Interactive tooltips - Contextual help on hover for all UI elements (react-tooltip)
- Onboarding tour - 12-step guided walkthrough for first-time users (onborda)
- Spotlight effect highlighting key features
- Progress indicator showing tour completion
- Covers all major features: dual mode, AI settings, import/export, forms, skills, and more
- Redirects to your calendar booking link
- Set via
basics.calendarinresume.json - Supports Google Calendar, Calendly, Cal.com
- Public JSON endpoint of your resume
- Standard format for other tools
- Automatically generated from
resume.json
graph TD
A["src/data/resume.json
JSON Resume v1.0.0"] --> B["Automatic Data Flow"]
B --> C["Homepage
all sections"]
B --> D["Unified Editor
/resume/builder
Resume & Cover Letter"]
B --> E["SEO Metadata
title, description"]
B --> F["OpenGraph Images
social sharing"]
B --> G["Sitemap
auto-generated"]
Key Point: Edit resume.json once, changes appear everywhere!
- Framework: Next.js 16.0.4 (App Router, Static Export)
- Language: TypeScript 5.9.2
- Styling: Tailwind CSS 4.1.13
- Animations: Framer Motion 12
- Icons: Lucide React
- Forms: @hello-pangea/dnd (drag-and-drop)
- Security: bcryptjs (password hashing)
- Validation: AJV (JSON Resume schema)
- Testing: Jest + React Testing Library
- Deployment: GitHub Pages + GitHub Actions
| Guide | Purpose | Time Required |
|---|---|---|
| Default Data Setup | β Customize your portfolio data | 30 min |
| Password Protection Setup | Secure edit pages | 5 min |
| AI Content Generator | Setup AI features | 10 min |
| Docs Overview | Documentation index | 2 min |
Want to update...
- Personal info? β Edit
basicsinresume.json - Work experience? β Edit
workarray inresume.json - Skills? β Edit
skillsarray inresume.json - Social links? β Edit
basics.profilesinresume.json - Colors/styling? β Edit
src/app/globals.css
Having issues?
- Check Troubleshooting Guide
- Run tests:
npm testto verify functionality - Open a GitHub issue
Automatic deployment via GitHub Actions:
-
Push to main branch:
git add . git commit -m "feat: customize portfolio" git push origin main
-
Enable GitHub Pages:
- Go to Settings β Pages
- Source: GitHub Actions
- Wait 2-3 minutes for deployment
-
Access your site:
https://YOUR-USERNAME.github.io/jsonresume-to-everything/
What happens automatically:
- β Tests run (deployment fails if tests fail)
- β Build static site
- β Generate sitemap
- β Deploy to GitHub Pages
- β Available at your GitHub Pages URL
Want portfolio.yourdomain.com instead of GitHub's URL?
-
Add CNAME file in project root:
echo "portfolio.yourdomain.com" > CNAME git add CNAME git commit -m "feat: add custom domain" git push
-
Configure DNS with your domain provider:
Type: CNAME Host: portfolio (or @) Value: YOUR-USERNAME.github.io TTL: 3600 -
Update GitHub Settings:
- Settings β Pages β Custom domain
- Enter:
portfolio.yourdomain.com - Enable "Enforce HTTPS"
DNS propagation takes 5-30 minutes.
This project also works on:
- Vercel:
vercel deploy(zero config) - Netlify: Drag & drop
out/folder - AWS S3: Upload
out/folder - Any static host: Use
out/directory afternpm run build
Comprehensive test coverage ensures reliability:
# Run all tests
npm test
# Run with coverage report
npm test:coverage
# Run specific test suites
npm test -- --testPathPatterns="password"
npm test -- --testPathPatterns="resume"
# Run in watch mode (during development)
npm test:watchTest Statistics:
- 125 total tests (112 passing, 13 minor failures)
- 89.6% pass rate
- Unit tests: Password config, PasswordProtection component
- Integration tests: Resume editor, Cover letter editor
- E2E tests: Complete user workflows
What's tested:
- β Password authentication flows
- β Session management (24-hour expiry)
- β Resume editor functionality
- β Cover letter editor functionality
- β Data import/export
- β Security features (bcrypt hashing)
See Test Documentation for details.
# Development
npm run dev # Start dev server (http://localhost:3000)
npm run build # Build for production (outputs to ./out)
npm start # Start production server
# Testing
npm test # Run all tests
npm test:watch # Run tests in watch mode
npm test:coverage # Run tests with coverage report
# Linting
npm run lint # Run ESLint
# Deployment
npm run deploy # Deploy to GitHub Pages (manual)
npm run deploy-auto # Deploy in background with logging
# Utilities
node scripts/generate-password-hash.mjs "password" # Generate bcrypt hashOptimized for all devices:
- Mobile (< 768px): Single column, touch-friendly
- Tablet (768px - 1024px): Enhanced layout
- Desktop (> 1024px): Full multi-column experience
Tested on:
- iOS Safari, Chrome
- Android Chrome, Firefox
- Desktop Chrome, Firefox, Safari, Edge
Edit src/app/globals.css:
@theme {
--color-primary: #your-color;
--color-secondary: #your-color;
--color-accent: #your-color;
}- Homepage sections:
src/components/sections/ - Unified editor (resume & cover letter):
src/app/resume/builder/page.tsx
Follow the adapter pattern:
- Add data to
resume.json - Update TypeScript types in
src/types/ - Create component in
src/components/ - Import in page
This project uses client-side password protection with bcrypt:
- β Suitable for personal portfolios
- β Deters casual access
- β No server/database required
β οΈ Can be bypassed by inspecting built files
For production apps requiring real security:
- Use server-side authentication
- Deploy to Vercel/Netlify with edge functions
- Implement proper user accounts
- β Use strong passwords (12+ characters)
- β Store password hash in GitHub Secrets
- β
Never commit
.env.localorpassword.ts - β Rotate passwords periodically
β οΈ Don't store sensitive data in resume.json
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
MIT License - feel free to use this template for your own portfolio!
This project builds upon and is inspired by the open-source community:
- JSON Resume to ATS Resume: Inspired by sauravhathi/atsresume - The resume builder and JSON Resume integration concepts were influenced by this excellent project.
- JSON Resume Standard: Built on the JSON Resume v1.0.0 specification
- Next.js Team: For the amazing React framework
- Tailwind CSS: For the utility-first CSS framework
- Open Source Contributors: Everyone who has contributed to the libraries and tools that make this project possible
- Documentation: Check docs/ directory
- Issues: GitHub Issues
- Discussions: GitHub Discussions
After setup, you can:
- Customize your data in
resume.json - Set up password protection for edit pages
- Configure custom domain
- Add Google Analytics (optional)
- Customize colors and styling
- Add more projects to showcase
- Ismail Kattakath - Original template creator
- Add yours by submitting a PR!
Next.js 16.0.4 β’ React 19.2.0 β’ TypeScript 5.9.2 β’ Tailwind CSS 4.1.13
Live Site: https://ismail.kattakath.com
Questions? Check the documentation or open an issue.