1. Product Overview
This project is a single-page React + Vite + Tailwind v4 website powered by MDX files. It showcases Edward Battistini’s selected work, projects, and experiments through a performant, modern, and SEO-friendly interface.
The site will function as a lightweight CMS: each MDX file defines a project (metadata + content). The app dynamically builds a projects grid, and clicking a card loads a project’s detail view.
Design direction: high contrast, monochrome minimalism — all content sits on either shades of black (dark mode) or shades of white (light mode).
2. Core Objectives
- Speed — Lighthouse 95+ scores for Performance, SEO, Accessibility.
- Simplicity — No backend, no database, content from MDX files only.
- Scalability — Easily add new projects by dropping new MDX files.
- SEO Ready — Metadata, sitemap, Open Graph, semantic structure.
- Design First — Smooth transitions, typography focus, subtle motion.
3. Technical Requirements
Tech Stack
- Vite — build system (fast dev + SSR/SSG-ready)
- React 18 — component-based SPA
- Tailwind CSS v4 — utility-first design system
- MDX — content format for projects
- React Router — for navigation between pages
- React Helmet Async — for SEO metadata
- Remark/Rehype plugins — for GFM, frontmatter, slugs
- Optional: vite-ssg or prerendering for static SEO export
MDX Structure
Each file in /content/ defines one project:
---
title: "Wakey Wakey"
summary: "A macOS Wake on LAN scheduler"
year: 2024
tags: ["macOS", "SwiftUI", "Automation"]
thumbnail: "/images/wakeywakey-thumb.jpg"
order: 1
---
import { Image } from "../src/components/Image.jsx"
# Wakey Wakey
A minimal macOS app that schedules Wake-on-LAN signals.
<Image
src="/images/wakeywakey-hero.png"
alt="Wakey Wakey interface"
/>
Frontmatter fields:
titlesummaryyeartagsthumbnailorder(sort index)
4. Information Architecture
Pages & Routes
| Route | Purpose |
|---|---|
/ | Home (intro, projects, about, contact) |
/project/:slug | Project detail view (from MDX) |
/* | Fallback 404 |
5. Functional Requirements
Home Page
- Hero Section
- Large intro headline (e.g. “Designer. Builder. Curious Human.”)
- Short description paragraph
- CTA to “View Work” or scroll down
- Projects Section
- Displays cards for each MDX project
- Card includes thumbnail, title, summary, tags
- Clicking opens
/project/:slug
- About Section
- Simple paragraph + optional photo or signature
- Mention skills, design philosophy, or selected highlights
- Contact / Connect Section
- Minimal contact text
- Icons linking to email, LinkedIn, GitHub, Instagram, etc.
Project Page
- Dynamic route loaded from MDX file.
- Hero banner: uses thumbnail or hero image.
- Content body: renders MDX (text, images, embeds, or React components).
- Optional React playgrounds embedded inline.
- Back button or breadcrumb to return to home/projects.
MDX Content Types Supported
- Markdown (text, headings, lists)
- Inline images/videos
- Custom React components (
<Image />,<Video />,<Playground />) - Code blocks and syntax highlighting (optional)
6. UI / UX Requirements
Theme
- Two visual modes:
- Dark Theme: shades of black, gray, white text
- Light Theme: shades of white, gray, black text
- Tailwind palette used consistently (
gray-950togray-50) - Theme toggle optional (can hardcode dark/light variant)
Layout
- Fixed width content container (
max-w-6xl mx-auto p-6) - Sticky or fading top navigation (Home, Work, About, Contact)
- Smooth scroll between sections
- Subtle transitions on hover and navigation
Typography
- Clean sans-serif (e.g. Inter or Geist)
- Headings: bold, tight letter spacing
- Body: high legibility, ~18px base
- Consistent rhythm between headings and paragraphs
Components
| Component | Purpose |
|---|---|
<Card /> | Display project thumbnail + summary |
<Image /> | Responsive image with rounded corners |
<Hero /> | Main intro area on Home |
<Footer /> | Contact links |
<MDXProvider /> | Custom renderers for h1–h6, p, img |
<BackButton /> | Navigate to previous view |
<Layout /> | Wrapper for consistent nav/footer |
7. SEO / Performance Requirements
Meta + Structured Data
- Title + meta description per page (from frontmatter)
- Open Graph + Twitter cards
- Canonical links
- robots.txt + sitemap.xml
- JSON-LD person schema (Edward Battistini)
Performance
- Lazy-load all images (
loading="lazy") - Use AVIF/WEBP with JPG fallback
- Preload critical font
- Responsive images with
aspect-[4/3] - No blocking scripts
Accessibility
- Semantic HTML (main, nav, header, footer)
- Focus-visible outlines
- Proper heading hierarchy
- Alt text for all media
8. Non-Functional Requirements
- Hosting: Netlify, Vercel, or GitHub Pages
- Build:
vite build→ static files in/dist - Maintainability: adding new project = new MDX file
- Scalability: future blog or “Now” section can reuse MDX loader
- Version control: GitHub repository
9. Deliverables
- Vite + React + Tailwind base project configured
- MDX pipeline (
import.meta.globwith frontmatter) - Home + Project routes fully working
- SEO setup (Helmet, sitemap, robots.txt)
- Placeholder content for 3 projects
- Light & dark theme variant
- Ready-to-deploy build
10. Stretch Goals (Phase 2)
- Add theme toggle (dark/light)
- Animated page transitions with Framer Motion
- Search or tag filter for projects
- RSS or JSON feed export
- Optional blog section using same MDX system
- MDX “Playground” React live component
11. Success Metrics
| Metric | Target |
|---|---|
| Lighthouse Performance | ≥95 |
| Lighthouse SEO | ≥95 |
| Accessibility | ≥90 |
| Time to Interactive | < 1.5s |
| Largest Contentful Paint | < 2.5s |
| Core Web Vitals (CLS/FID) | Green |