Personal portfolio site for Phil Greene — data analyst and full‑stack developer. Built with Next.js 15 (App Router), React 19, TypeScript, and Tailwind CSS v4. It showcases projects, a blog, an about page, and a contact form with polished UI and subtle motion effects.
- Next.js 15 (App Router) + React 19
- TypeScript + ESLint (Flat config via
eslint.config.mjs) - Tailwind CSS v4 (design tokens via CSS variables in
app/globals.css) - Framer Motion (hero animations)
- shadcn/ui configuration scaffold (
components.json), not actively used for components
- Portfolio pages:
Home,Projects,Blog,About,Contact - Animated hero with Framer Motion and gradient visuals
- Projects grid backed by typed data models and helpers
- Consistent design system using CSS variables and Tailwind utilities
- Basic SEO metadata via
export const metadata - Responsive layout with sticky header and mobile nav
philgreene-net-fresh/app/layout.tsx: Root layout, global metadata, header injectionphilgreene-net-fresh/app/globals.css: Tailwind v4 setup, CSS variables, utilities, componentsphilgreene-net-fresh/app/page.tsx: Home page (Hero + Featured Projects + Services + CTA)philgreene-net-fresh/app/projects/page.tsx: Projects listing (grid + category counts)philgreene-net-fresh/app/blog/page.tsx: Blog listing (static sample posts)philgreene-net-fresh/app/about/page.tsx: About/skills/resume download cardphilgreene-net-fresh/app/contact/page.tsx: Client‑side contact form (no backend yet)philgreene-net-fresh/components/Header.tsx: Sticky responsive navphilgreene-net-fresh/components/HeroSection.tsx: Animated hero sectionphilgreene-net-fresh/components/ProjectCard.tsx: Card used in project gridsphilgreene-net-fresh/lib/projects.ts: Project data + helpers (e.g.,getFeaturedProjects)philgreene-net-fresh/types/projects.ts: Type definitions for projects/case studies/blog postsphilgreene-net-fresh/next.config.ts: Next.js config (defaults)philgreene-net-fresh/package.json: Scripts and dependencies
Note: The repository root also contains an app/ and components/ directory separate from philgreene-net-fresh/. This README documents the app under philgreene-net-fresh/.
Prerequisites:
- Node.js 18.18+ (or 20+ recommended)
- npm (repo includes
package-lock.json)
Install dependencies:
npm installRun the dev server:
npm run dev
# ➜ http://localhost:3000Build and start:
npm run build
npm startLint:
npm run lint- Environment variables: none required for local development.
- Tailwind: Tailwind v4 is imported in
app/globals.csswith a custom design token system (CSS variables for colors, radii, shadows, etc.). Dark mode uses the.darkvariant (@custom-variant dark). - Global styles are loaded via
import "./globals.css"inapp/layout.tsx. - Tailwind scans
pages,components, andappdirectories intailwind.config.js. - ESLint: Flat config extends
next/core-web-vitalsandnext/typescript.
- Projects are defined in
philgreene-net-fresh/lib/projects.ts#L1using theProjectandCaseStudytypes fromphilgreene-net-fresh/types/projects.ts#L1. getFeaturedProjects()filters featured items for the home page;projectsis used for the projects grid.- Screenshots referenced under
/projects/*.svgassume assets exist inpublic/projects/. Add files there or update paths.
- Add a new object to
projectsinphilgreene-net-fresh/lib/projects.ts#L1. - Provide a unique
idandslug,title,description,role,stack,outcomes,category,featured, andscreenshotpath. - Optionally add a case study entry in
caseStudiesif you want deeper details.
Home(philgreene-net-fresh/app/page.tsx): hero with typed typing effect, featured projects, services, and CTA.Projects(philgreene-net-fresh/app/projects/page.tsx): projects grid and category cards.Blog(philgreene-net-fresh/app/blog/page.tsx): static list of draft posts/categories for structure.About(philgreene-net-fresh/app/about/page.tsx): skills matrices and resume download CTA (/resume-phil-greene.pdf).Contact(philgreene-net-fresh/app/contact/page.tsx): client‑only form with simulated submission (console log); wire up to an API route to make it functional.
Recommended: Vercel
- Framework preset: Next.js
- Build command:
next build(uses Turbopack flag in package script) - Install command:
npm install - Output:
.next(default) - Use a single primary domain in your hosting provider and avoid conflicting
redirects between
philgreene.netandwww.philgreene.netto prevent redirect loops.
No special next.config.ts options are required for a basic deployment.
dev:next dev --turbopackbuild:next build --turbopackstart:next startlint:eslint
- Implement
/api/contact(or external email service) and connect the contact form - Add case study routes (
/projects/[slug]) using data fromcaseStudies - Replace static blog placeholder with content source (MDX, CMS, or file‑based)
- Add missing images to
public/projects/(or update references) - Consider enabling TypeScript strict mode for tighter type safety
- Add tests for data utilities and basic rendering checks
MIT — see philgreene-net-fresh/LICENSE.