Personal portfolio built with Next.js 16, React 19, and Tailwind CSS 4. All content lives in typed data files under src/data/, separate from the components that render it, so updating the site is usually a data change rather than a layout change.
- Data-driven content: Projects, experience, and skills are plain TypeScript files validated by the types in
src/types/. - Static case study pages: Each project with
hasDetailPage: truegets a pre-rendered page at/projects/[slug]. - Flash-free theming: A blocking inline script applies the saved (or system) dark/light theme before first paint. All colors flow from one set of CSS variables in
globals.css, so both themes stay in sync. - Scroll restoration: Returning from a case study restores the scroll position in the projects list.
- Live GitHub activity: The hero shows the time of the latest push, fetched at build time and revalidated every 10 minutes (ISR).
- Accessibility: Semantic HTML, keyboard navigation, visible focus states, a skip link, and
prefers-reduced-motionsupport via Framer Motion'sMotionConfig. - SEO: Per-project Open Graph metadata, JSON-LD person schema,
sitemap.xml, androbots.txt.
Ensure you have Node.js installed.
-
Clone the repository:
git clone <repository-url> cd PortfolioWebsite/app
-
Install dependencies:
npm install
Start the local development server:
npm run devThe application will be available at http://localhost:3000.
Build the application for production:
npm run buildStart the production server:
npm startThe application is configured via TypeScript files in src/data/.
General site settings (name, tagline, contact info) are in src/data/config.ts:
// src/data/config.ts
export const siteConfig = {
name: "Robin Morgenstern",
tagline: "Software Engineer",
// ...
};Projects are defined in src/data/projects.ts. Each entry supports:
hasDetailPage: Boolean to generate a dedicated case study page.slug: URL identifier.details: Extended metadata for the case study page.
Refer to PROJECT_GUIDE.md for the complete schema and examples.
src/
├── app/ # Next.js App Router pages, layouts, sitemap, robots
├── components/ # Reusable UI components
├── data/ # Centralized content and configuration
├── hooks/ # Custom hooks (scroll restoration, etc.)
├── lib/ # Data fetching (GitHub activity)
└── types/ # TypeScript definitions
- Styling: Tailwind CSS 4. Theme tokens (colors, surfaces, hairline borders) are CSS variables in
src/app/globals.csswith light-mode overrides under the.lightclass. - Motion: Framer Motion, kept to short entrance fades.
MotionConfig reducedMotion="user"disables transforms for users who prefer reduced motion. - Linting: ESLint configuration is provided in
eslint.config.mjs.