Personal portfolio site built with Next.js 16, TypeScript, Tailwind CSS, and Framer Motion. Dark/cyberpunk aesthetic with terminal-inspired design.
Live: https://portfolio-one-beryl-60.vercel.app/
- Framework: Next.js 16 (App Router)
- Language: TypeScript (strict)
- Styling: Tailwind CSS + CSS custom properties
- Animations: Framer Motion
- Fonts: Orbitron + Share Tech Mono, self-hosted via
next/font - Deployment: Vercel
- Glitch effect on hero name (CSS
::before/::after+clip-path) - Scanline overlay + neon grid background (fixed CSS pseudo-elements)
- Staggered
fadeInentrance animations - Project cards with animated top-line on hover
- System status panel with pulsing indicators
- Fully typed data layer (
src/data/) - Static export ready
src/
├── app/
│ ├── globals.css # CSS variables, glitch keyframes, scanlines
│ ├── layout.tsx # Root layout + SEO metadata
│ └── page.tsx # Page composition
├── components/
│ ├── Nav.tsx # Fixed nav with animated underlines
│ ├── Hero.tsx # Glitch name, blinking cursor, CTA buttons
│ ├── StatusPanel.tsx # Live status indicators
│ ├── Projects.tsx # Project grid
│ ├── ProjectCard.tsx # Individual card with hover effects
│ ├── Experience.tsx # Community / teaching experience
│ ├── Skills.tsx # Tech stack by category
│ └── Contact.tsx # Contact links + footer
└── data/
├── projects.ts # Typed project data
└── skills.ts # Skill categories
src/data/cv.ts is the single source of truth. Three artifacts are generated from it:
| Artifact | Route / path | What it's for |
|---|---|---|
| HTML | /cv |
Readable CV + embedded schema.org/Person JSON-LD |
| JSON Resume | /cv.json |
jsonresume.org v1 — machine-readable, CORS-enabled |
public/MarcosZamora_CV.pdf |
Tagged, 1 page, what recruiters get |
Edit src/data/cv.ts, then regenerate the PDF:
npm run build
npm run cv:pdfNotes for future edits:
- Dates live in ISO (
YYYY-MM) plus adisplaystring. ATS parsers and LinkedIn autofill build the timeline from the ISO values, so keep them accurate. - The print styles are calibrated so the CV fits on one letter page at 9pt. If you add content,
re-run
npm run cv:pdfand checkpdfinfo public/MarcosZamora_CV.pdf | grep Pages. - Don't add
letter-spacingto the section headings: it makespdftotextextractSPEAKING & COMMUNITYasS P E A K I N G & CO M M U N I T Y, and ATS parsers stop recognising the section.
npm install
npm run devOpen http://localhost:3000.
Optimized for Vercel — just connect the repo and deploy. No additional configuration needed.
Marcos Zamora Sánchez · Costa Rica · zamoramarcos13@gmail.com