This Site: Designed & Shipped with AI

Designer, Developer & Operator · Solo · Astro · TypeScript · Vercel

Role
Designer, developer & operator (solo)
Stack
Astro · TypeScript · Vercel
Method
AI-directed, hand-verified
Year
2026

The case study you're standing inside.

I designed and shipped this site the way I teach AI to my studio: directed, not generated. Every screen, every component, every line of the deploy was AI-assisted, and every one of them went through me before it went live. You're reading the proof on the deliverable itself.

PORTFOLIO_SITE_BRIEF.md open in an editor, showing the site architecture rules, the home page spec with its ordered work grid and content-authority clause, and the case-study template every work page follows.
PORTFOLIO_SITE_BRIEF.md, the source of truth this site is built on. I had Claude interview me first, question by question, about what the work was and what had to stay true about it. It wrote the brief from my answers, and the brief has governed every page since.

01 — The brief I gave myself

A portfolio has to survive its own scrutiny.

The Brief

Design and ship a fast, accessible, self-owned portfolio, solo and end to end, that could pass the same review I put student work through: documented, reproducible, and defensible.

The Constraint

No page builder. If I tell agencies AI belongs inside a real production pipeline, my own site has to be a real production pipeline: code I own, on infrastructure I control, not a template with my name dropped in.

I chose Astro over a drag-and-drop builder on purpose. Astro ships static HTML with zero client-side JavaScript by default, which is the honest way to make a content site fast. It also gave AI a real, componentized codebase to work in instead of a locked template. TypeScript everywhere, deployed on Vercel. The result is a site I can reason about, version in git, and hand to any developer. Same standard I demand of a node graph.

0 Hydrated islands: no framework runtime ships
1 Codebase: designed, built & deployed solo
100% Owned code, versioned in git

02 — Directing the design

Art direction first. Generation second.

Same rule as my classroom: nothing gets generated until the intent is set. I established the system by hand, a restrained monochrome palette, a display/body type pairing, a strict grid, and the node-fan visual language that ties back to my AI work. Then I used AI to execute inside those rails, not to invent them.

The site's design tokens: seven monochrome custom properties from ink through page field, each with its hex value and its role, plus the layout tokens for max width, prose measure, and section spacing.
Every colour and measurement on the site, defined once in global.css.
Type specimen showing Poppins 700 as the display face and Lato 400 as the body face, above the four-step fluid scale of clamp() values used for h1, h2, h3, and body copy.
Two self-hosted families and a fluid scale, so type never needs a breakpoint.

The typography is self-hosted. Poppins and Lato are served from the project itself rather than fetched from a font CDN, so the look is locked, private, and fast. Fluid clamp() sizing means every headline scales cleanly from phone to desktop without a rack of breakpoints. AI drafted a lot of this CSS; I set the scale, the rhythm, and the constraints it had to stay inside.

“AI is a fast hand, not a creative director. The direction has to already exist before you let it draw.”

03 — From design to code

Turning a look into a system.

The site isn't a stack of one-off pages. It's a small design system. Every case study is composed from the same reusable Astro components: SectionLabel, Figure, Callouts, Stats, PullQuote. This page is built from the exact set the others use. Content lives in single-source data files (work.ts, site.ts, covers.ts), so a fact like my contact email or the order of the work grid is defined once and read everywhere.

That structure is a deliberate directing decision. AI is at its best filling in a clear pattern and at its worst inventing architecture on the fly. So I set the pattern (components in, data separated out, one source of truth per fact) and let AI move fast inside it. When it drifted, a hardcoded string that belonged in a data file, a bespoke layout that should have reused a component, I pulled it back. The node graph is the new creative brief; here, the component tree is.

The src directory tree: 20 reusable components, 2 layouts, 3 single-source data files, 6 routes including 7 case studies, one global stylesheet, and the source assets.
The whole site is 20 components, 2 layouts, and 3 data files.
Diagram showing work.ts and its WorkEntry interface feeding four consumers: index.astro for the grid, FeaturedCard for cards, CaseStudyLayout for page headers, and PrevNext for the case chain.
One typed file feeds the grid, the case pages, the OG cards, and prev/next.

04 — Shipping it: the part most portfolios skip

Design that doesn't deploy isn't finished.

"Fully deployed" means more than pushing to a host. This site runs on real production infrastructure, and I built the operational layer myself, with AI as the pair and my judgment on every security-relevant call.

Edge password gate

A custom edge middleware gated the private preview before launch. It ran before any page or asset was served, signed sessions with an HMAC key kept independent of the password, used constant-time comparison, and failed closed if its signing secret was missing. Removing one env var was the launch switch, and it has been flipped.

