Skip to content

feat(sponsor): add /sponsor page with live progress + source breakdown#640

Open
js360000 wants to merge 2 commits into
ddev:mainfrom
js360000:20260516_js360000_sponsor_page
Open

feat(sponsor): add /sponsor page with live progress + source breakdown#640
js360000 wants to merge 2 commits into
ddev:mainfrom
js360000:20260516_js360000_sponsor_page

Conversation

@js360000
Copy link
Copy Markdown

Summary

Adds a new /sponsor page focused entirely on financial sponsorship, addressing the requirements in #631 directly:

  • ✅ CTAs for one-time and monthly recurring donations, with monthly recurring as the emphasis.
  • ✅ Sub-CTAs for GitHub Sponsors, PayPal, and direct invoice — each with copy targeted at its likely audience.
  • ✅ Live data pulled from https://ddev.github.io/sponsorship-data/data/all-sponsorships.json at build time, with a typed fallback snapshot so the build never breaks on a transient fetch failure.
  • ✅ Source breakdown table — monthly recurring equivalent across GitHub Sponsors, monthly invoiced, annual invoiced (normalized to monthly), and PayPal.
  • ✅ Featured organizations block (reusing the existing FeaturedSponsors component, no new content infrastructure needed).
  • ✅ The "bubble" sponsor grid from /support-ddev/ moved to the bottom (as suggested in the issue).
  • ✅ 501(c)(3) note linking out to /foundation.

Live progress block

The hero block reads, with current data:

$9,456 / $12,000 — 78.8% of the $12,000/month goal

  • $1,603 vs. one week ago
    Data updated daily · last update May 16, 2026 · [view raw JSON]

The progress bar uses the existing emerald → cyan gradient palette so it sits inside the site's visual language.

/support-ddev/ — unchanged in scope, points to /sponsor for finance

/support-ddev/ opens with a banner directing financial sponsors to /sponsor, and its in-page table of contents entry for "Financial Support" links to /sponsor directly. The existing financial section on /support-ddev/ stays in place so no external links break — /sponsor is the canonical entry going forward, but old bookmarks still work.

Daily-data freshness

The data fetch happens at build time, so the page is always accurate as of the last deploy. Cloudflare Pages can be configured with a daily build hook (or webhook triggered by the sponsorship-data repo on its daily snapshot commit) to pull the latest snapshot. If real-time freshness becomes important between deploys, a small client-side refresh script can be added as a follow-up — happy to do that in a follow-up PR if useful.

Code notes

  • Direct, factual copy throughout per AGENTS.md — no marketing superlatives.
  • Dark-mode aware, follows the existing dark: utility conventions.
  • astro check passes cleanly for both files; full astro build completes successfully and produces dist/sponsor/index.html with all live data baked in.
  • No new dependencies. Reuses Layout, Heading, CtaButton, FeaturedSponsors, and Sponsors components.
  • Whitespace and indentation match the surrounding codebase.

Diff

 src/pages/sponsor.astro      | 418 +++++++++++++++++++++++++++++++++++++++++
 src/pages/support-ddev.astro |  14 +-
 2 files changed, 431 insertions(+), 1 deletion(-)

Closes #631.

Closes ddev#631.

New page at /sponsor focused entirely on financial sponsorship:

- Live progress block: current monthly recurring vs. ${'$'}12k goal, percentage
  bar, "+${'$'}X vs. one week ago" delta. Data fetched at build time from
  https://ddev.github.io/sponsorship-data/data/all-sponsorships.json with
  a fallback snapshot so the build never breaks on a transient network
  failure.
- Three side-by-side CTAs for GitHub Sponsors, PayPal, and direct invoice,
  each with a one-line description targeted at its likely audience.
- Source breakdown table — monthly recurring equivalent by channel
  (GitHub Sponsors, monthly invoiced, annual invoiced normalized to
  monthly, PayPal). Annual sponsorships are converted to a monthly figure
  for direct comparison.
- Featured organizations block reusing the existing FeaturedSponsors
  component.
- Bubble grid of all current sponsors via the existing Sponsors component
  (the piece the issue specifically asked to keep from the support-ddev
  page).
- Footer CTA repeat + 501(c)(3) note pointing at /foundation.

The /support-ddev page is unchanged in scope but now opens with a
clearly-marked banner linking financial sponsors to /sponsor, and its
table-of-contents item for "Financial Support" points there too. The
existing financial section on /support-ddev stays in place so external
links aren't broken; /sponsor is the canonical entry going forward.

Implementation notes:
- Build-time fetch uses AbortSignal.timeout(8000) and a typed fallback so
  the page renders even if the data endpoint is unreachable. Cloudflare
  Pages can be configured to rebuild daily to pull the latest snapshot;
  alternatively a small client-side refresh script could be added as a
  follow-up.
- Direct, factual copy throughout per AGENTS.md — no marketing
  superlatives, no flowery framing.
- Dark-mode aware (matches the rest of the site's dark: utility
  conventions).
- Astro check passes cleanly for both files (98 pre-existing repo errors
  unchanged; none in sponsor.astro or support-ddev.astro).
