The portfolio stores all content as TypeScript files in src/data/. This “data-as-code” approach provides compile-time type safety, eliminates database queries, and enables fast static builds.
sequenceDiagram
participant Build[Build Process]
participant Data[Data Files]
participant Component
participant Browser
Build->>Data: Import at compile time
Data-->>Build: Type-checked data
Build->>Component: Pass as props
Component->>Browser: Render to HTML
Browser->>Browser: No data fetching
Projects (src/data/projects.ts) — Employment history, personal projects, and portfolio items. Each project includes name, employer, dates, thumbnail path, optional YouTube URL, and action links.
Publications (src/data/publications.ts) — Academic publications with authors, abstracts, DOIs, and journal information. Publications can link to related projects.
Socials (src/data/socials.ts) — Social media profiles with platform names, URLs, brand colors, and icon components.
Keywords (src/data/keywords.ts) — SEO keywords array used in page metadata for search engine optimization.
Components import data directly using TypeScript path aliases:
import projects from '@data/projects';
import publications from '@data/publications';
No fetching, no loading states, no error handling. Data is guaranteed available at render time.
TypeScript interfaces enforce data structure. For project data, the interface requires:
id (string) — Must match thumbnail folder namename (string)title (string)url (string)urls array with link objects containing text, tooltip, icon, and urlcolor (string) for card stylingOptional fields include employer, dates, YouTube URL, and visibility flags.
See full interface definitions in src/data/projects.ts, src/data/publications.ts, and src/data/socials.ts.
Implementation: src/data/