DVEDEE.COM
Full portfolio website for Dylan van Druten Photography — built from scratch with Claude Code, with no prior web development experience.
Overview
dvedee.com is a fully custom photography portfolio site built without using any web framework or template. The entire site — design, layout, functionality, and deployment — was built collaboratively with Claude Code. No prior HTML, CSS, or JavaScript experience was needed to ship it.
The architecture is intentionally simple: pure HTML/CSS/JS with no build step. Serverless Netlify Functions handle the backend concerns — contact form, Instagram feed, and client gallery delivery. The result is a fast, maintainable site that can be updated with a single file edit and a git push.
The live site is at dvedee.com.
What's Inside
- Portfolio galleries — masonry grid with lightbox for headshots, maternity, couples, families, and film pages. New photos are added by dropping a file in the folder — no HTML edits needed.
- Instagram strip — homepage pulls the latest posts via a serverless proxy that caches the response and keeps the API token server-side.
- Contact form — rate-limited to 5 requests per IP per hour, with a honeypot field to catch bots. Submissions are delivered via Resend.
- Blog — self-contained HTML post files with a curated index page. Posts cover photography advice and behind-the-scenes content.
- Client gallery — password-protected photo delivery system with Cloudflare R2 storage, presigned URLs, and auto-expiry. Documented separately as its own project.
- Google Reviews — manually curated review cards in the homepage HTML, kept up to date as new reviews come in.
Architecture
Pure HTML/CSS/JS — each page is a self-contained .html file. No framework, no bundler, no build step. Deployed to Netlify; a push to main on GitHub triggers an automatic deploy.
index.html # Homepage — gallery, about, reviews, Instagram strip
headshots / maternity / couples / families / films .html
about.html
contact.html
blog/
index.html
what-to-wear-for-headshots.html
how-i-edit-headshots.html
netlify/functions/
instagram.js # Proxies Instagram Graph API, caches response 1 hour
contact.js # Contact form handler, sends email via Resend
gallery.js # Serves portfolio image lists per category