Developer Page Specifications
Details Page
/:lang/founders/{slug} — 10-section profile with 4 reverse-lookup rails.
Route: /:lang/founders/{slug}. Renders one founder in full — bio, startups, speaking history, files authored, opportunities applied to (when consented), coverage mentions, editorial articles authored. The "most-connected" entity surface on the platform: every section is a reverse-lookup from EcosystemEntityLinks. founder-led profiles add Founder Account edit affordances when the viewing user owns the profile.
Section order
- A · Breadcrumb (Home → Founders → {name})
- B · Hero (avatar 160×160 + name H1 + headline + role/country/verified pills + share CTA)
- C · Bio (full bio paragraph + LinkedIn/Twitter/personal-site link row)
- D · Startups (cards of every startup this founder is associated with)
- E · Speaking history (reverse-lookup of CalendarEvent.relatedFounderIds)
- F · Mentioned in Coverage (reverse-lookup of CoverageArticle.mentionedFounderIds)
- G · Files authored (reverse-lookup of FounderFile.authorIds)
- H · Editorial articles authored (reverse-lookup of EditorialArticle.authorIds when applicable)
- I · Related Founders (same country / same sector / same accelerator cohort)
- J · Footer (global)
B · Hero — fields
- avatar
- Source: Founder.AvatarUrl. 160×160 desktop, 96×96 mobile. SVG fallback as documented in card.
- name (H1)
- Source: FounderLang.DisplayName. Only H1 on the page.
- headline
- Source: FounderLang.Headline.
- role pill
- Source: Founder.PrimaryRole.
- country pill
- Flag + Country.NameLang.
- verified pill
- Show only when Founder.IsVerified=true.
- flavor pill
- Show only when flavor='founder-led'.
- edit profile CTA
- Visible ONLY when viewer.userId === Founder.OwnerUserId (founder-led ownership). Routes to /:lang/founder-account/profile/edit.
- share + LinkedIn + Twitter row
- Sources: Founder.LinkedInUrl, Founder.TwitterUrl, Founder.PersonalSiteUrl. Each opens new tab with rel=noopener.
C · Bio section — fields
- Bio paragraph — Source: FounderLang.Bio. Max ~600 words, rendered as sanitised HTML (markdown converted at edit time). Required: yes.
- Skills/expertise chips — Source: FounderSkills join. Display row of small chips. Optional.
- Languages spoken — Source: FounderLanguages join. Display as small pills.
D · Startups section
Source: bidirectional join FounderStartup (FounderId ↔ StartupId, Role, StartedYear, EndedYear?). Display each startup as a <app-startup-card variant="inline"> with the founder’s role at that startup overlaid as a small chip ("Co-founder · 2018-present" / "CTO · 2015-2020"). Sort: current first (EndedYear=null), then by StartedYear DESC.
E · Speaking history section
- Source: SELECT * FROM CalendarEvent WHERE Founder.Id = ANY(relatedFounderIds) ORDER BY startDate DESC. Reverse-lookup from CalendarEvent.relatedFounderIds.
- Display: list of <app-event-card variant="inline"> with the founder’s role at that event ("Speaker" / "Judge" / "Panelist") if available via FounderEventRole join.
- Up to 6 displayed inline + "See all {N} events →" link when N > 6.
- Hide section entirely when reverse-lookup returns 0 events.
F · Mentioned in Coverage
- Source: SELECT * FROM CoverageArticle WHERE Founder.Id = ANY(mentionedFounderIds) ORDER BY publishedAt DESC.
- Display: <app-coverage-card variant="inline"> with parent event chip retained.
- Hide section when 0 mentions.
G · Files authored
Source: SELECT * FROM FounderFile WHERE Founder.Id = ANY(authorIds) ORDER BY publishedAt DESC. Display: 3:4 portrait <app-founder-file-card variant="compact">. Section header: "{First name} authored {N} {file/files}". Hide when 0 files.
H · Editorial articles authored
Source: SELECT * FROM EditorialArticle WHERE Founder.Id = ANY(authorIds) ORDER BY publishedAt DESC. Display: <app-editorial-card variant="inline">. Hide when 0 articles.
I · Related Founders
- Up to 6 cards. Sourcing priority: (1) manual links via FounderRelatedFounder table; (2) same country + same startup sector + Founder.IsActive=true.
- Exclude self. Sort manual first, then by most-mentioned DESC.