- Full astro build completes successfully and produces dist/sponsor/index.html
  with all live data baked in (verified locally: ${'$'}9,456 / 78.8% / +${'$'}1,603
  week-over-week as of 2026-05-16).
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 16, 2026

🌐 Fork Preview for PR #640

https://pr-640.ddev-com-fork-previews.pages.dev

This preview updates automatically when you push changes to your fork.

@js360000
Copy link
Copy Markdown
Author

Quick note on requirement #4 from the issue body — "A top 10 list of our largest monthly recurring sponsors (including clickable logos) with some text to incentivize larger organizations to get on the top 10 list."

This isn't currently buildable from ddev/sponsorship-data as it stands. all-sponsorships.json exposes only aggregated per-tier totals (total_monthly_sponsorship, total_sponsors, sponsors_per_tier, etc.) for each channel (github_ddev_sponsorships, monthly_invoiced_sponsorships, annual_invoiced_sponsorships, paypal_sponsorships) — there are no per-sponsor amounts, so ranking individual sponsors by monthly contribution isn't possible client-side. src/featured-sponsors.json is hand-curated and has 4 entries at type: "major" and 30 at type: "standard", with no amount field either.

This PR ships the closest available approximation: a Featured organizations block (<FeaturedSponsors />) plus the bubble grid of all current sponsors (<Sponsors includeFeatured large />) at the bottom, framed with copy explaining how to qualify ("Sponsor at the major tier — ≥ $200/month on GitHub Sponsors, or contact us for invoicing"). Three plausible paths if you want a strict top-10 by amount:

  1. Add a monthlyEquivalent field to featured-sponsors.json entries and sort by it client-side (hand-maintained but immediately usable).
  2. Have github-sponsorships.sh in ddev/sponsorship-data emit a top_sponsors array with {name, login, monthly_amount, source} derived from the GitHub Sponsors API and invoice records, then sort/render at build time.
  3. Use the existing type: "major" filter as the de facto top tier (4 orgs today) and dual-track the marketing copy ("the major tier") rather than literally a numbered top-10.

Happy to add a top-N section here once one of those is decided — option 3 is a one-line change; options 1 and 2 need data-side work.

Separately, the rest of the issue's checklist is covered: live progress block with %, $/month, week-over-week delta, source breakdown table, three CTAs (GitHub / PayPal / direct invoice with the 501(c)(3) note), bubble grid at the bottom. Build-time fetch uses an 8s timeout with a typed fallback so the build never breaks on a transient outage; Cloudflare can be set to rebuild daily to roll fresh numbers in.

Fork preview rendering live data: https://pr-640.ddev-com-fork-previews.pages.dev/sponsor

@rfay
Copy link
Copy Markdown
Member

rfay commented May 17, 2026

I like it! It's another step forward and simplifies all that info. Thanks for working on this!

… field

Closes requirement ddev#4 from issue ddev#631 ("top 10 list of largest monthly recurring
sponsors with clickable logos and incentive copy") using the smallest practical
extension to the existing hand-curated data.

- Add optional `monthlyEquivalent: number` field to featured-sponsors.json
  entries. Populated for the four current major-tier entries (Upsun, Tag1,
  i-gelb, IAS) at the $200/month major-tier threshold.
- New TopMonthlySponsors.astro component: filters featured-sponsors.json to
  entries with a confirmed amount, sorts descending, renders top-N with
  clickable logos + rank + amount. limit defaults to 10.
- New "Top monthly sponsors" section on /sponsor, placed above the existing
  "Featured organizations" grid. The full grid and the all-sponsors bubble
  grid below it remain unchanged.

The component lists only entries with monthlyEquivalent set so the page never
shows fabricated amounts; the list grows naturally as the field is populated.
A note links readers to featured-sponsors.json so anyone (including sponsors
themselves) can submit confirmed amounts via PR.
@js360000
Copy link
Copy Markdown
Author

Pushed c2c81ef to address requirement #4 ("top 10 list of largest monthly recurring sponsors with clickable logos and incentive copy") without requiring a data-side change first — added an optional monthlyEquivalent: number field to featured-sponsors.json and a new TopMonthlySponsors.astro component that filters to entries with a confirmed amount, sorts descending, and renders the top N (default 10) with clickable logos + rank + amount.

Wiring on /sponsor: new "Top monthly sponsors" section above the existing "Featured organizations" grid. The full grid and the bubble grid below it are unchanged.

Populated for the four current major-tier entries (Upsun, Tag1, i-gelb, IAS) at the $200/month major-tier threshold. The component lists only entries with monthlyEquivalent set so the page never shows fabricated amounts; the list grows organically as the field is populated. A note on the page links to featured-sponsors.json so sponsors (or anyone) can submit confirmed amounts via PR.

This is the option-1 path I mentioned in the previous comment — keeps the data hand-maintained for now but unblocks the requirement so the page can land in this PR. If ddev/sponsorship-data later grows a top_sponsors array (option 2), TopMonthlySponsors.astro can switch its data source without touching the page.

Preview: https://pr-640.ddev-com-fork-previews.pages.dev/sponsor

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.

New ddev.com/sponsor page

3 participants