Skip to content

feat: rename organization to company across insights - #2497

Merged
gaspergrom merged 9 commits into
mainfrom
feat/OPS-1006
Nov 9, 2026
Merged

gaspergrom merged 9 commits into
mainfrom
feat/OPS-1006

Conversation

@gaspergrom

@gaspergrom gaspergrom commented Nov 9, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Renames user-visible "Organization" to "Company" across Insights: UI copy, SEO meta, docs and llms.txt. Company pages and the two company leaderboards move to new URLs, and the old URLs 301 to them.

Changes

  • Routes:
    • /organization/<slug> → /company/<slug>, and /leaderboards/organizations / /leaderboards/active-organizations → /leaderboards/companies / /leaderboards/active-companies.
    • Both redirect from page middleware (app/pages/organization/[...slug].vue, app/pages/leaderboards/[key].vue): a 301 on SSR, the same on in-app navigation, any letter case, query and hash kept. Bare /organization returns 404.
    • Route rules would not work here: they are case-sensitive while the router is not, and a /organization/** rule expands ** literally on the client.
  • Leaderboard keys: the keys stay as they are, because they are also the Tinybird leaderboardType. config/leaderboard-slugs.ts maps each key to its URL slug. Links, the [key] page and the sitemap use it.
  • Copy:
    • widget names, descriptions, tooltips, tab labels, tables, empty states and leaderboard and badge text
    • health "Company diversity", company page, contributors page titles and meta, CNCF reports, search, footer
  • Docs:
    • metrics, glossary, FAQ, sidebar and public/llms.txt
    • widget learnMoreLink anchors updated to match the new headings
    • doc file paths unchanged, so doc URLs still work
  • Unchanged on purpose:
    • API paths (/api/organization-page/*), ?widget= keys, enums, tab values and Tinybird columns
    • the "Organization Dashboard" link (product name) and the AI chat prompts
    • schema.org Organization, blog posts
  • Badge PNGs: they still read "ACTIVE ORGANIZATIONS" until design re-exports them.
  • Search Console: company pages are not in the sitemap (no slug source exists). The old URLs redirect, so Search Console picks up the new paths.
  • Public API docs: the OpenAPI text in api/src/lib/organizations.ts now cites /company/{slug}.

Test plan

  • pnpm lint, pnpm tsc-check, vitest (659 tests).
  • Local dev server: old URLs in any case return 301 to the new paths with query strings kept; client pushes render the real pages. New URLs return 200.
  • Browser QA: titles and meta, widgets, tabs, search, leaderboards, badges, health and footer show "company". A client-side router.push('/organization/<slug>') lands on the real company page.
  • Code review only (local data or setup missing): collection pages, the docs site.
  • The organization-dependency and contributor-dependency embeds 500 without a metric param. This predates the PR and also happens on the untouched contributor embed.

Deploy

No migrations or Tinybird changes. The CDP PR renames the admin widget names to match; merge both on the same day.

Closes linuxfoundation/lfx-cdp-insights-ops#1006

CDP counterpart: linuxfoundation/crowd.dev#5289

Signed-off-by: Gašper Grom <gasper.grom@gmail.com>
Signed-off-by: Gašper Grom <gasper.grom@gmail.com>
Signed-off-by: Gašper Grom <gasper.grom@gmail.com>
Copilot AI balanced review requested due to automatic review settings November 9, 2026 15:34
@cursor

cursor Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

PR Summary

Medium Risk
Wide copy and URL changes with SEO-critical 301 redirects; internal APIs and data keys are unchanged, limiting backend risk.

Overview
Rebrands organization to company across the product: UI copy, widgets, leaderboards, badges, health breakdowns, CNCF reports, search, SEO meta, docs, llms.txt, and OpenAPI field descriptions (public profile URLs now reference /company/{slug}).

Routing and URLs: company profile pages move from /organization/<slug> to /company/<slug>; company leaderboards use new path segments (companies, active-companies) while internal leaderboardType keys stay unchanged. config/leaderboard-slugs.ts maps keys ↔ URL slugs; links, the leaderboard page, and the sitemap use it. 301 redirects (case-insensitive, query/hash preserved) land old /organization/* and legacy leaderboard segments on the new paths; bare /organization 404s. The route enum updates to company-orgSlug. Contributor tables link to /company/…. Production caching rules target /company/** instead of /organization/**.

Small UX tweak: geographical distribution map tooltips pluralize the series label via pluralize so “Companies” reads correctly.

Unchanged by design: /api/organization-page/*, widget keys, enums, and data layer naming.

Reviewed by Cursor Bugbot for commit 3306664. Bugbot is set up for automated code reviews on this repo. Configure here.

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.

🟡 Changes recommended

The shared map tooltip formatter incorrectly pluralizes “Company” as “Companys,” affecting country hover text in both the geographical distribution widget and drawer.

1 open issue
What changed in this PR

Renames user-facing “Organization” terminology to “Company” throughout Insights while preserving existing API paths, data keys, and backend contracts.

Changes:

  • Moves company pages and company leaderboards to new URLs, with redirects from legacy paths.
  • Updates UI copy, metadata, documentation, and widget documentation links.
  • Adds leaderboard slug mapping and updates navigation, sitemap generation, and related tests.
File Description
frontend/​test/​config/​health-breakdown-templates-org-diversity.test.ts Updates company-diversity assertions.
frontend/​setup/​caching.ts Adds leaderboard redirects and company-page caching.
frontend/​setup/​caching.test.ts Tests redirects and company caching rules.
frontend/​server/​api/​seo/​sitemap/​leaderboards.ts Uses public leaderboard slugs.
frontend/​server/​api/​organization-page/​[orgSlug]/​kpis.get.ts Updates not-found wording.
frontend/​server/​api/​organization-page/​[orgSlug].get.ts Updates not-found wording.
frontend/​public/​llms.txt Uses company terminology.
frontend/​docs/​more/​glossary/​index.md Renames the company definition and references.
frontend/​docs/​more/​faq/​index.md Updates affiliation terminology.
frontend/​docs/​metrics/​health-score/​index.md Renames company diversity documentation.
frontend/​docs/​metrics/​contributors/​index.md Updates company metric headings and explanations.
frontend/​docs/​introduction/​what-is-insights/​index.md Updates introductory copy.
frontend/​docs/​introduction/​maintainers/​index.md Updates affiliation wording.
frontend/​docs/​introduction/​lf-oss-index/​index.md Updates company participation descriptions.
frontend/​docs/​introduction/​data-quality/​index.md Updates company data-quality terminology.
frontend/​docs/​introduction/​contributor-affiliations/​index.md Updates affiliation explanations.
frontend/​docs/​features/​organization-page/​index.md Renames documentation without changing its URL.
frontend/​docs/​features/​community-collections/​index.md Updates company metric names.
frontend/​docs/​.vitepress/​config.ts Renames the sidebar entry.
frontend/​config/​leaderboard-slugs.ts Maps stable leaderboard keys to public slugs.
frontend/​config/​health-breakdown-templates.ts Updates company-diversity descriptions and plurals.
frontend/​app/​pages/​report/​cncf-france.vue Updates report metadata.
frontend/​app/​pages/​project/​[slug]/​repository/​[name]/​contributors.vue Updates repository contributor metadata.
frontend/​app/​pages/​project/​[slug]/​repository-group/​[groupSlug]/​contributors.vue Updates repository-group contributor metadata.
frontend/​app/​pages/​project/​[slug]/​contributors.vue Updates contributor titles and metadata.
frontend/​app/​pages/​organization/​[...slug].vue Redirects legacy paths, preserving query and hash.
frontend/​app/​pages/​leaderboards/​[key].vue Resolves public slugs to leaderboard keys.
frontend/​app/​pages/​company/​[orgSlug]/​index.vue Updates company-page metadata fallback.
frontend/​app/​pages/​company/​[orgSlug].vue Updates company-page error text.
frontend/​app/​pages/​collection/​details/​[slug]/​development.vue Updates collection metadata fallback.
frontend/​app/​pages/​collection/​details/​[slug]/​contributors.vue Updates collection contributor metadata.
frontend/​app/​components/​shared/​types/​routes.ts Points the route constant to company pages.
frontend/​app/​components/​shared/​layout/​search/​search.vue Updates search prompt.
frontend/​app/​components/​shared/​layout/​search/​search-result.vue Updates company tabs and empty states.
frontend/​app/​components/​shared/​layout/​search/​search-modal.vue Updates search placeholder.
frontend/​app/​components/​shared/​layout/​footer.vue Updates introductory footer copy.
frontend/​app/​components/​modules/​widget/​config/​contributor/​retention/​retention.vue Uses display labels for retention headings.
frontend/​app/​components/​modules/​widget/​config/​contributor/​retention/​retention.config.ts Updates retention description.
frontend/​app/​components/​modules/​widget/​config/​contributor/​organizations-leaderboard/​organizations-leaderboard.vue Updates leaderboard controls and error text.
frontend/​app/​components/​modules/​widget/​config/​contributor/​organizations-leaderboard/​organizations-leaderboard.config.ts Updates widget copy and documentation anchor.
frontend/​app/​components/​modules/​widget/​config/​contributor/​organizations-leaderboard/​fragments/​organization-leaderboard-drawer.vue Updates drawer error text.
frontend/​app/​components/​modules/​widget/​config/​contributor/​organization-dependency/​organization-dependency.vue Updates dependency labels and error text.
frontend/​app/​components/​modules/​widget/​config/​contributor/​organization-dependency/​organization-dependency.config.ts Updates dependency copy, benchmarks, and documentation link.
frontend/​app/​components/​modules/​widget/​config/​contributor/​geographical-distribution/​geographical-distribution.vue Updates company tabs and map labels.
frontend/​app/​components/​modules/​widget/​config/​contributor/​geographical-distribution/​geographical-distribution.config.ts Updates geographical-distribution description.
frontend/​app/​components/​modules/​widget/​config/​contributor/​geographical-distribution/​fragments/​geographical-distribution-drawer.vue Updates drawer tabs and map labels.
frontend/​app/​components/​modules/​widget/​config/​contributor/​active-organizations/​active-organizations.vue Updates chart, snapshot, and error labels.
frontend/​app/​components/​modules/​widget/​config/​contributor/​active-organizations/​active-organizations.config.ts Updates widget copy and documentation anchor.
frontend/​app/​components/​modules/​widget/​components/​contributors/​fragments/​organizations-table.vue Updates table labels and company links.
frontend/​app/​components/​modules/​report/​health-score-coverage/​config/​signals.ts Renames the diversity signal label.
frontend/​app/​components/​modules/​report/​health-score-coverage/​components/​signal-scores.vue Updates diversity score label.
frontend/​app/​components/​modules/​report/​health-score-coverage/​components/​signal-availability-lf.vue Updates diversity availability label.
frontend/​app/​components/​modules/​report/​cncf/​views/​cncf-report.vue Updates report description.
frontend/​app/​components/​modules/​report/​cncf-country/​views/​cncf-country-report.vue Updates report headings, metrics, and methodology copy.
frontend/​app/​components/​modules/​report/​cncf-country/​components/​cncf-country-split.vue Updates affiliation segment labels.
frontend/​app/​components/​modules/​report/​cncf-country/​components/​cncf-country-organizations.vue Renames the company table header.
frontend/​app/​components/​modules/​report/​cncf-country/​components/​cncf-country-comparison.vue Updates comparison labels.
frontend/​app/​components/​modules/​project/​config/​yaml-generation/​shared/​components/​yaml-core-member-item.vue Updates affiliation placeholder.
frontend/​app/​components/​modules/​project/​config/​yaml-generation/​shared/​components/​yaml-administrator-item.vue Updates affiliation placeholder.
frontend/​app/​components/​modules/​project/​components/​overview/​health-breakdown-section.vue Renames the company-diversity row.
frontend/​app/​components/​modules/​project/​components/​list/​project-list-item.vue Updates company-count label.
frontend/​app/​components/​modules/​organization/​components/​overview/​projects-section.vue Updates company-name fallback.
frontend/​app/​components/​modules/​organization/​components/​overview/​locked-contributors-section.vue Updates company call-to-action copy.
frontend/​app/​components/​modules/​organization/​components/​overview/​kpi-row.vue Updates company-name fallback.
frontend/​app/​components/​modules/​organization/​components/​overview/​contributors-chart.vue Updates company-name fallback.
frontend/​app/​components/​modules/​organization/​components/​overview/​activity-chart.vue Updates company-name fallback.
frontend/​app/​components/​modules/​organization/​components/​header.vue Updates share-title fallback.
frontend/​app/​components/​modules/​leaderboards/​config/​top-100-organizations.config.ts Renames leaderboard copy while retaining its key.
frontend/​app/​components/​modules/​leaderboards/​config/​most-active-organizations.config.ts Updates company leaderboard and metric labels.
frontend/​app/​components/​modules/​leaderboards/​components/​sections/​leaderboard-sidebar.vue Uses public slugs in sidebar links.
frontend/​app/​components/​modules/​leaderboards/​components/​sections/​leaderboard-mobile-nav.vue Uses public slugs in mobile navigation.
frontend/​app/​components/​modules/​leaderboards/​components/​sections/​leaderboard-card.vue Updates navigation and share URLs.
frontend/​app/​components/​modules/​explore/​components/​explore-header.vue Updates introductory copy.
frontend/​app/​components/​modules/​collection/​views/​collection-details.vue Updates dependency column heading.
frontend/​app/​components/​modules/​collection/​components/​details/​filters.vue Renames company sorting option.
frontend/​app/​components/​modules/​collection/​components/​details/​dependency-details.vue Updates dependency labels and pluralization.
frontend/​app/​components/​modules/​collection/​components/​details/​dependency-column.vue Uses company pluralization.
frontend/​app/​components/​modules/​collection/​components/​details/​badge-details.vue Uses public leaderboard slugs.
frontend/​app/​components/​modules/​badges/​config/​badges/​active-organizations.config.ts Updates badge title and description.
frontend/​app/​components/​modules/​badges/​components/​badges-popover.vue Uses public leaderboard slugs.

Review effort: Balanced

const label = computed(() => (model.value.activeTab === 'contributors' ? 'Contributor' : 'Organization'));
const activeTabLabel = computed(() => tabs.find((tab) => tab.value === model.value.activeTab)?.label);

const label = computed(() => (model.value.activeTab === 'contributors' ? 'Contributor' : 'Company'));
Copilot AI balanced review requested due to automatic review settings November 9, 2026 15:43

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.

🔵 Needs a closer look

The map tooltip incorrectly renders the new “Company” label as “Companys” because the shared formatter appends “s” instead of using proper pluralization.

1 open issue

Review effort: Balanced

Copilot AI balanced review requested due to automatic review settings November 9, 2026 15:57

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.

🔵 Needs a closer look

The renamed Company series produces incorrect country tooltip text such as “2 Companys” because the shared formatter appends “s” instead of using count-aware pluralization.

1 open issue

Review effort: Balanced

Refs linuxfoundation/lfx-cdp-insights-ops#1006

Signed-off-by: Gašper Grom <gasper.grom@gmail.com>
Copilot AI balanced review requested due to automatic review settings November 9, 2026 16:39

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.

🔵 Needs a closer look

The Companies map tooltip incorrectly displays “2 Companys” because the shared formatter appends a literal “s” instead of using count-aware pluralization.

1 open issue

Review effort: Balanced

Copilot AI balanced review requested due to automatic review settings November 9, 2026 16:51

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.

🔵 Needs a closer look

The Companies map tooltip renders incorrect plurals such as “2 Companys” because the shared formatter appends a literal “s” instead of using count-aware pluralization.

1 open issue

Review effort: Balanced

Refs linuxfoundation/lfx-cdp-insights-ops#1006

Signed-off-by: Gašper Grom <gasper.grom@gmail.com>
Copilot AI balanced review requested due to automatic review settings November 9, 2026 22:40

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.

🟢 Approval recommended

No active review issues are recorded for the user-facing Organization-to-Company terminology update.

1 open issue

Review effort: Balanced

@gaspergrom
gaspergrom merged commit e395d04 into main Nov 9, 2026
14 checks passed
@gaspergrom
gaspergrom deleted the feat/OPS-1006 branch November 9, 2026 22:53
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.

2 participants