Justin Dorfman's Portfolio
Personal portfolio website showcasing videos, projects, and professional work.
Table of Contents
Cursor AI Skills
This repository includes custom Cursor AI skills to automate common tasks.
/add-video - Add a New YouTube Video
Automatically adds a new YouTube video to the portfolio with proper rotation.
Usage:
/add-video <YouTube URL>
Examples:
/add-video https://www.youtube.com/watch?v=abc123
/add-video https://youtu.be/abc123
What it does:
- Runs
node scripts/add-video.mjswith your URL - Extracts the video ID and fetches the title via YouTube's oEmbed API
- Prepends the video to
data/videos.json(newest first) - Regenerates the video section in
index.html(Horizontal Card 1 featured; oldest archived to More)
Manual CLI (same as the agent runs):
node scripts/add-video.mjs "https://www.youtube.com/watch?v=abc123"
node scripts/render-videos.mjs # re-render only, after editing data/videos.json
Optional overrides:
/add-video URL "Custom Title"
/add-video URL "Custom Title" "Category Name"
Video rotation order:
| Position | Action |
|---|---|
| Horizontal Card 1 | β New video goes here |
| Horizontal Card 2 | β Previous Horizontal Card 1 |
| Small Card 1 | β Previous Horizontal Card 2 (changes to small) |
| Small Card 2 | β Previous Small Card 1 |
| Small Card 3 | β Previous Small Card 2 |
| More Section | β Previous Small Card 3 (archived) |
Skill location: .cursor/skills/add-video/SKILL.md
/resume - Regenerate the Resume PDF
Checks whether resume.pdf is stale, then regenerates it from resume.html.
Usage:
/resume
What it does:
- Compares
resume.htmlandresume.pdftimestamps - Rebuilds
resume.pdffrom the HTML using headless Chrome - Reuses the existing local server when available, or starts a temporary one
- Verifies the generated PDF file
Skill location: .cursor/skills/resume/SKILL.md
/git - Stage, Commit, Push & Open a PR
Automates the full git workflow in one command.
Usage:
/git
What it does:
- Stages all changes
- Generates a commit message based on the diff
- Pushes to the remote branch
- Opens a pull request
Skill location: ~/.cursor/skills/git/SKILL.md (global skill)
Resume
The resume is static HTML with no build process. To update:
- Content: Edit resume.html directly (experience, skills, summary, etc.)
- "Last updated" date: Change the text at the bottom of the page
- Duration auto-calculation: Elements with
data-start-date="YYYY-MM"anddata-start-text="Month Year"automatically show "Month Year - Present (X years Y months)" at runtime - PDF: Run
./scripts/generate-resume-pdf.shor use/resumeto regenerateresume.pdf - man.html: A separate man-page style resume; update independently if you want it in sync
Deployment
This site is deployed on Cloudflare Pages. The wrangler.jsonc file configures the deployment settings for Cloudflare's Wrangler CLI.
Local Development
npx live-server
File Structure
βββ index.html # Main portfolio page
βββ data/
β βββ videos.json # Long-form videos (newest first); source of truth
βββ resume.html # Resume page
βββ man.html # Man page style resume
βββ scripts/
β βββ add-video.mjs # Add video + render index.html
β βββ render-videos.mjs # Regenerate video HTML from videos.json
β βββ migrate-videos-to-json.mjs # One-time HTML β JSON migration
β βββ generate-resume-pdf.sh # Generates resume.pdf from resume.html
βββ wrangler.jsonc # Cloudflare Pages deployment config
βββ AGENTS.md # AI agent instructions
βββ .cursor/
βββ skills/
βββ add-video/
β βββ SKILL.md # Video addition automation skill
βββ resume/
βββ SKILL.md # Resume PDF generation skill
# Global Cursor skills (not in this repo)
~/.cursor/skills/
βββ git/
βββ SKILL.md # Git workflow automation skill (/git)