sahin.io

All skills and agents

page-founders

The founder pages on sahin.io/angel-investments - the Founder Directory, the per-founder profiles (/founder/{slug}) with their sourced-fact indexing rule, the Founder Network graph and the Founder Tracker. Use when building, rebuilding or changing any founder page, founder slugs, the founder registry (content/founders/public-founders.yaml) or founder indexing.

Source file
.claude/skills/page-founders/SKILL.md
Routes covered
/founders/founder/*/founder-network/founder-tracker

Founder pages

Routes

URL Kind Count React kind Indexing
https://sahin.io/angel-investments/founders legacyFeature (menu) 1 founders index
https://sahin.io/angel-investments/founder/{slug} reactPage (/founder family in FAMILIES) about 329 founderDetail index for about 15, rest noindex, follow
https://sahin.io/angel-investments/founder-network legacyFeature (menu) 1 founderNetwork index
https://sahin.io/angel-investments/founder-tracker legacyFeature (menu) 1 founderTracker index
  • Menu pages come from content/shared/navigation.yaml → LEGACY_MENU_PAGES (shared/publicNavigation.ts); static shell by renderLegacyFeaturePage(); React mapping in reactPageForRoute() (server/publicReactPages.ts).
  • /founder/{slug} is the /founder entry in FAMILIES (server/reactPageRoutes.ts): slugs from listFounderDetailSlugs, meta from founderDetailPageMeta, indexing from founderDetailIndexing, static shell by renderReactShellPage().
  • Render path: React body for all (scripts/generate-static.ts).

Files

  • Founder list: buildFounders(companies, records) in server/publicReactPages.ts: founders deduplicated by name across the enriched research records (loadEnrichedRecords(), reading client/public/enriched-company-data.json), names cleaned of trailing roles, X handles and LinkedIn URLs validated, ordered by a hidden research rank so slugs stay stable.
  • Network: buildFounderNetwork() in the same file: a node per founder per company, co-founder edges, and shared-background edges (BACKGROUND_KEYWORDS, at most MAX_EDGES_PER_KEYWORD = 20).
  • Profiles: server/publicPages/founderDetail.ts (listFounderDetailSlugs, skippedFounderDetailNames, founderSourcedFactCount, founderDetailIndexing, buildFounderDetailProps, founderDetailPageMeta, FOUNDER_INDEX_MIN_SOURCED_FACTS = 2).
  • Tracker: server/publicPages/founderTracker.ts (buildFounderTrackerProps, founderActivity).
  • Founder registry: content/founders/public-founders.yaml (source-backed records: slug, name, companySlug, relationship, biography, profileUrl, sources), loaded by loadPublicFounderDirectory() in server/publicFounderDirectory.ts.
  • Components: client/src/publicPages/FoundersPage.tsx, FounderDetailPage.tsx, FounderNetworkPage.tsx, FounderTrackerPage.tsx; types in types.ts (Founder, FoundersPageProps, FounderNetworkPageProps), founderDetailTypes.ts, founderTrackerTypes.ts; photos via founderPhoto.ts (founderPhotoUrl, founderInitials; see scripts/resolve-founder-photos.ts).
  • CSS: styles/founderDetail.css, styles/founderTracker.css; the directory (fd-*) and network (tl fn) classes live in client/src/index.css.
  • Copy: content/pages/founders.yaml, founder-detail.yaml, founder-network.yaml, founder-tracker.yaml; browser copy via client/src/generated/copy/pages/....

Sections on the page

  • /founders: eyebrow, title, counts subtitle, stats, education and experience groups (keywords from YAML), featured founders, search, market filter, sort (value, name, company), grid/table layout, empty state.
  • /founder/{slug}: back link, name, X and LinkedIn links, company count, companies (logo, market, stage, status, sourced company value, one-liner), related founders (co-founders first).
  • /founder-network: zoomable graph with search, node details linking to company pages.
  • /founder-tracker: stats, activity filter (Active, Exited, Company Closed), search, table of founder, company, status, activity and links. Activity comes only from the company's public status; a founder's later role is never inferred.

SEO

  • Profiles: founderDetailPageMeta() builds title and description from meta in founder-detail.yaml (description at most 155 chars); breadcrumb crumb is the name.
  • Indexing: a profile is indexable only with at least 2 sourced public facts from the founder registry for that founder's companies; others are noindex and stay out of the sitemap, llms files and IndexNow.
  • Menu pages: title from the navigation entry, description from the menu entry; JSON-LD via buildPageGraph() with an ItemList of context links.

Rules

  • Slugs follow the original scheme (lowercase, non a-z0-9 runs to "-", "-1", "-2" on repeats) so old URLs keep working; names that are not a person's name get no page. Do not reorder buildFounders.
  • Company values only from the sourced dataset (sourced(), sourcedValueUsd), never summed; counts per portfolio-counts-single-source.
  • Founder registry: public, source-backed facts only, HTTPS sources, no remote images, no private fields (private-data-boundary). Restricted vocabulary is filtered (findRestrictedTerms).
  • Words in YAML (page-content-yaml).

Tests

server/public-founder-directory.test.ts, server/route-indexing.test.ts, server/public-company-value.test.ts, server/public-react-document.test.ts, server/seo-route-manifest.test.ts, server/llms-text.test.ts, server/sitemap.test.ts.

Rebuild from scratch

  1. Implement buildFounders() and buildFounderNetwork() over the enriched research records.
  2. Add the menu entries in content/shared/navigation.yaml and map /founders, /founder-network, /founder-tracker in reactPageForRoute().
  3. Write content/founders/public-founders.yaml and server/publicFounderDirectory.ts.
  4. Write founderDetail.ts and add the /founder entry in FAMILIES with indexing: founderDetailIndexing; write founderTracker.ts.
  5. Add the YAML copy, types, components, registry entries and CSS (new-react-page).
  6. deploy-gate, then ui-before-after, then ship-to-production.