page-vc-portfolios
The five "portfolio in a firm-inspired style" pages (a16z, Sequoia, Accel, Founders Fund, YC) on sahin.io/angel-investments, which show the whole public portfolio as a design homage. Use when building, rebuilding or changing any of them, their shared company list, filters, featured carousel or homage line.
- Source file
.claude/skills/page-vc-portfolios/SKILL.md- Routes covered
/a16z/sequoia/accel/founders-fund/yc
VC-style portfolio pages
Routes
| URL | React kind |
|---|---|
| https://sahin.io/angel-investments/a16z | a16z |
| https://sahin.io/angel-investments/sequoia | sequoia |
| https://sahin.io/angel-investments/accel | accel |
| https://sahin.io/angel-investments/founders-fund | foundersFund |
| https://sahin.io/angel-investments/yc | yc |
- Manifest kind
reactPage, 5 routes, allindex. They areSINGLE_PAGESentries inserver/reactPageRoutes.ts;createSeoRouteManifest()adds them fromreactRouteSpecsFor(). - Render path: React.
renderReactShellPage()inserver/seoRouteManifest.tswrites the static shell (head, breadcrumb, minimal header);scripts/generate-static.tscallsreactPageForRoute()(server/publicReactPages.ts) and the React page replaces the body. - They are not menu pages; breadcrumb names come from
content/pages/page-crumbs.yaml.
Files
- Shared props:
server/publicPages/styledPortfolio.ts:buildStyledPortfolioProps(ctx)(every company: name, href, logo, market, market group, status, stage, stage group, year founded, one-liner, rank by company value),featuredIndices(),alphabeticalMarkets(),homageLine(),countsLine(),FIRM_META_SHAPE,stageGroupOf(). - Per-firm builders (only copy plus featured picks):
server/publicPages/a16z.ts,sequoia.ts,accel.ts,foundersFund.ts,yc.ts, each exporting<firm>PageMetaandbuild<Firm>Props. - Components:
client/src/publicPages/A16zPage.tsx,SequoiaPage.tsx,AccelPage.tsx,FoundersFundPage.tsx,YcPage.tsx; shared parts instyledPortfolioParts.tsx(Dropdown,Logo,SORTS,STATUS_FILTERS,applyFilters,sortCompanies,useCarousel,sharedCopy) andstyledPortfolioTypes.ts(StyledCompany,StyledPortfolioProps). - Types:
a16zTypes.ts,sequoiaTypes.ts,accelTypes.ts,foundersFundTypes.ts,ycTypes.ts; registered inclient/src/publicPages/types.ts,components.client.ts,components.server.ts. - CSS:
client/src/publicPages/styles/{a16z,sequoia,accel,foundersFund,yc}.css, imported fromclient/src/index.css. - Copy:
content/pages/{a16z,sequoia,accel,founders-fund,yc}.yaml(meta title and description,firm,firmFullName,heading, labels, filters) and the sharedcontent/pages/styled-portfolio.yaml(section names, stage names,homage,counts, years). Browser copy viaclient/src/generated/copy/pages/...(node scripts/sync-site-copy-module.mjs). - Data:
ctx.companies(public portfolio, sorted by company value) and the enriched research file read byloadEnrichedRecords()(stage, year founded).
Sections on the page
- Firm-styled top bar and heading (
headingfrom the firm YAML), with the visible homage line (homageLine(firmFullName): a design homage, not affiliated). - Intro counts line (
countsLine: companies, markets, companies with a sourced company value of $1B or more viasourcedValueCount). - Featured strip or carousel. a16z: exits (public or acquired) then the 12 largest live
companies; Sequoia: top 20 by company value plus a
note; the others pick in their own builder. - Filters (sort, market/focus, stage, status, year), search, grid/list toggle.
- Company grid or list linking to each https://sahin.io/angel-investments/{company} page.
SEO
- Title and description:
metain the firm YAML (exported as<firm>PageMeta), titles at most 60 characters (fitPageTitle). - Canonical
https://sahin.io/angel-investments/<path>; JSON-LD frombuildPageGraph()with kindreactPage(CollectionPage plus BreadcrumbList). In the sitemap and llms files (indexable). - Query targeting is checked by
server/keyword-[redacted].test.ts; do not let these pages target queries other pages own.
Rules
- Never use a firm's logo or wordmark. Copy layout, type and imagery; put Sahin's own mark in that
slot (owner rule "No VC firm logos in themes"; see
server/vc-theme-management.test.ts). - Every page must carry the homage line; never imply affiliation with the firm.
- Counts come from the portfolio (
portfolio-counts-single-sourceskill); no hard-coded numbers. - Company values only from the sourced dataset (
sourcedValueCount,sourced()); never summed. - No private deal data (
private-data-boundaryskill). Research text that trips the public content policy is dropped instyledPortfolio.ts. - All words in YAML (
page-content-yamlskill).
Tests
server/public-link-graph.test.ts(the five paths are in the link graph).server/public-company-value.test.ts(sourced company values only).server/public-content-policy.test.ts,server/content-in-yaml.test.ts.server/vc-theme-management.test.ts(no firm names or logos as wordmarks in the theme views).server/seo-route-manifest.test.ts,server/route-indexing.test.ts.
Rebuild from scratch
- Write
content/pages/styled-portfolio.yaml(shared words) and onecontent/pages/<firm>.yamlwithmeta,firm,firmFullName,headingand the firm's labels. Add the breadcrumb name tocontent/pages/page-crumbs.yaml. Runnode scripts/sync-site-copy-module.mjs. - Implement
buildStyledPortfolioProps(ctx)inserver/publicPages/styledPortfolio.ts. - Per firm, add
server/publicPages/<firm>.ts: load copy withloadPageContent(<file>, SHAPE), spread the shared props, setfirm,heading,disclaimer: homageLine(...),intro: countsLine(props),featured: featuredIndices(...). - Add
<firm>Types.ts, thePublicReactPageunion member intypes.ts, the component, and the lazy and server entries incomponents.client.ts/components.server.ts(seenew-react-page). - Add
styles/<firm>.cssand import it fromclient/src/index.css(seetheme-system). - Register
{ path, meta, page }inSINGLE_PAGESinserver/reactPageRoutes.ts. deploy-gate, thenui-before-after(desktop and mobile), thenship-to-production.