DOC/ Updated 2026-09-14
Architecture
Project structure, data flow, and how the site is built.
The site is a static Astro 7 build with TypeScript, styled with the YuTheme design language, deployed on Vercel. There is no server runtime.
Stack
- Astro 7 (static output)
- TypeScript
- pnpm (package manager, version pinned via
packageManager) - YuTheme tokens and editorial conventions (see design.md)
- Lucide icons inlined as raw SVG at build time, no icon runtime
@astrojs/sitemapfor sitemap generation- Fonts: Geist Variable and Geist Mono Variable via Fontsource
No React, no Tailwind, no client-side framework. The only client JavaScript is a small vanilla script for the mobile menu, scroll reveal, and scrollspy.
Structure
docs/ project documentation, served at /docs
public/
favicon.svg Ella monogram mark
og.png social card, 1200x630
robots.txt
src/
components/
Analytics.astro Umami hook, env-gated, inert by default
Footer.astro
Header.astro fixed header, scrollspy, mobile sheet
Icon.astro Lucide SVG map, typed icon names
sections/
Hero.astro headline + terminal card
About.astro
WhatIDo.astro card grid
HowIWork.astro
WhereILive.astro
SelectedWork.astro public work list
content.config.ts docs content collection (reads ./docs)
data/site.ts site constants: URLs, navigation
layouts/BaseLayout.astro document shell, SEO, JSON-LD
pages/
index.astro single-page home
docs/index.astro documentation index
docs/[...slug].astro individual documentation pages
styles/global.css YuTheme tokens, base styles, motion
Docs collection
Documentation pages read the docs/ folder of the repository root through an
Astro content collection defined in src/content.config.ts:
- the loader is
glob({ base: './docs', pattern: '**/*.md' }); - each entry needs frontmatter:
title,description,order,updated; - entries are rendered at
/docs/<slug>with an index at/docs.
Because the collection reads the same folder that is versioned in the repository, the docs stay in sync: one source of truth, two views (site page and repo files).
Data flow
- Build time: Astro loads the docs collection and generates all static
routes (
/,/docs/,/docs/*). - Content is prerendered; there is no server, no API, no runtime data.
- Analytics (Umami) is only injected when both
PUBLIC_UMAMI_SRCandPUBLIC_UMAMI_WEBSITE_IDare set at build time.
Conventions
- Semantic HTML with a single
h1per page. - Section headings ordered (
h2thenh3), never skipped levels. - External links open in a new tab with
rel="noopener noreferrer". - Reduced motion is respected everywhere: shimmer, reveals, and transitions
are gated behind
prefers-reduced-motion.