How this site is built
This portfolio is a React 19 + Vite SPA styled with Tailwind CSS v4.
Animations are GSAP (ScrollTrigger reveals) with Lenis driving smooth
scrolling through the GSAP ticker.
SEO for humans and LLMs
The interesting part: the site is optimized for AI crawlers as much as
search engines.
- JSON-LD structured data —
Person, WebSite, and ProfilePage
schemas so machines get facts, not vibes
/llms.txt — a markdown profile for LLM crawlers
noscript fallback — the full profile in plain HTML for crawlers
that don't execute JavaScript
- Anti-scraper email — the address never appears as a complete
string anywhere in the served markup; it's assembled only on click
This blog
Posts are markdown files with frontmatter, loaded at build time with
Vite's import.meta.glob and rendered with react-markdown (GFM,
raw HTML for video embeds, rehype-slug for the table of contents,
rehype-highlight for code). Blog routes are code-split so the
portfolio bundle stays lean.
const modules = import.meta.glob("../content/blog/*.md", {
query: "?raw",
import: "default",
eager: true,
});
Adding a post is: drop a .md file in src/content/blog/, commit,
deploy.
← All posts