Skip to content

Conversation

@shuuji3
Copy link
Member

@shuuji3 shuuji3 commented Feb 11, 2026

An attempt to sort contributors list by the governance role (steward > core > maintainer > contributor).

screenshot of contributor list in about page, daniel and patak is first two icons

I cannot find a public member list of the maintainers so kept it empty for now.

One option to avoid hardcoding is to create GitHub Team for each governance role, and create members list in GitHub Actions with command like gh api /orgs/npmx-dev/teams/steward/members --jq 'map(.login).

/cc @patak-dev @userquin

(ref. original chat: https://bsky.app/profile/patak.dev/post/3mek245m7as26)

@vercel
Copy link

vercel bot commented Feb 11, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
npmx.dev Ready Ready Preview, Comment Feb 11, 2026 4:42pm
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
docs.npmx.dev Ignored Ignored Preview Feb 11, 2026 4:42pm
npmx-lunaria Ignored Ignored Feb 11, 2026 4:42pm

Request Review

@codecov
Copy link

codecov bot commented Feb 11, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

📢 Thoughts on this report? Let us know!

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 11, 2026

📝 Walkthrough

Walkthrough

The pull request updates two areas. server/api/contributors.get.ts introduces a Role type, a roleMembers mapping and getRoleInfo to assign roles; contributors are assigned a role and temporary order, sorted by role (stewards, core, maintainers, contributors) and the temporary order removed before return. The GitHubContributor interface now includes a public role field. app/pages/about.vue adds a new "Team" section with a conditional Governance/maintainers grid and placeholder content, including repeated .filter(c => c.role !== 'contributor') expressions. Total changes across files: +74/−5 lines.

🚥 Pre-merge checks | ✅ 1
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The pull request description clearly relates to the changeset by explaining the implementation of role-based contributor sorting on the about page.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

@patak-dev
Copy link
Contributor

patak-dev commented Feb 11, 2026

Note: I thought I was looking at an issue 🤦🏼
My mind couldn't wrap around you doing a PR so fast:

Thanks for creating the issue! I think this is a good idea, we should surface maintainers and is a good way for some of them to flow up in line with their real contributions. The commits aren't telling the whole picture for a lot of us now.

@patak-dev
Copy link
Contributor

It would be good to also show for governance folk their github, npm, etc too. Maybe at one point we find a way to do it for everyone once we have more people connecting their accounts together.

image

One interesting discussion, we decided to remove the sponsors button for stewards in the main page of the repo. It didn't feel right that we were the only ones having the exposure there. But maybe we could add them back for everybody (or as many of us as possible, maybe first governance, later when people connect to github we could do better). I think we need to start trying to start working to help with OSS funding. I don't think people will give us a lot of money through this, I care more about the symbol that we should show that money is needed for npmx to work. It will also get better once we can start adding sponsors (soon!).

@patak-dev
Copy link
Contributor

Now that I know this is a PR, I checked how it looks :D

So, we could merge this and iterated, but I would like we show the governance structure as a way to explain that npmx takes the foundation route seriously. So we should have Stewards first as a title, then Maintainers, then everyone else. Maybe with a short paragraph. And it could give us an option to do bigger cards for maintainers so we can show that they work in different companies and what other projects they participate in. Let's use this as a way to show that we are the result of uniting a lot of communities.

@shuuji3
Copy link
Member Author

shuuji3 commented Feb 11, 2026

It actually is a PR😄 Yes, this can be imrpoved iteratively. I also think about adding sections similar to https://github.com/npmx-dev/npmx.dev/blob/main/GOVERNANCE.md and we could add links to this docs later.

@shuuji3
Copy link
Member Author

shuuji3 commented Feb 11, 2026

Also, once npmx's profile page mature, we could link to the profile page https://npmx.dev/profile/[user-name], instead of directly link to https://github.com/[user-name]

@patak-dev
Copy link
Contributor

I'm thinking that for the first iteration, until we have a core team, the best is if we only have two sections:

Team

Governance

Daniel Me [ ...maintainers ] <-- all with the same card size, just the role is diff

Contributors

All other contributors, maybe including the above too as a way to show we are all part of the team

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

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

⚠️ Outside diff range comments (1)
server/api/contributors.get.ts (1)

1-8: ⚠️ Potential issue | 🟡 Minor

Type mismatch between API response and interface

The GitHubContributor interface now requires a role field, but the GitHub API response at line 49 does not include this property. Casting directly to GitHubContributor[] is type-unsafe since the objects won't have role until line 72.

Consider defining a separate type for the raw API response:

🛡️ Proposed fix for type safety
+type GitHubAPIContributor = Omit<GitHubContributor, 'role'>
+
 export interface GitHubContributor {
   login: string
   id: number
   avatar_url: string
   html_url: string
   contributions: number
   role: Role
 }

Then at line 49:

-      const contributors = (await response.json()) as GitHubContributor[]
+      const contributors = (await response.json()) as GitHubAPIContributor[]

And update the allContributors array type accordingly.

Also applies to: 49-49

🧹 Nitpick comments (3)
app/pages/about.vue (3)

147-147: Consider extracting the governance filter to a computed property

The filter c => c.role !== 'contributor' is used in multiple places (lines 147, 156–161). Extracting this to a computed property would improve readability and ensure consistency.

♻️ Suggested refactor

In <script setup>:

const governanceMembers = computed(() => 
  contributors.value?.filter(c => c.role !== 'contributor') ?? []
)

Then in the template:

-          <div v-if="contributors?.some(c => c.role !== 'contributor')" class="mb-12">
+          <div v-if="governanceMembers.length" class="mb-12">
-                v-for="person in contributors.filter(c => c.role !== 'contributor')"
+                v-for="person in governanceMembers"

141-144: Consider using i18n keys for the "Team" heading

The hardcoded "Team" string at line 141 should use an i18n key for consistency with the rest of the page, which uses $t() for all user-facing text.


148-148: Consider using i18n key for "Governance" heading

Similar to the "Team" heading, "Governance" should use an i18n key for internationalisation consistency.

Comment on lines +150 to +152
TODO: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
</p>
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Remove placeholder TODO text before merging

There are multiple instances of raw placeholder text that will be visible to users:

  • Lines 150-152: "TODO: Lorem ipsum..." in the Governance section
  • Line 178: "TODO: add other maintainers" rendered directly in the grid
  • Lines 192-193: "TODO: Lorem ipsum..." in the Contributors section

These should be replaced with proper i18n keys or removed.

Also applies to: 178-178, 192-193

Comment on lines +156 to +162
v-for="person in contributors
.filter(c => c.role !== 'contributor')
.concat(contributors.filter(c => c.role !== 'contributor'))
.concat(contributors.filter(c => c.role !== 'contributor'))
.concat(contributors.filter(c => c.role !== 'contributor'))
.concat(contributors.filter(c => c.role !== 'contributor'))"
:key="person.id"
Copy link
Contributor

@coderabbitai coderabbitai bot Feb 11, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Remove debug .concat() chain — causes duplicate keys and 5× repeated entries

The repeated .concat() calls duplicate governance members five times, which will:

  1. Cause Vue key warnings since :key="person.id" will have duplicates
  2. Render the same people multiple times in the UI
  3. Degrade performance with unnecessary iterations

This appears to be debug/test code that should be removed before merging.

🐛 Proposed fix
               <a
-                v-for="person in contributors
-                  .filter(c => c.role !== 'contributor')
-                  .concat(contributors.filter(c => c.role !== 'contributor'))
-                  .concat(contributors.filter(c => c.role !== 'contributor'))
-                  .concat(contributors.filter(c => c.role !== 'contributor'))
-                  .concat(contributors.filter(c => c.role !== 'contributor'))"
+                v-for="person in contributors.filter(c => c.role !== 'contributor')"
                 :key="person.id"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
v-for="person in contributors
.filter(c => c.role !== 'contributor')
.concat(contributors.filter(c => c.role !== 'contributor'))
.concat(contributors.filter(c => c.role !== 'contributor'))
.concat(contributors.filter(c => c.role !== 'contributor'))
.concat(contributors.filter(c => c.role !== 'contributor'))"
:key="person.id"
v-for="person in contributors.filter(c => c.role !== 'contributor')"
:key="person.id"

Copy link
Member Author

Choose a reason for hiding this comment

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

no problem, this is just a stub for this WIP commit

Copy link
Contributor

Choose a reason for hiding this comment

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

@shuuji3, understood! Thanks for clarifying — I'll let this pass as WIP stub code. Feel free to clean it up before the final merge. 👍

@shuuji3
Copy link
Member Author

shuuji3 commented Feb 11, 2026

I've created a simple mini cards (icon + name + role) for governance section as a starting point. Should I use this same card format for all contributors, or keep the current contributors cloud?

I'll collect the maintainers GitHub handles from Discord and hardcode them (tomorrow).

Also, could you provide the short paragraphs for each sections? I'm not sure what the best wordings.

Screenshot from 2026-02-12 01-14-50

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