feat(changelogs): prototype changelog card UI with supply chain and c…#682
Conversation
…ontributor avatars - FeedItems: add release summary stats, Heads Up major version bumps block, Supply Chain section (always rendered), contributor avatar circles, card background dinosaur artwork (Achillobator for LTS, Bluefin for stable) - CommunityFeeds: replace verbose intro with concise overviewPanel, remove Community Discussions/Announcements columns - Add Achillobator and Bluefin character webp assets for card backgrounds - Justfile: add `just dev` (fast hot-reload, skips fetch-data) as default rule; `just serve` still runs full fetch-data + start - docs/reports.md: add supply chain notes section - AGENTS.md: minor branch naming wording fix Assisted-by: Claude Sonnet 4.6 via GitHub Copilot Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Code Review
This pull request introduces a significant UI/UX overhaul for the Bluefin changelogs and feeds. Key enhancements include the addition of release summaries, contributor avatars, major version bump highlights, and supply chain integrity signals (SBOM/attestations) directly within the feed cards. The documentation and workflow guides have also been updated to reflect new branch naming conventions and supply chain features. Feedback was provided regarding potential performance issues caused by multiple regex-based scans of large HTML descriptions within the render loop, suggesting a more efficient single-pass extraction or memoization strategy.
| const commits = | ||
| isReleaseFeed(item._feedId) && itemDescription | ||
| ? extractCommits(itemDescription) | ||
| : []; | ||
| const supplyChainHighlights = extractSupplyChainHighlights(commits); | ||
| const displayTitle = formatReleaseTitle(item.title, item._feedId); | ||
| const supplyChainLinks = getSupplyChainLinks(displayTitle); | ||
| const majorVersionBumps = | ||
| isReleaseFeed(item._feedId) && itemDescription | ||
| ? extractMajorVersionBumps(itemDescription) | ||
| : []; | ||
| const contributors = getReleaseContributors(commits); | ||
| const visibleContributors = contributors.slice(0, 8); | ||
| const overflowContributors = Math.max(contributors.length - 8, 0); | ||
| const releaseSummary = extractReleaseSummary( | ||
| itemDescription || "", | ||
| commits, | ||
| supplyChainHighlights, | ||
| majorVersionBumps, | ||
| ); |
There was a problem hiding this comment.
The itemDescription is being scanned multiple times using expensive regular expressions (extractCommits, extractMajorVersionBumps, and extractReleaseSummary which calls countMatches three times). Since changelog descriptions can be quite large, performing five full-string scans per item within the render loop can lead to significant performance degradation, especially when rendering up to 20 items on mobile devices.
Consider refactoring these extraction functions to share a single pass over the HTML content or memoizing the results if the component re-renders frequently.
Removed the overview lead paragraph from the Community Feeds component.
Five regex scans per item (extractCommits, extractMajorVersionBumps, three countMatches inside extractReleaseSummary) were running on every render inside the map loop. Pre-compute all derived data with useMemo keyed on item IDs so scans run once per feed update rather than every render cycle. Addresses Gemini code review feedback on PR 682. Assisted-by: Claude Sonnet 4.6 via GitHub Copilot Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ontributor avatars
just dev(fast hot-reload, skips fetch-data) as default rule;just servestill runs full fetch-data + startAssisted-by: Claude Sonnet 4.6 via GitHub Copilot