Skip to content

feat(#53): GitHub Sponsors + Stripe Payment Link support CTAs#122

Merged
4444J99 merged 2 commits into
mainfrom
feat/support-sponsors-cta
May 27, 2026
Merged

feat(#53): GitHub Sponsors + Stripe Payment Link support CTAs#122
4444J99 merged 2 commits into
mainfrom
feat/support-sponsors-cta

Conversation

@4444J99
Copy link
Copy Markdown
Owner

@4444J99 4444J99 commented May 26, 2026

More code for #53 (revenue + MRR items), per your call.

Adds a SupportBlock component (footer) wiring the two "Immediate" revenue items from #53:

  • GitHub Sponsors link (recurring / MRR) via PUBLIC_SPONSORS_URL
  • Stripe Payment Link (one-time / revenue_status) via PUBLIC_SUPPORT_PAYMENT_URL

Inert by default — renders nothing until the env URLs are set, so no broken links ship. Set the two PUBLIC_ vars in the deploy environment to activate.

What still needs you (the real-world part of #53): create the Sponsors tiers + the Stripe Payment Link, then the outreach (Reddit/Dev.to/HN posts, recruiting testers, CFPs).

Test plan

  • npm run lint / typecheck:strict — clean / 0 hints
  • npm run build — block renders nothing while envs unset (0 pages); footer unaffected

https://claude.ai/code/session_01PW9DnyVijUNmUJ4qMfgpHn


Generated by Claude Code

Summary by Sourcery

Add a configurable support call-to-action block to the site footer that surfaces external funding links when provided via environment variables.

New Features:

  • Introduce a SupportBlock footer component that displays GitHub Sponsors and one-time payment links based on environment configuration.

Enhancements:

  • Integrate the SupportBlock component into the existing footer layout without affecting the footer when no support URLs are configured.

Adds a SupportBlock component (in the footer) wiring the two revenue
items from #53:
- GitHub Sponsors link (recurring / MRR) via PUBLIC_SPONSORS_URL
- Stripe Payment Link (one-time / revenue_status) via PUBLIC_SUPPORT_PAYMENT_URL

Inert by default — renders nothing until the operator sets the env URLs,
so no broken links ship. Set the two PUBLIC_ vars to activate.

Remaining for #53 (yours): create the Sponsors tiers + Stripe Payment
Link, post the outreach (Reddit/Dev.to/HN), recruit testers — the
real-world actions an agent can't perform.

Verified: lint, typecheck:strict (0 hints), build; block renders nothing
while the envs are unset (0 pages).

https://claude.ai/code/session_01PW9DnyVijUNmUJ4qMfgpHn
@sourcery-ai
Copy link
Copy Markdown

sourcery-ai Bot commented May 26, 2026

Reviewer's Guide

Adds a new SupportBlock footer component that conditionally renders sponsor/payment CTAs based on public env vars, and wires it into the global footer.

Flow diagram for conditional SupportBlock rendering in footer

flowchart LR
  Env[import.meta.env]
  Env -->|PUBLIC_SPONSORS_URL| Sponsors[sponsorsUrl]
  Env -->|PUBLIC_SUPPORT_PAYMENT_URL| Payment[supportPaymentUrl]
  Sponsors --> HasAny[hasAny]
  Payment --> HasAny
  HasAny -->|true| SupportBlock[SupportBlock]
  HasAny -->|false| NoRender[SupportBlock renders nothing]
  Footer[Footer.astro] --> SupportBlock
Loading

File-Level Changes

Change Details Files
Introduce a reusable SupportBlock component that surfaces GitHub Sponsors and Stripe one-time payment CTAs when configured via env vars.
  • Read PUBLIC_SPONSORS_URL and PUBLIC_SUPPORT_PAYMENT_URL from import.meta.env and trim them before use
  • Compute a hasAny flag so the block renders nothing when neither URL is configured, keeping the feature inert by default
  • Render labeled CTA buttons for recurring sponsorship and one-time gifts, opening in a new tab with appropriate rel attributes
  • Define scoped CSS for the support block layout, typography, and hover states using existing design tokens
src/components/SupportBlock.astro
Integrate the SupportBlock into the global footer so support CTAs appear in the site chrome when activated.
  • Import the SupportBlock component into the footer Astro file
  • Render within the footer layout near the existing navigation links
src/components/Footer.astro

Possibly linked issues

  • #omega: PR implements the site CTAs (Stripe link + GitHub Sponsors) needed to satisfy the issue’s revenue and MRR items.

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces a new SupportBlock component to display support CTAs in the footer when relevant environment variables are set. The review feedback recommends adding an empty Props interface to comply with the repository's TypeScript style guide, removing a hardcoded margin to prevent vertical misalignment within the footer, and setting opacity: 1 on hover to prevent global link styles from reducing the contrast of the button-styled links.

Comment on lines +1 to +9
---
// Support CTAs for issue #53 (revenue_status + MRR).
// Inert until the operator supplies the URLs via env:
// PUBLIC_SPONSORS_URL — GitHub Sponsors page (recurring / MRR)
// PUBLIC_SUPPORT_PAYMENT_URL — Stripe Payment Link (one-time / revenue_status)
const sponsorsUrl = import.meta.env.PUBLIC_SPONSORS_URL?.trim();
const supportPaymentUrl = import.meta.env.PUBLIC_SUPPORT_PAYMENT_URL?.trim();
const hasAny = Boolean(sponsorsUrl || supportPaymentUrl);
---
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

According to the repository style guide, all components must define a Props interface, even if they do not currently accept any props. This ensures consistent TypeScript type safety across the codebase.

---
// Support CTAs for issue #53 (revenue_status + MRR).
// Inert until the operator supplies the URLs via env:
//   PUBLIC_SPONSORS_URL         — GitHub Sponsors page (recurring / MRR)
//   PUBLIC_SUPPORT_PAYMENT_URL  — Stripe Payment Link (one-time / revenue_status)

export interface Props {}

const sponsorsUrl = import.meta.env.PUBLIC_SPONSORS_URL?.trim();
const supportPaymentUrl = import.meta.env.PUBLIC_SUPPORT_PAYMENT_URL?.trim();
const hasAny = Boolean(sponsorsUrl || supportPaymentUrl);
---
References
  1. Use Props interfaces for all components. (link)

Comment on lines +40 to +46
.support-block {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: var(--space-sm);
margin-top: var(--space-md);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The .support-block component is rendered as a direct child of .footer__inner, which uses align-items: center on desktop and gap: var(--space-md) on mobile. Having a hardcoded margin-top: var(--space-md) on .support-block causes vertical misalignment on desktop and uneven vertical spacing on mobile. Removing this margin ensures clean, consistent alignment across all screen sizes.

  .support-block {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--space-sm);
  }

Comment on lines +66 to +73
.support-block__btn:hover {
border-color: var(--accent);
color: var(--accent-text);
}
.support-block__btn--sponsor:hover {
border-color: var(--accent-hover);
color: var(--accent-hover);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The global a:hover style in global.css sets opacity: 0.7. For button-styled links like .support-block__btn, this hover opacity can make the text and borders look faded and reduce contrast. Adding opacity: 1 to the hover states ensures the custom hover colors (var(--accent-text) and var(--accent-hover)) remain vibrant and accessible.

  .support-block__btn:hover {
    border-color: var(--accent);
    color: var(--accent-text);
    opacity: 1;
  }
  .support-block__btn--sponsor:hover {
    border-color: var(--accent-hover);
    color: var(--accent-hover);
    opacity: 1;
  }

Copy link
Copy Markdown

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

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

Hey - I've reviewed your changes and they look great!


Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

…city:1 on hover

- Add `export type Props = {}` (house style: all components define Props)
- Remove hardcoded `margin-top` from .support-block (footer uses gap/flexbox)
- Add `opacity: 1` to both btn:hover states to override global a:hover opacity

https://claude.ai/code/session_01PW9DnyVijUNmUJ4qMfgpHn
@4444J99 4444J99 merged commit d7cc766 into main May 27, 2026
3 checks passed
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