What yesid.dev is made of, how content becomes pages, and which parts run at request time.

Reference Value
Subject System context, components and the main data flow; for any new contributor
Verified source yesid-dev/yesid.dev main at f40e8704, checked 2026-11-07; media flow, analytics relay, redirects and design version re-verified on main at 0461e045, checked 2026-11-10
Support state Current system contracts checked against main f40e8704; main 0461e045 (#692) pins design v0.40.0. Public requests on November 7, 2026 returned the f40e8704 revision's /projects/yesid-dev-design 301 and max-image-preview:large robots tag

Context

yesid.dev is a trilingual (EN, FR, ES) portfolio and information site. Editors write in a Directus CMS. A build exports that content into typed modules, SvelteKit prerenders the pages, and Vercel serves them. Production visitors never cause a CMS content read; local Vite development may use the media fallback for unknown asset IDs.

flowchart LR
  ED["Editor"] --> CMS["Directus 12.5.1<br/>cms.yesid.dev on Railway"]
  CMS --> PG[("Neon Postgres")]
  CMS --> R2[("Cloudflare R2<br/>source media")]
  CMS -- "Publish site flow<br/>Vercel deploy hook" --> BUILD
  MAIN["Merge to main"] --> BUILD
  subgraph BUILD["Vercel production build"]
    EX["export-fallbacks.ts<br/>Build Bot read"] --> MOD["21 generated modules"]
    EX --> MIR["Committed mirrors and<br/>build-published CMS images"]
    MIR --> SK["SvelteKit prerender"]
    MOD --> SK
  end
  SK --> SITE["yesid.dev"]
  SITE --> V["Visitor"]
  V -.-> WF["Web3Forms<br/>contact"]
  V -.-> PL["/relay/e to Plausible<br/>cookieless"]
  V -.-> TR["transit.yesid.dev<br/>KPI API"]
  V -.-> WX["/api/weather<br/>OpenWeather"]

By default, every build that is not Vercel Production reads the committed fixture packages/shared/fixtures/export-data.json, so local work, CI and PR previews need no credentials. Explicit local operator live export is supported; Vercel previews require fixture content.

Components

Component Path Owns Runs on
Web app apps/web Routes, components, SEO, OG cards, sitemap, analytics, contact, Vercel build Vercel: prerendered pages plus Node 22 functions for endpoints
CMS apps/cms Directus image, schema as code, content exporter, fixture inputs, guarded operator scripts Railway, one Docker service
Shared contracts packages/shared Content types, Zod schemas, asset registry, export fixture Library imported by both apps
Design system @yesid/* from yesid.design release v0.40.0 Tokens, UI, motion, gates, seo-kit, analytics, i18n-core, config Installed by release URL, pinned by integrity in bun.lock

The monorepo uses Bun workspaces and Turborepo. Dependencies point one way: both apps import @repo/shared; shared never imports an app.

Request-time surfaces

Surface How it is served
Pages under /, /fr, /es Prerendered HTML; CDN cache headers set in hooks.server.ts
/api/weather Function; OpenWeather lookup with a 30 minute shared cache
/relay/e Function; forwards each Plausible event once with the visitor's address
/sitemap.xml, /robots.txt Functions reading generated content; host-aware indexing
/og/blog/*.png, /og/project/*.png Prerendered for known entries; unknown paths rewrite to the default card
/llms.txt, /llms-full.txt Prerendered from the same generated content
/work, /tech-stack, /services/internal-tooling, /services/sql-development, /projects/yesid-dev-design, three former Blog slugs of the four AI tools post Function permanent redirects

Browser-side calls go to Web3Forms (contact), the same-origin Plausible relay /relay/e, Vercel Web Analytics and Speed Insights (measurement, on the production host only), the Transit KPI API and same-origin endpoints such as /api/weather. Cloudflare's proxy injects its own Web Analytics beacon, which reports to same-origin /cdn-cgi/rum. The Content-Security-Policy connect-src list allows origins, not specific endpoints.

Invariants