A modern, responsive personal portfolio website built with Next.js, TypeScript, and Tailwind CSS.
View the live site (Coming Soon)
This is a complete redesign of a 2018-era personal portfolio website, transforming it from a dated Material Design Lite implementation into a modern, accessible, and data-driven web application. The site features a cohesive visual design that balances professionalism with personality.
- β Responsive Design: Mobile-first approach with Tailwind CSS
- β Dark Mode: Theme toggle with localStorage persistence
- β Accessibility: WCAG AA compliant with semantic HTML and ARIA labels
- β Data-Driven: Content managed through JSON files for easy updates
- β Type Safety: Full TypeScript implementation
- β Print-Friendly: One-click resume PDF download
- β SEO Optimized: Next.js static export with meta tags
- β Interactive Animations: Typewriter effect for homepage text
- β Mobile-Optimized Layout: Image-first display on mobile devices
| Technology | Purpose |
|---|---|
| Next.js 14+ | React framework with App Router for SEO and performance |
| React 18+ | Component-based UI library with hooks |
| TypeScript | Type safety and better developer experience |
| Tailwind CSS | Modern utility-first CSS framework |
| JSON | Data storage for easy content management |
Krystropolis.github.io/
βββ app/ # Next.js App Router
β βββ layout.tsx # Root layout with Header/Footer
β βββ page.tsx # Home page
β βββ resume/ # Resume section
β βββ portfolio/ # Portfolio section
β βββ about/ # About section
βββ components/ # React components
β βββ Header.tsx # Navigation header
β βββ Footer.tsx # Footer component
β βββ PrintButton.tsx # Print resume button
β βββ ContactForm.tsx # Contact form with spam protection
β βββ TestimonialCarousel.tsx # Testimonial carousel component
β βββ ResumeNavigation.tsx # Resume navigation component
β βββ ShareButton.tsx # Share button component
β βββ ScrollToTop.tsx # Scroll to top button
βββ data/ # JSON data files
β βββ resume.json # Resume data
β βββ portfolio.json # Portfolio projects
β βββ about.json # About section content
β βββ contact.json # Contact page data
βββ lib/ # Utility functions
β βββ data.ts # Data loading helpers
βββ types/ # TypeScript types
β βββ index.ts # Type definitions
βββ public/ # Static assets
β βββ images/ # Images
βββ plans/ # Project documentation
β βββ implementation-progress.md # Progress tracking
β βββ website-redesign-plan.md # Original design plan
βββ next.config.mjs # Next.js configuration
βββ tailwind.config.ts # Tailwind configuration
βββ tsconfig.json # TypeScript configuration
βββ package.json # Dependencies
- Node.js 18+ installed
- Git installed
-
Clone the repository
git clone https://github.com/krystropolis/Krystropolis.github.io.git cd Krystropolis.github.io -
Install dependencies
npm install
-
Run the development server
npm run dev
-
Open your browser Navigate to http://localhost:3000
| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Build for production |
npm start |
Start production server |
npm run lint |
Run ESLint |
| Phase | Status | Description |
|---|---|---|
| Phase 1: Project Setup | β Complete | Next.js, TypeScript, Tailwind CSS configured |
| Phase 2: Data & Types | β Complete | TypeScript interfaces, JSON data files |
| Phase 3: Core Components | β Complete | Header, Footer, Layout with accessibility |
| Phase 4: Sections | β Complete | Resume, Portfolio, and About pages |
| Phase 4.5: Contact Page | β Complete | Contact form with spam protection |
| Phase 4.6: Homepage Enhancements | β Complete | Typewriter animation, mobile layout optimization |
| Phase 5: Deployment Setup | β Complete | Static export, GitHub Actions workflow |
| Phase | Status | Description |
|---|---|---|
| Phase 6: Content Refinement | π΄ Not Started | Update experience since 2018, refine copy |
| Phase 7: Testing & Optimization | π΄ Not Started | Cross-browser testing, accessibility audit |
| Phase 8: Deployment & Cleanup | π‘ Partial | Deployment configured, old files not removed, unused images identified |
For detailed progress tracking, see plans/implementation-progress.md.
All site content is managed through JSON files in the data/ directory:
Edit data/resume.json to add:
- Work experience
- Education history
- Skills and technologies
- Contact information
Edit data/portfolio.json to add:
- New projects
- Project descriptions
- Technology tags
- Project images
Edit data/about.json to modify:
- Personal introduction
- Interests and hobbies
- Background information
Edit data/contact.json to modify:
- Contact information
- Social links
- Form configuration
- Primary: Indigo (professional, trustworthy)
- Accent: Coral/Pink (playful, energetic)
- Background: Off-white/light gray (clean, readable)
- Text: Dark gray (high contrast, professional)
- Font Family: Inter (modern sans-serif)
- Headings: Bold, with consistent hierarchy
- Body: Clean with good line height (1.6)
- Consistent spacing scale (4px, 8px, 16px, 24px, 32px, 48px, 64px)
- Max-width containers (1200px desktop, 640px mobile)
- Semantic HTML elements (
nav,main,footer,article,section) - ARIA labels on navigation and interactive elements
- Focus indicators on all interactive elements
- Skip link for keyboard navigation
- Screen reader friendly structure
- WCAG AA color contrast ratios
The site is configured for automatic deployment to GitHub Pages via GitHub Actions.
-
Build the site
npm run build
-
Commit and push
git add . git commit -m "feat: update content" git push origin main
-
GitHub Actions will automatically deploy to GitHub Pages
- Go to repository Settings β Pages
- Set Source to GitHub Actions
- The workflow will build and deploy automatically on push
plans/website-redesign-plan.md- Original design plan and architectureplans/implementation-progress.md- Detailed progress tracking
This is a personal portfolio site, but suggestions and improvements are welcome!
This project is open source and available under the MIT License.
- Author: Krystal Elliott
- Email: e.krystal@gmail.com
- Location: Munich, Germany
- GitHub: krystropolis
Last Updated: January 26, 2026