Skip to content

feat: nightly contributors.svg — squircle mosaic for the credits pages#5724

Merged
leaanthony merged 6 commits into
masterfrom
feat/contributors-svg
Jul 3, 2026
Merged

feat: nightly contributors.svg — squircle mosaic for the credits pages#5724
leaanthony merged 6 commits into
masterfrom
feat/contributors-svg

Conversation

@taliesin-ai

@taliesin-ai taliesin-ai commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Follow-up to #5719. The contributors section on both docs credits pages was a stale all-contributors HTML table committed once in 2024 and never regenerated. This replaces it with a nightly-generated contributors.svg, rendered by the same Go tool as the sponsors image.

What's in here

tools/sponsorkit grows a -mode contributors:

  • Fetches contributors (commit counts, bots excluded) from the REST API.
  • Also scans the v2 + v3 changelogs for @login credits, because squash-merged or hand-applied patches are often credited only there. Changelog-only contributors still get their squircle. Markdown profile links ([@x](https://github.com/y)) trust the URL over the (occasionally typo'd) link text, and every changelog-only login is validated against the API so typos, renamed accounts and organisations are dropped rather than mis-credited.
  • A contributor's credit is max(commits, changelog mentions) to avoid double counting.

The card: a mosaic of superellipse squircles on the same dark card as the sponsors image, graded by credit into 7 bands — the most prolific contributors get large named squircles with animated gradient rings and travelling light arcs; the long tail gets small plain squircles. Every squircle deep-links to the profile. Hovering the bigger squircles lifts them, blooms the ring and pops up a chip with the commit count (hover requires the object embed, like the sponsors image).

Size control: with 420 embedded avatars the naïve output was 2.4 MB; shared defs/use squircle geometry, per-band JPEG quality and keeping original PNGs for flat-colour identicons bring it to ~1 MB.

Wiring:

  • generate-sponsor-image.yml now generates and commits both SVGs nightly.
  • v3 credits page + 9 locales: stale contributors.html import replaced with an object embed of https://wails.io/img/contributors.svg; the 2024 snapshot asset is deleted.
  • v2 credits page + 11 i18n copies: the inline GAMFC table replaced with an object embed of /img/contributors.svg.

Verification

  • Generated from live data (420 contributors, 5,680 commits) and rendered in Chrome: links open profiles through the object embed, hover effects fire, XML validates, animations run.
  • go vet / go build clean; tool remains stdlib-only.

Summary by CodeRabbit

  • New Features
    • Added a contributors image alongside the existing sponsors image, and updated the site to display the new visual credits layout.
  • Bug Fixes
    • Credits pages now load the contributors graphic consistently across all supported languages.
    • Improved generation so sponsor and contributor images are updated together, and unchanged files are no longer committed.
  • Documentation
    • Expanded the tool guide with clearer usage details for both sponsor and contributor image generation.

…t capture

Adds a contributors mode to tools/sponsorkit that renders a squircle
mosaic of all repo contributors, graded by contribution count. Besides
the REST contributors API it scans the v2/v3 changelogs for @login
credits so people whose PRs were squashed or hand-applied still appear.
Both docs credits pages now embed the nightly-generated SVG instead of
the stale 2024 all-contributors table.
@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Adds a Go-based contributors SVG generator to tools/sponsorkit, updates the workflow to generate and commit both sponsor and contributor images, and replaces credits-page contributor tables/components with embedded contributors.svg renders across docs and website locales.

Changes

Contributors Image Generation

Layer / File(s) Summary
Band config and avatar fallback
tools/sponsorkit/config.go, tools/sponsorkit/avatar.go
Adds contributor band thresholds and rendering parameters, and returns original avatar bytes as a data URI when smaller than the JPEG re-encode.
Contributor fetching and scoring
tools/sponsorkit/contributors.go
Defines contributor scoring plus GitHub REST/GraphQL fetching, changelog mention parsing, bot filtering, user lookup, and JSON helpers.
Contributors SVG rendering
tools/sponsorkit/render_contributors.go, tools/sponsorkit/render.go
Adds contributors SVG layout/rendering and switches sponsor hover clip IDs to sequential values.
CLI dispatch and workflow wiring
tools/sponsorkit/main.go, .github/workflows/generate-sponsor-image.yml, tools/sponsorkit/README.md
Expands the CLI into sponsor/contributor modes, adds contributor SVG generation and combined commit logic in the workflow, and updates the sponsorkit docs.

Docs and Website Credits Pages Migration

Layer / File(s) Summary
docs credits pages migration
docs/src/content/docs/*/credits.mdx
Removes Contributors imports and replaces rendered contributor content with embedded contributors.svg object/img markup.
website i18n credits pages migration
website/i18n/*/docusaurus-plugin-content-pages/credits.mdx
Replaces the large contributor HTML tables with embedded contributors.svg object/img markup across website locales.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Workflow as GitHub Actions workflow
  participant CLI as tools/sponsorkit/main.go
  participant Fetcher as FetchContributors
  participant GitHub as GitHub API
  participant Renderer as RenderContributors

  Workflow->>CLI: run -mode contributors -repo ... -changelogs ...
  CLI->>Fetcher: FetchContributors(client, token, repo, changelogs)
  Fetcher->>GitHub: REST contributors + GraphQL merged PRs
  GitHub-->>Fetcher: contributor data
  Fetcher-->>CLI: sorted []Contributor
  CLI->>Renderer: RenderContributors(contributors, opts)
  Renderer-->>CLI: contributors.svg
  CLI->>Workflow: write contributors.svg
  Workflow->>Workflow: commit sponsors.svg and contributors.svg if changed
Loading

Possibly related PRs

  • wailsapp/wails#5719: Extends the same sponsorkit and workflow path that this change builds on, with related sponsor-image generation updates.

Suggested reviewers: leaanthony

Poem

A rabbit hopped with SVG cheer,
And split the modes from year to year.
Two bright images now take flight,
With tables gone and embeds right.
Hop hop—contributors shine! 🐇

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title is concise and accurately summarizes the main change: generating a nightly contributors.svg for the credits pages.
Description check ✅ Passed The description covers the summary, issue reference, motivation, implementation, wiring, and verification, though it doesn't follow the template checklist format.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/contributors-svg

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR replaces the stale, manually-committed contributors HTML tables on the v2 + v3 docs credits pages with a nightly-generated contributors.svg, produced by the existing Go tools/sponsorkit generator via a new -mode contributors.

Changes:

  • Add contributors fetching + changelog credit scanning, and render a contributors “squircle mosaic” SVG (tools/sponsorkit contributors mode).
  • Update v2/v3 credits pages (and locale copies) to embed contributors.svg via <object> (with <img> fallback) so in-SVG links/hover effects work.
  • Update the scheduled GitHub Actions workflow to generate + commit both sponsors.svg and contributors.svg.

Reviewed changes

Copilot reviewed 30 out of 31 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
website/src/pages/credits.mdx Replaces inline contributors table with <object> embed of /img/contributors.svg.
tools/sponsorkit/render_contributors.go New contributors SVG renderer (bands, squircles, hover chip/glare effects).
tools/sponsorkit/README.md Documents new contributors mode and where both images are used.
tools/sponsorkit/main.go Adds -mode contributors, -repo, and -changelogs and routes generation accordingly.
tools/sponsorkit/contributors.go New REST + changelog scanning contributor aggregation and deterministic sorting.
tools/sponsorkit/config.go Adds contributor “bands” configuration (sizes, rings, hover behavior).
tools/sponsorkit/avatar.go Keeps original encoded avatar bytes when smaller than re-encoded JPEG.
docs/src/content/docs/credits.mdx Switches contributors section from imported HTML to <object> embed of deployed contributors SVG.
docs/src/content/docs/de/credits.mdx Same contributors embed update for German locale.
docs/src/content/docs/fr/credits.mdx Same contributors embed update for French locale.
docs/src/content/docs/id/credits.mdx Same contributors embed update for Indonesian locale.
docs/src/content/docs/ja/credits.mdx Same contributors embed update for Japanese locale.
docs/src/content/docs/ko/credits.mdx Same contributors embed update for Korean locale.
docs/src/content/docs/pt/credits.mdx Same contributors embed update for Portuguese locale.
docs/src/content/docs/ru/credits.mdx Same contributors embed update for Russian locale.
docs/src/content/docs/zh-cn/credits.mdx Same contributors embed update for Simplified Chinese locale.
docs/src/content/docs/zh-tw/credits.mdx Same contributors embed update for Traditional Chinese locale.
docs/src/assets/contributors.html Removes the old committed contributors snapshot asset.
.github/workflows/generate-sponsor-image.yml Nightly workflow now regenerates + commits both SVGs.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread tools/sponsorkit/render_contributors.go Outdated
Comment thread docs/src/content/docs/zh-cn/credits.mdx Outdated
Comment thread docs/src/content/docs/ko/credits.mdx Outdated
Comment thread docs/src/content/docs/ja/credits.mdx Outdated
Comment thread docs/src/content/docs/id/credits.mdx Outdated
Commit counts reward granular unsquashed histories (tmclane's 231
commits vs 26 merged PRs) while squash-merged work collapses to one
commit per PR. -metric prs counts merged pull requests per author via
GraphQL instead, treating one PR as one unit of work regardless of
merge style. Band thresholds have a PR-tuned set; changelog mentions
still act as the fallback credit. Default remains commits until the
metric choice is settled.
Lea's call after comparing both metrics: merged-PR counts match the
project's sense of who contributed what far better than raw commit
counts, which are skewed by merge style. -metric defaults to prs; the
workflow passes it explicitly; commits remains available as a flag.
@leaanthony leaanthony marked this pull request as ready for review July 3, 2026 13:17
- clipPath ids are now sequence-numbered instead of sanitized logins,
  which could collide (foo-bar vs foobar) and clip the hover glare to
  the wrong avatar; applies to both renderers
- remove stale 'import the auto-generated contributors file' comments
  left in the id/ja/ko/zh-cn locale credits pages
- regenerate both SVGs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
tools/sponsorkit/avatar.go (1)

82-97: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Size-based raw-bytes fallback can reintroduce transparency the JPEG flattening was meant to remove.

This picks whichever encoding is smaller by byte size alone, with no opacity check. The comment scopes the intent to "flat-colour identicons" (which are typically fully opaque), but the condition applies to any avatar — a user-uploaded PNG/GIF with transparent regions that happens to compress smaller than the JPEG re-encode would bypass the cardBackground flattening done above and ship with its original alpha intact, showing through as whatever's behind the SVG document rather than the intended dark card colour.

🐛 Proposed fix: only take the raw-bytes shortcut when the source is already opaque
+	if op, ok := img.(interface{ Opaque() bool }); !ok || !op.Opaque() {
+		return "data:image/jpeg;base64," + base64.StdEncoding.EncodeToString(buf.Bytes()), nil
+	}
 	// Flat-colour identicons compress far better in their original PNG than
 	// as JPEG, so keep whichever encoding is smaller.
 	if mime := resp.Header.Get("Content-Type"); mime != "" && len(data) < buf.Len() {
 		return "data:" + mime + ";base64," + base64.StdEncoding.EncodeToString(data), nil
 	}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/sponsorkit/avatar.go` around lines 82 - 97, The raw-bytes fallback in
avatar.go’s encoding path should not be chosen purely by size, because it can
bypass the `cardBackground` flattening done before `jpeg.Encode`. Update the
logic around the `resp.Header.Get("Content-Type")` check and the `len(data) <
buf.Len()` comparison so the original data is only returned when the source
image is known to be opaque; otherwise always return the flattened JPEG. Use the
existing `img`/`flat` processing in `EncodeAvatar` (or the surrounding helper)
to gate the fallback with an opacity check before emitting the data URI.
🧹 Nitpick comments (5)
docs/src/content/docs/credits.mdx (1)

43-51: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider extracting the SVG embed into a shared component.

This identical object/img markup is duplicated verbatim across all 10 locale credits pages (docs + website i18n). A small shared Astro/React component (e.g., <ContributorsEmbed />) would remove this duplication and centralize future changes (URL, styling, fallback text) in one place.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/src/content/docs/credits.mdx` around lines 43 - 51, The contributors SVG
embed markup is duplicated across multiple credits pages, so extract the
repeated object/img block into a shared component such as ContributorsEmbed and
reuse it everywhere. Update the credits pages that currently inline this markup
to render the shared component, and keep the existing SVG URL, fallback image,
accessibility text, and styling centralized so future changes only need to be
made in one place.
tools/sponsorkit/render_contributors.go (1)

212-240: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

"animated" ring's bloom/fast sweep aren't gated by b.Hover, unlike the "static" case.

In the "static" branch, the extra .bloom element is only emitted if b.Hover. In "animated", .bloom and .fast are always emitted regardless of b.Hover. This is harmless today because both Ring: "animated" bands also set Hover: true in config.go, so the .sp:hover CSS selector never has a chance to fire without the sp class being present anyway — but it's an implicit assumption that isn't enforced, and a future animated band with Hover: false would silently ship dead hover markup.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/sponsorkit/render_contributors.go` around lines 212 - 240, The animated
ring branch in renderContributors currently emits the hover-only .bloom and
.fast SVG elements unconditionally, unlike the static branch. Update the logic
around the ring switch so the animated overlay markup is only written when
b.Hover is true, using the existing ring/b.Hover flow in renderContributors and
keeping behavior consistent with the static case. This makes the intent explicit
and avoids shipping dead hover-only markup for future animated bands.
tools/sponsorkit/contributors.go (2)

169-216: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider unit tests for the regex-based credit parsing.

changelogMentions, Credit(), and the profile-link/mention regexes encode a fair amount of subtle logic (trailing-hyphen trimming, scope/underscore exclusion, markdown-link precedence, PR/commit/mention max-taking). These are pure functions and cheap to test, and regressions here would silently mis-credit or drop contributors without any compile-time signal.

Also applies to: 320-324

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/sponsorkit/contributors.go` around lines 169 - 216, Add focused unit
tests around the pure credit-parsing logic so the regex and aggregation rules
don’t regress silently. Cover changelogMentions, Credit(), mentionRe, and
profileLinkRe with cases for trailing hyphens, underscore/scope exclusion,
markdown profile-link precedence over raw mentions, and max-taking behavior
across PR/commit/mention sources. Keep the tests table-driven and assert the
exact credited login counts/selection outcomes for representative inputs.

105-154: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

No throttling on per-login lookupUser calls for PR-only / changelog-only contributors.

The paginated contributor and merged-PR fetch loops sleep 100ms between pages, but the fallback lookupUser calls issued here (once per unmatched PR author, and again per unmatched changelog mention) fire back-to-back with no delay. With enough changelog-only mentions or unlinked PR authors, this could burst into GitHub's secondary rate limits and fail the nightly generation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/sponsorkit/contributors.go` around lines 105 - 154, Add throttling to
the fallback lookupUser calls in contributors.go so PR-only and changelog-only
contributor lookups don’t hammer GitHub back-to-back. In the loops that process
prCounts and changelogMentions, pause between successive lookupUser(client,
token, key) calls using the same pacing approach already used in the paginated
fetch flow, and keep the existing skip/continue behavior in the byLogin/order
handling intact.
tools/sponsorkit/config.go (1)

134-181: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

prBandMins and bands must stay index-parallel — fragile coupling risks a panic.

main.go does for i := range bands { bands[i].MinCredit = prBandMins[i] } when -metric prs is selected. Both slices currently have 7 entries, but nothing enforces that invariant — adding/removing a Band entry here without updating prBandMins (or vice versa) causes an index-out-of-range panic at runtime in main.go.

Consider folding the PR-metric threshold into Band itself so the two numbers can't drift apart:

♻️ Proposed refactor
 type Band struct {
 	MinCredit int
+	// PRMinCredit overrides MinCredit when ranking by merged PRs
+	// (-metric prs); one merged PR is a much rarer unit than one commit.
+	PRMinCredit int
 	Avatar float64
 	...
 }

-var prBandMins = []int{300, 100, 40, 15, 6, 2, 0}
-
 var bands = []Band{
-	{MinCredit: 1000, ...},
+	{MinCredit: 1000, PRMinCredit: 300, ...},
 	...
 }

Then in main.go: for i := range bands { bands[i].MinCredit = bands[i].PRMinCredit }.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/sponsorkit/config.go` around lines 134 - 181, The `prBandMins` slice
and `bands` array in `config.go` are brittle because `main.go` assumes they stay
index-parallel when applying the PR metric thresholds. Refactor so each `Band`
carries its own PR-specific threshold (for example as a `PRMinCredit` field) and
update the `bands` initialization accordingly, then change the `main.go` loop to
read the threshold from each `Band` instead of indexing a separate slice. This
removes the hidden coupling and prevents index-out-of-range panics if the band
list changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@tools/sponsorkit/avatar.go`:
- Around line 82-97: The raw-bytes fallback in avatar.go’s encoding path should
not be chosen purely by size, because it can bypass the `cardBackground`
flattening done before `jpeg.Encode`. Update the logic around the
`resp.Header.Get("Content-Type")` check and the `len(data) < buf.Len()`
comparison so the original data is only returned when the source image is known
to be opaque; otherwise always return the flattened JPEG. Use the existing
`img`/`flat` processing in `EncodeAvatar` (or the surrounding helper) to gate
the fallback with an opacity check before emitting the data URI.

---

Nitpick comments:
In `@docs/src/content/docs/credits.mdx`:
- Around line 43-51: The contributors SVG embed markup is duplicated across
multiple credits pages, so extract the repeated object/img block into a shared
component such as ContributorsEmbed and reuse it everywhere. Update the credits
pages that currently inline this markup to render the shared component, and keep
the existing SVG URL, fallback image, accessibility text, and styling
centralized so future changes only need to be made in one place.

In `@tools/sponsorkit/config.go`:
- Around line 134-181: The `prBandMins` slice and `bands` array in `config.go`
are brittle because `main.go` assumes they stay index-parallel when applying the
PR metric thresholds. Refactor so each `Band` carries its own PR-specific
threshold (for example as a `PRMinCredit` field) and update the `bands`
initialization accordingly, then change the `main.go` loop to read the threshold
from each `Band` instead of indexing a separate slice. This removes the hidden
coupling and prevents index-out-of-range panics if the band list changes.

In `@tools/sponsorkit/contributors.go`:
- Around line 169-216: Add focused unit tests around the pure credit-parsing
logic so the regex and aggregation rules don’t regress silently. Cover
changelogMentions, Credit(), mentionRe, and profileLinkRe with cases for
trailing hyphens, underscore/scope exclusion, markdown profile-link precedence
over raw mentions, and max-taking behavior across PR/commit/mention sources.
Keep the tests table-driven and assert the exact credited login counts/selection
outcomes for representative inputs.
- Around line 105-154: Add throttling to the fallback lookupUser calls in
contributors.go so PR-only and changelog-only contributor lookups don’t hammer
GitHub back-to-back. In the loops that process prCounts and changelogMentions,
pause between successive lookupUser(client, token, key) calls using the same
pacing approach already used in the paginated fetch flow, and keep the existing
skip/continue behavior in the byLogin/order handling intact.

In `@tools/sponsorkit/render_contributors.go`:
- Around line 212-240: The animated ring branch in renderContributors currently
emits the hover-only .bloom and .fast SVG elements unconditionally, unlike the
static branch. Update the logic around the ring switch so the animated overlay
markup is only written when b.Hover is true, using the existing ring/b.Hover
flow in renderContributors and keeping behavior consistent with the static case.
This makes the intent explicit and avoids shipping dead hover-only markup for
future animated bands.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b9cb0d47-947c-48d5-9d88-6d73e1bac745

📥 Commits

Reviewing files that changed from the base of the PR and between 9e3d5c0 and 5ab711b.

⛔ Files ignored due to path filters (1)
  • website/static/img/contributors.svg is excluded by !**/*.svg
📒 Files selected for processing (30)
  • .github/workflows/generate-sponsor-image.yml
  • docs/src/assets/contributors.html
  • docs/src/content/docs/credits.mdx
  • docs/src/content/docs/de/credits.mdx
  • docs/src/content/docs/fr/credits.mdx
  • docs/src/content/docs/id/credits.mdx
  • docs/src/content/docs/ja/credits.mdx
  • docs/src/content/docs/ko/credits.mdx
  • docs/src/content/docs/pt/credits.mdx
  • docs/src/content/docs/ru/credits.mdx
  • docs/src/content/docs/zh-cn/credits.mdx
  • docs/src/content/docs/zh-tw/credits.mdx
  • tools/sponsorkit/README.md
  • tools/sponsorkit/avatar.go
  • tools/sponsorkit/config.go
  • tools/sponsorkit/contributors.go
  • tools/sponsorkit/main.go
  • tools/sponsorkit/render_contributors.go
  • website/i18n/ar/docusaurus-plugin-content-pages/credits.mdx
  • website/i18n/de/docusaurus-plugin-content-pages/credits.mdx
  • website/i18n/fr/docusaurus-plugin-content-pages/credits.mdx
  • website/i18n/ja/docusaurus-plugin-content-pages/credits.mdx
  • website/i18n/ko/docusaurus-plugin-content-pages/credits.mdx
  • website/i18n/pt/docusaurus-plugin-content-pages/credits.mdx
  • website/i18n/ru/docusaurus-plugin-content-pages/credits.mdx
  • website/i18n/tr/docusaurus-plugin-content-pages/credits.mdx
  • website/i18n/uk/docusaurus-plugin-content-pages/credits.mdx
  • website/i18n/vi/docusaurus-plugin-content-pages/credits.mdx
  • website/i18n/zh-Hans/docusaurus-plugin-content-pages/credits.mdx
  • website/src/pages/credits.mdx
💤 Files with no reviewable changes (1)
  • docs/src/assets/contributors.html

@leaanthony leaanthony merged commit 8427eb6 into master Jul 3, 2026
106 of 107 checks passed
@leaanthony leaanthony deleted the feat/contributors-svg branch July 3, 2026 13:27
leaanthony pushed a commit that referenced this pull request Jul 3, 2026
…utors.svg — squircle mosaic for the credits pages
@taliesin-ai

Copy link
Copy Markdown
Collaborator Author

@coderabbitai Thanks for the review — it landed just after the PR merged, so the fixes are in follow-up PR #5731. Point-by-point:

avatar.go — raw-bytes fallback can reintroduce transparency (skipped): The premise doesn't hold for this SVG. The <image> element is painted after (i.e. on top of) the card's background rects inside the same document, so a kept-original PNG with alpha composites onto the card gradient, never onto "whatever's behind the SVG document". If anything the gradient behind is more correct than the flat cardBackground approximation used for JPEG flattening (which exists only because JPEG has no alpha channel). Gating on Opaque() would also forfeit most of the fallback's purpose: GitHub identicons — the main beneficiaries — are transparent-background PNGs.

credits.mdx — shared embed component (skipped): The duplication spans two unrelated doc systems (Astro Starlight in docs/, Docusaurus in website/), so one shared component can't cover it, and the per-locale copies are maintained by the LLM translation pipeline which handles inline markup uniformly. The existing sponsors embed follows the same pattern; if we consolidate, both embeds should move together in a dedicated cleanup.

config.go — prBandMins/bands index-parallel fragility (fixed in #5731): PRMinCredit is now a field on Band, exactly as proposed.

render_contributors.go — animated bloom/fast not gated on Hover (fixed in #5731): gated, matching the static branch.

contributors.go — lookupUser throttling (fixed in #5731): the changelog-only and PR-only lookups now sleep 100ms per call, same cadence as the paginated fetches.

contributors.go — unit tests for credit parsing (fixed in #5731): table-driven tests for changelogMentions (profile-link precedence over typo'd link text, npm scopes, underscore display handles, emails, trailing hyphens, bracketed mentions) and Credit() (both metrics, mention max-taking, commit-only floor).

@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@taliesin-ai Thanks for the detailed follow-up, this is very clear.

  • avatar.go: Fair point — since the <image> element is composited on top of the card's own background rects within the same SVG document, the alpha will always resolve against the intended gradient, not an arbitrary external background. That's a stronger argument than my original premise, and the identicon case makes the raw-bytes fallback clearly worth keeping as-is. I'll drop that concern.
  • credits.mdx shared component: Makes sense given the split between Astro Starlight and Docusaurus, plus the LLM translation pipeline handling the per-locale copies uniformly. Bundling this with the sponsors embed in a dedicated cleanup later sounds like the right call — no need to force it into this PR.
  • config.go / render_contributors.go / contributors.go (throttling) / contributors.go (tests): Great to hear these landed in #5731. I'll take a look there if it comes up for review.

Thanks again for closing the loop on all of these.

(っ˘̩╭╮˘̩)っ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants