This is Sem Postma's Portfolio Website — a modern, performant personal portfolio built with React, TypeScript, Vite, and Tailwind CSS. The site showcases professional experience, skills, and project case studies.
Live Site: https://sem-postma.com
- Framework: React 19 with TypeScript
- Build Tool: Vite 8
- Styling: Tailwind CSS 4
- Content: MDX (Markdown + JSX)
- Visualizations: D3.js for interactive skill charts
- Deployment: GitHub Pages via gh-pages
├── src/
│ ├── components/ # React components (CasePage, ContentPage, Glitch, etc.)
│ ├── content/ # MDX content files (numbered for ordering)
│ ├── styles/ # CSS styles (main.css with Tailwind)
│ └── types/ # TypeScript type definitions
├── plugins/ # Custom Vite plugins
│ ├── favicon-generator/ # Auto-generates favicons from SVG
│ ├── humans-txt/ # Generates humans.txt
│ ├── remark/ # MDX processing plugins
│ └── sitemap/ # Auto-generates sitemap.xml
├── public/ # Static assets
│ ├── fonts/ # JetBrains Mono & Material Design Icons
│ └── images/ # Project images and tech logos
└── dist/ # Build output (gitignored)
pnpm dev # Start development server with HMR
pnpm build # Build for production
pnpm preview # Preview production build
pnpm deploy # Build and deploy to GitHub Pages
pnpm typecheck # Run TypeScript type checking
pnpm format # Format code with PrettierContent is written in MDX files in src/content/. Files are numbered for ordering:
01_home.mdx- Landing section01a_about.mdx- About section02_values.mdx- Core values03_recommendations.mdx- Testimonials04_skills.mdx- Skills overview04b_skillchart.mdx- Interactive D3 skill chart05_interests.mdx- Personal interests08-15_*.mdx- Project case studies
The project uses custom Vite plugins in plugins/:
- favicon-generator: Converts
public/favicon.svgto multiple favicon formats - humans-txt: Generates
humans.txtwith author info - sitemap: Auto-generates
sitemap.xmlfrom routes - remark/external-links: Adds
target="_blank"to external links in MDX
- Use TypeScript for all new code
- Follow dprint formatting (see
dprint.json) - Use Tailwind CSS utility classes for styling
- Components go in
src/components/ - Content goes in
src/content/as MDX files - Keep images optimized and in appropriate formats (SVG preferred for icons)
- The site deploys to
sem-postma.comvia GitHub Pages - Node.js 20+ is required (see
.nvmrc) - Use pnpm as the package manager
- The D3 skill chart in
src/d3-techs-bubblechart.tscreates an interactive bubble visualization