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 |
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.
| 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.
| 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.
/images/cms/. A referenced image the build cannot publish fails the build.en, fr, es. English has no prefix.