# x70 portfolio > Personal portfolio for **Daniel Ensminger** (developer and product engineer): static marketing copy and CV data live in TypeScript (`content/site.data.ts`), while work history, patents, and blog posts are filesystem collections under `content/` parsed with gray-matter. The home page mixes that data with GitHub public activity, patents, and optional Edge Config–backed contribution calendars. Important notes: - **Content loading:** `lib/content.ts` reads `content/blog`, `content/work`, and `content/patents` (`.md`/`.mdx`), builds typed objects, estimates `readingTime`, and uses React `cache()` for deduplication. - **`/work/[role]`:** The dynamic segment is named `role` in the filesystem, but values are **work entry slugs** from frontmatter (e.g. `brainlab`, `hir3d`, `x70`), not job titles. - **Reading list:** About page books use Oku.club collection IDs in site data; `/api/cron/oku` fetches RSS into Vercel Edge Config key `oku`, which the UI reads at render time. - **Projects page:** “Open source” grid comes from the GitHub API for user `daniensi` with exclusions (forks, archived, certain repo names). Featured product cards come from `siteContent.projects.apps`. - **Featured blog:** `siteContent.home.featuredBlogSlug` must match a real post slug or the featured block renders empty. - **Sitemap:** `app/sitemap.ts` enumerates static routes plus every `/blog/[slug]`, `/work/[slug]`, and `/work/patents/[slug]` from the loaders. ## Pages - [Home](/): Hero, “currently”, patents strip, GitHub activity, featured Ski Bike Rack block, optional featured blog and contribution heatmaps. - [About](/about): Portrait, CV timeline (entries may link to `/work/{relatedSlug}`), markdown body from `content/about.md`, reading-list tabs from Edge Config. - [Work](/work): Companies and research grids, recommendations, clients section, patents summary linking to patent detail routes. - [Work entry](/work/[slug]): Long-form role or project write-up; optional embedded PDF when `document` is set in frontmatter. - [Patent detail](/work/patents/[slug]): Patent metadata, registry link, PDF, markdown body (e.g. ski bike rack). - [Projects](/projects): Product cards from site data plus live GitHub repo grid. - [Blog](/blog): Featured post (first with `featured: true` or else newest), remainder grouped by year. - [Blog post](/blog/[slug]): Post body, stats, and JSON-LD `BlogPosting`. - [Stack](/stack): Curated tools from `siteContent.stack.apps`. - [Contact](/contact): Hero and contact form (server action, Suspense-wrapped). ## Docs - [Vercel Edge Config](https://vercel.com/docs/edge-config): Populating `oku` (reading list) and `github` (contribution calendar) keys consumed by the UI. ## Examples - Work entries on disk include slugs such as `biosensors`, `brainlab`, `hir3d`, `x70`, `xams` under `content/work/`—each maps to `/work/{slug}`. - Blog slugs currently in `content/blog/` include `cursor-15-from-autocomplete-to-architect`, `dreame-l20`, `gemini-31-pro-deep-thinking-is-here`, `gpt-53-codex-it-finally-feels-like-an-agent`, `openclawd-sovereign-ai-without-the-setup-headache`, `roborock-s8-maxv`, `sonnet-46-my-new-daily-driver`, `why-im-refactoring-for-opus-46`. - Patent content example: `/work/patents/ski-bike-rack` ties the physical product narrative back to the separate Skirack marketing site. ## Optional - [Better Auth](https://www.better-auth.com/docs): Reference if you extend session handling beyond Convex comment auth.