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 byrenderLegacyFeaturePage(); React mapping inreactPageForRoute()(server/publicReactPages.ts). /founder/{slug}is the/founderentry inFAMILIES(server/reactPageRoutes.ts): slugs fromlistFounderDetailSlugs, meta fromfounderDetailPageMeta, indexing fromfounderDetailIndexing, static shell byrenderReactShellPage().- Render path: React body for all (
scripts/generate-static.ts).
Files
- Founder list:
buildFounders(companies, records)inserver/publicReactPages.ts: founders deduplicated by name across the enriched research records (loadEnrichedRecords(), readingclient/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 mostMAX_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 byloadPublicFounderDirectory()inserver/publicFounderDirectory.ts. - Components:
client/src/publicPages/FoundersPage.tsx,FounderDetailPage.tsx,FounderNetworkPage.tsx,FounderTrackerPage.tsx; types intypes.ts(Founder,FoundersPageProps,FounderNetworkPageProps),founderDetailTypes.ts,founderTrackerTypes.ts; photos viafounderPhoto.ts(founderPhotoUrl,founderInitials; seescripts/resolve-founder-photos.ts). - CSS:
styles/founderDetail.css,styles/founderTracker.css; the directory (fd-*) and network (tl fn) classes live inclient/src/index.css. - Copy:
content/pages/founders.yaml,founder-detail.yaml,founder-network.yaml,founder-tracker.yaml; browser copy viaclient/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 frommetainfounder-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 perportfolio-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
- Implement
buildFounders()andbuildFounderNetwork()over the enriched research records. - Add the menu entries in
content/shared/navigation.yamland map/founders,/founder-network,/founder-trackerinreactPageForRoute(). - Write
content/founders/public-founders.yamlandserver/publicFounderDirectory.ts. - Write
founderDetail.tsand add the/founderentry inFAMILIESwithindexing: founderDetailIndexing; writefounderTracker.ts. - Add the YAML copy, types, components, registry entries and CSS (
new-react-page). deploy-gate, thenui-before-after, thenship-to-production.