Build pipeline

Custom Node scripts generate the OG social cards, cut out the headshot background programmatically, and build a résumé in two forms: a designed PDF and an ATS-parseable version with an automated verification pass. A check-dist gate blocks a bad build from shipping.

Performance & SEO

Static HTML on Vercel, an auto-generated sitemap, self-hosted fonts, and responsive images sized at build time. Vercel Speed Insights and Analytics run in production so performance is measured on real visits, not just a lab score.

Owned & reproducible

Every asset is tracked and every placeholder is logged by a reporting script. Each generated artifact, the OG cards, the headshot cutout, the résumé PDFs, rebuilds from source with its own committed script. Same standard I hold student work to: if you cannot document how it was made, it does not ship.

The request path through the edge gate: request, edge middleware, the SITE_PASSWORD check, the SESSION_SECRET check which fails closed when absent, the HMAC session check, and finally static HTML from Vercel.
Every request ran this gauntlet before a byte of content was served.

05 — Where AI got it wrong

The corrections are the craft.

This is the section prompt-and-pray portfolios never write. AI got real things wrong, and catching them is exactly the accountability I teach.

The disappearing spaces. An AI-suggested config turned on HTML compression, which quietly stripped the newline between text and inline tags like <strong> and <a>, deleting the space between words wherever a line wrapped in the source. Copy read fine in the editor and broke on the page. The fix was deliberate: compressHTML: false, with a comment explaining why, so no future edit silently re-breaks it.

Before and after of the compressHTML bug: the same source line ships as 'The typography isself-hosted' with compression on, and correctly as 'The typography is self-hosted' with it off.
The bug read fine in the editor and only appeared on the page.

The security model. The first pass at the preview gate would have signed session cookies with the site password itself, which turns a captured cookie into an offline password-cracking oracle. I directed the rewrite: an independent signing secret, fail-closed behavior when it's absent, and a deliberate delay on failed attempts. AI wrote the code; the threat model was mine.

“Anyone can generate a website. Knowing which of its answers to overrule is the whole job.”

06 — What this is not: Against AI slop

The widespread problem this site refuses to be.

AI-generated portfolio sites are everywhere now. Some of them look stunning: incredible animations, smooth page scroll effects, interactions that wow on first load. Then you look deeper. Speed? Neglected. Accessibility? Skipped. Security? Never considered. Fact-checking? Zero. The codebase underneath? Bloated and heavy. It's prompt and pray at its finest: someone who "knows AI" tells the software to "make a cool website with lots of motion and animations," watches the first output, and ships it without ever reading what the AI actually produced. The site looks like the designer knows their craft. The code says otherwise.

Those sites treat AI as a finish button, not a tool inside a production pipeline. The person using it never asks: Who is going to use this? How are they going to use it? Where is this product going? Is the codebase I'm shipping light, medium, or unnecessarily heavy? What happens when a mobile user on 3G hits this page? Can someone navigate this without a mouse? If I need to change a fact or fix a bug, can I do it without calling the AI back in? They skip all of that. They get animations and call it done.

This site is the opposite.

Everything here is rooted in intention. It is directed, not generated. Every motion has a reason. Every component is measured. The codebase is light, transparent, and owned. If a claim doesn't match the code, it doesn't ship. If a user can't access it, I don't publish it. If I can't explain why a decision was made, it gets reversed.

07 — Proof

Measured, not asserted.

The site reports its own vitals from production via Vercel Speed Insights. Every number below is field data from real visits, not a lab run, and the page weight is measured transferred bytes. No score I can't show you the source of.

100 Real Experience Score, desktop (field)
0.22s Largest Contentful Paint (field)
263kB Page weight, home route
Vercel Speed Insights showing a Real Experience Score of 100 rated Great, with First Contentful Paint 0.14s, Largest Contentful Paint 0.22s, Interaction to Next Paint 0ms, Cumulative Layout Shift 0, First Input Delay 1ms, and Time to First Byte 0.02s. Every listed route scores 100, with no poor and no needs-improvement scores.
Real Experience Score 100 from production traffic. Field data from real visits, not a lab run.

08 — What it proves

My AI & Design course is where I direct two sections of designers through AI production every semester. This site is the same discipline turned on myself, solo: design system, component architecture, edge security, build automation, and deploy. AI-accelerated end to end, and human-directed at every decision that mattered. The medium is the message. You're looking at it.

Want this kind of AI-directed process on your team or in your classroom?

Get in touch →