From 0c0e144c9cd3c5a3f744f11af22da76e2fcf80a5 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sat, 27 Jun 2026 08:32:35 +0100 Subject: [PATCH 1/8] feat: sponsors --- app/components/AppFooter.vue | 4 + .../useCommandPaletteGlobalCommands.ts | 10 + app/pages/about.vue | 5 + app/pages/sponsors.vue | 155 ++++++++++++++ i18n/locales/en.json | 63 ++++++ i18n/schema.json | 189 ++++++++++++++++++ nuxt.config.ts | 1 + .../middleware/canonical-redirects.global.ts | 1 + 8 files changed, 428 insertions(+) create mode 100644 app/pages/sponsors.vue diff --git a/app/components/AppFooter.vue b/app/components/AppFooter.vue index 2ee2a47f19..96f0aabd8a 100644 --- a/app/components/AppFooter.vue +++ b/app/components/AppFooter.vue @@ -48,6 +48,10 @@ const footerSections = computed>(( name: t('footer.about'), href: '/about', }, + { + name: t('footer.sponsors'), + href: '/sponsors', + }, { name: t('footer.brand'), href: '/brand', diff --git a/app/composables/useCommandPaletteGlobalCommands.ts b/app/composables/useCommandPaletteGlobalCommands.ts index 49c873cf64..6d3d992ad9 100644 --- a/app/composables/useCommandPaletteGlobalCommands.ts +++ b/app/composables/useCommandPaletteGlobalCommands.ts @@ -323,6 +323,16 @@ export function useCommandPaletteGlobalCommands() { ), to: { name: 'noodles' }, }, + { + id: 'sponsors', + group: 'npmx', + label: t('sponsors.title'), + keywords: [t('sponsors.title')], + iconClass: 'i-lucide:heart', + active: route.name === 'sponsors', + activeLabel: activeLabel(route.name === 'sponsors', t('command_palette.here')), + to: { name: 'sponsors' }, + }, { id: 'brand', group: 'npmx', diff --git a/app/pages/about.vue b/app/pages/about.vue index 3a31704347..038d0d6dbe 100644 --- a/app/pages/about.vue +++ b/app/pages/about.vue @@ -149,6 +149,11 @@ const communityContributors = computed(

{{ $t('about.sponsors.title') }}

+

+ + {{ $t('sponsors_page.cta') }} + +

+const platinumBenefits = computed(() => [ + $t('sponsors_page.tiers.platinum.benefit_1'), + $t('sponsors_page.tiers.platinum.benefit_2'), +]) + +useSeoMeta({ + title: () => `${$t('sponsors_page.title')} - npmx`, + ogTitle: () => `${$t('sponsors_page.title')} - npmx`, + twitterTitle: () => `${$t('sponsors_page.title')} - npmx`, + description: () => $t('sponsors_page.meta_description'), + ogDescription: () => $t('sponsors_page.meta_description'), + twitterDescription: () => $t('sponsors_page.meta_description'), +}) + +defineOgImage( + 'Page.takumi', + { + title: () => $t('sponsors_page.title'), + description: () => $t('sponsors_page.meta_description'), + }, + { alt: () => `${$t('sponsors_page.title')} — npmx` }, +) + + + diff --git a/i18n/locales/en.json b/i18n/locales/en.json index b576ab7c72..09e0f2b5d1 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -13,6 +13,7 @@ "trademark_disclaimer": "npm is a registered trademark of npm, Inc. This site is not affiliated with npm, Inc.", "footer": { "about": "about", + "sponsors": "sponsors", "blog": "blog", "docs": "docs", "source": "source", @@ -1265,6 +1266,68 @@ } } }, + "sponsors_page": { + "title": "Sponsors", + "heading": "sponsors", + "meta_description": "Support npmx and help us accelerate ecosystem work around security, trust, optimization, and research.", + "intro": "Support npmx and help us grow the ecosystem work we do for developers and maintainers.", + "what_we_do": { + "title": "What we do", + "description": "We're building an ecosystem that solves problems around security, trust, optimization, and research for the tools we use in everyday development - quickly, conveniently, and with high quality. This project is built by developers for developers. As authors of widely used libraries, we understand team needs and actively study what maintainers and projects need most." + }, + "what_support_means": { + "title": "What support means", + "description": "Our plans keep growing, along with our desire to share what we've built and learn from others. Your support helps the project, talks, community, and ecosystem, and most importantly enables us to join larger events and plan more ambitious work." + }, + "cta": "See sponsorship tiers", + "what_this_means_for_you": { + "title": "What this means for you", + "description": "npmx is not only about improving developer experience and closing critical everyday gaps. In our first six months, we have already become the default source for thousands of teams and a huge number of developers. You get not only a more stable tool for your teams, but also visibility in front of a constantly growing audience.", + "cards": { + "visitors": { + "title": "200000+", + "description": "monthly visitors" + }, + "community": { + "title": "fast-growing", + "description": "We have one of the fastest-growing communities in the ecosystem" + }, + "adoption": { + "title": "adoption", + "description": "charts at conferences, talks, and articles rely on our data" + }, + "default_source": { + "title": "default source", + "description": "pnpm made npmx the default source" + } + }, + "bullets": { + "traffic": "npmx now has more than 200,000 monthly visitors, after filtering artificial traffic.", + "community": "We have one of the fastest-growing communities in the ecosystem.", + "visibility": "Charts at conferences, talks, and articles rely on our data; many packages and ecosystems are switching links to npmx; pnpm has made npmx the default source." + } + }, + "tiers": { + "title": "Sponsorship tiers", + "silver": { + "name": "Silver", + "price": "$500/month", + "description": "We display your logo on the sponsors and about pages." + }, + "gold": { + "name": "Gold", + "price": "$1,000/month", + "description": "Everything in Silver, plus we display your name in the footer on every page." + }, + "platinum": { + "name": "Platinum", + "price": "Custom", + "description": "Everything in Gold, plus:", + "benefit_1": "We display your logo at npmx meetups and talks related to npmx, where event organizers allow it.", + "benefit_2": "We publish a dedicated article when sponsorship begins, plus follow-up articles after 6 and 12 months. We're also happy to help you write an article for your own blog and share any info you need." + } + } + }, "account_menu": { "connect": "connect", "account": "Account", diff --git a/i18n/schema.json b/i18n/schema.json index 92bfa204d3..076f9bfb17 100644 --- a/i18n/schema.json +++ b/i18n/schema.json @@ -43,6 +43,9 @@ "about": { "type": "string" }, + "sponsors": { + "type": "string" + }, "blog": { "type": "string" }, @@ -3799,6 +3802,192 @@ }, "additionalProperties": false }, + "sponsors_page": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "heading": { + "type": "string" + }, + "meta_description": { + "type": "string" + }, + "intro": { + "type": "string" + }, + "what_we_do": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "additionalProperties": false + }, + "what_support_means": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "additionalProperties": false + }, + "cta": { + "type": "string" + }, + "what_this_means_for_you": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "cards": { + "type": "object", + "properties": { + "visitors": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "additionalProperties": false + }, + "community": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "additionalProperties": false + }, + "adoption": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "additionalProperties": false + }, + "default_source": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "bullets": { + "type": "object", + "properties": { + "traffic": { + "type": "string" + }, + "community": { + "type": "string" + }, + "visibility": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "tiers": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "silver": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "price": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "additionalProperties": false + }, + "gold": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "price": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "additionalProperties": false + }, + "platinum": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "price": { + "type": "string" + }, + "description": { + "type": "string" + }, + "benefit_1": { + "type": "string" + }, + "benefit_2": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, "account_menu": { "type": "object", "properties": { diff --git a/nuxt.config.ts b/nuxt.config.ts index eb3d7fc36d..580f8777c8 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -216,6 +216,7 @@ export default defineNuxtConfig({ '/pds': { isr: 86400 }, // revalidate daily '/blog/**': { prerender: true }, '/noodles/**': { prerender: true }, + '/sponsors': { prerender: true }, // proxy for insights '/_v/script.js': { proxy: 'https://npmx.dev/_vercel/insights/script.js', diff --git a/server/middleware/canonical-redirects.global.ts b/server/middleware/canonical-redirects.global.ts index 32161fe483..738612c2a7 100644 --- a/server/middleware/canonical-redirects.global.ts +++ b/server/middleware/canonical-redirects.global.ts @@ -22,6 +22,7 @@ const pages = [ '/brand', '/compare', '/noodles', + '/sponsors', '/org', '/package', '/package-code', From 09725bbffe9e445f6946acdaad2abbcee2fd521b Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sat, 27 Jun 2026 08:37:40 +0100 Subject: [PATCH 2/8] chore: fix i18n issues --- .../useCommandPaletteGlobalCommands.ts | 4 ++-- i18n/locales/en.json | 6 ------ i18n/schema.json | 18 ------------------ 3 files changed, 2 insertions(+), 26 deletions(-) diff --git a/app/composables/useCommandPaletteGlobalCommands.ts b/app/composables/useCommandPaletteGlobalCommands.ts index 6d3d992ad9..7b4a2b9278 100644 --- a/app/composables/useCommandPaletteGlobalCommands.ts +++ b/app/composables/useCommandPaletteGlobalCommands.ts @@ -326,8 +326,8 @@ export function useCommandPaletteGlobalCommands() { { id: 'sponsors', group: 'npmx', - label: t('sponsors.title'), - keywords: [t('sponsors.title')], + label: t('sponsors_page.title'), + keywords: [t('sponsors_page.title')], iconClass: 'i-lucide:heart', active: route.name === 'sponsors', activeLabel: activeLabel(route.name === 'sponsors', t('command_palette.here')), diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 09e0f2b5d1..63c50ec875 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -1285,7 +1285,6 @@ "description": "npmx is not only about improving developer experience and closing critical everyday gaps. In our first six months, we have already become the default source for thousands of teams and a huge number of developers. You get not only a more stable tool for your teams, but also visibility in front of a constantly growing audience.", "cards": { "visitors": { - "title": "200000+", "description": "monthly visitors" }, "community": { @@ -1300,11 +1299,6 @@ "title": "default source", "description": "pnpm made npmx the default source" } - }, - "bullets": { - "traffic": "npmx now has more than 200,000 monthly visitors, after filtering artificial traffic.", - "community": "We have one of the fastest-growing communities in the ecosystem.", - "visibility": "Charts at conferences, talks, and articles rely on our data; many packages and ecosystems are switching links to npmx; pnpm has made npmx the default source." } }, "tiers": { diff --git a/i18n/schema.json b/i18n/schema.json index 076f9bfb17..404b6517c5 100644 --- a/i18n/schema.json +++ b/i18n/schema.json @@ -3859,9 +3859,6 @@ "visitors": { "type": "object", "properties": { - "title": { - "type": "string" - }, "description": { "type": "string" } @@ -3906,21 +3903,6 @@ } }, "additionalProperties": false - }, - "bullets": { - "type": "object", - "properties": { - "traffic": { - "type": "string" - }, - "community": { - "type": "string" - }, - "visibility": { - "type": "string" - } - }, - "additionalProperties": false } }, "additionalProperties": false From 7df31a99cfd624c5206a0797730ca0a8a6d47887 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sat, 27 Jun 2026 08:42:07 +0100 Subject: [PATCH 3/8] chore: add info about announcements to sponsors plans --- i18n/locales/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 63c50ec875..e704d22abc 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -1306,12 +1306,12 @@ "silver": { "name": "Silver", "price": "$500/month", - "description": "We display your logo on the sponsors and about pages." + "description": "We display your logo on the sponsors and about pages, and announce you on our socials." }, "gold": { "name": "Gold", "price": "$1,000/month", - "description": "Everything in Silver, plus we display your name in the footer on every page." + "description": "Everything in Silver, plus we display your name in the footer on every page and announce you in the next release." }, "platinum": { "name": "Platinum", From 4c1a351b10aaca83904f2a331dd3a303acff5342 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sun, 28 Jun 2026 08:40:31 +0100 Subject: [PATCH 4/8] feat: improve sponsors page copyright and ui --- app/pages/sponsors.vue | 133 ++++++++++++++++++++++++++++++----------- i18n/locales/en.json | 15 +++-- i18n/schema.json | 23 ++++++- 3 files changed, 130 insertions(+), 41 deletions(-) diff --git a/app/pages/sponsors.vue b/app/pages/sponsors.vue index 93214e7870..afa48e0a83 100644 --- a/app/pages/sponsors.vue +++ b/app/pages/sponsors.vue @@ -1,4 +1,14 @@ + + From 7e7e8a2662b09eea40d45f091244c897d71a0955 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 29 Jun 2026 06:43:03 +0100 Subject: [PATCH 6/8] chore: update sponsorship tiers --- app/pages/sponsors.vue | 352 +++++++++++++++++++---------------------- i18n/locales/en.json | 13 +- i18n/schema.json | 9 +- 3 files changed, 177 insertions(+), 197 deletions(-) diff --git a/app/pages/sponsors.vue b/app/pages/sponsors.vue index 4bda833553..3c0c74d2c8 100644 --- a/app/pages/sponsors.vue +++ b/app/pages/sponsors.vue @@ -4,12 +4,11 @@ import { SPONSORS } from '~/assets/logos/sponsors' const silverBenefits = computed(() => [ $t('sponsors_page.tiers.silver.benefit_1'), $t('sponsors_page.tiers.silver.benefit_2'), + $t('sponsors_page.tiers.silver.benefit_3'), + $t('sponsors_page.tiers.silver.benefit_4'), ]) -const goldBenefits = computed(() => [ - $t('sponsors_page.tiers.gold.benefit_1'), - $t('sponsors_page.tiers.gold.benefit_2'), -]) +const goldBenefits = computed(() => [$t('sponsors_page.tiers.gold.benefit_1')]) const platinumBenefits = computed(() => [ $t('sponsors_page.tiers.platinum.benefit_1'), @@ -37,211 +36,188 @@ defineOgImage( diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 0bb884f877..37d581a795 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -1313,22 +1313,23 @@ "silver": { "name": "Silver", "price": "$500/month", - "benefit_1": "We display your logo on the sponsors and about pages.", - "benefit_2": "We announce you on our socials." + "benefit_1": "We display your logo on the sponsors and about pages in the appropriate category.", + "benefit_2": "We display your name in the footer on every page.", + "benefit_3": "We announce you on our socials.", + "benefit_4": "We display your logo at npmx meetups and talks related to npmx, where event organizers allow it." }, "gold": { "name": "Gold", "price": "$1,000/month", "description": "Everything in Silver, plus:", - "benefit_1": "We display your name in the footer on every page.", - "benefit_2": "We announce you in the next release." + "benefit_1": "We announce you in the next release." }, "platinum": { "name": "Platinum", "price": "Custom", "description": "Everything in Gold, plus:", - "benefit_1": "We display your logo at npmx meetups and talks related to npmx, where event organizers allow it.", - "benefit_2": "We publish a dedicated article when sponsorship begins, plus follow-up articles after 6 and 12 months. We're also happy to help you write an article for your own blog and share any info you need." + "benefit_1": "We publish a dedicated article when sponsorship begins, plus follow-up articles after 6 and 12 months. We're also happy to help you write an article for your own blog and share any info you need.", + "benefit_2": "Let's talk." } } }, diff --git a/i18n/schema.json b/i18n/schema.json index 46ca8f2fff..f3f4b1a54d 100644 --- a/i18n/schema.json +++ b/i18n/schema.json @@ -3948,6 +3948,12 @@ }, "benefit_2": { "type": "string" + }, + "benefit_3": { + "type": "string" + }, + "benefit_4": { + "type": "string" } }, "additionalProperties": false @@ -3966,9 +3972,6 @@ }, "benefit_1": { "type": "string" - }, - "benefit_2": { - "type": "string" } }, "additionalProperties": false From 397ac75628ea6afba8a155b614e7eef10cf7cf57 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 29 Jun 2026 13:59:50 +0100 Subject: [PATCH 7/8] chore: update sponsorship tiers --- app/pages/sponsors.vue | 74 +++++++++++++++--------------------------- i18n/locales/en.json | 22 ++++--------- i18n/schema.json | 42 ++++-------------------- 3 files changed, 39 insertions(+), 99 deletions(-) diff --git a/app/pages/sponsors.vue b/app/pages/sponsors.vue index 3c0c74d2c8..74517bde3f 100644 --- a/app/pages/sponsors.vue +++ b/app/pages/sponsors.vue @@ -1,19 +1,21 @@