Skip to content

Commit 023eacb

Browse files
feat: Buy me a coffin link on /pricing and in site footer
Adds an optional support link without breaking the "free MIT only" positioning. Two placements: 1. /pricing "How We Stay Alive" card gets the link directly under the copy with "If you really want to chip in:" framing. 2. Site footer (rendered on every page including homepage) gets a compact "Buy me a coffin" link next to the other footer items. Both placements track buy_me_a_coffin_clicked with a `from` param (pricing | footer) so we can see which placement drives clicks. Link goes to buymeacoffee.com/dotdevs. CSP allows external anchor clicks; no frame embed or fetch involved. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent be13251 commit 023eacb

2 files changed

Lines changed: 28 additions & 2 deletions

File tree

src/app/pricing/PricingContent.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ const SECTIONS = [
6868
{
6969
id: 'how-we-survive',
7070
heading: 'How We Stay Alive',
71-
body: 'Commitment Issues is built and maintained by Dot Systems — an indie studio that funds this work from other projects. If you want to support it, fork it, share it, or open a pull request with new famous casualties.',
71+
body: 'Commitment Issues is built and maintained by Dot Systems — an indie studio that funds this work from other projects. Fork it, share it, or open a pull request with new famous casualties. If you really want to chip in:',
72+
coffin: true,
7273
},
7374
]
7475

@@ -108,7 +109,7 @@ export default function PricingContent() {
108109
microcopy={null}
109110
>
110111
<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>
111-
{SECTIONS.map(({ id, heading, body, github }) => (
112+
{SECTIONS.map(({ id, heading, body, github, coffin }) => (
112113
<div
113114
key={id}
114115
className="record-card"
@@ -129,6 +130,18 @@ export default function PricingContent() {
129130
★ View on GitHub
130131
</a>
131132
)}
133+
{coffin && (
134+
<a
135+
href="https://buymeacoffee.com/dotdevs"
136+
target="_blank"
137+
rel="noopener noreferrer"
138+
onClick={() => track('buy_me_a_coffin_clicked', { from: 'pricing' })}
139+
className="subpage-faq-cta"
140+
style={{ marginTop: '14px', display: 'inline-flex' }}
141+
>
142+
⚰ Buy me a coffin →
143+
</a>
144+
)}
132145
</div>
133146
))}
134147

src/components/SiteFooter.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use client'
22

33
import Link from 'next/link'
4+
import { track } from '@vercel/analytics'
45
import GitHubIcon from '@/components/GitHubIcon'
56

67
const FONT = `var(--font-courier), system-ui, sans-serif`
@@ -49,6 +50,18 @@ export default function SiteFooter({ compact = false }: SiteFooterProps) {
4950
<GitHubIcon size={13} />
5051
Open source
5152
</a>
53+
<span style={{ color: 'var(--c-border-light)', fontSize: '12px' }}>·</span>
54+
<a
55+
href="https://buymeacoffee.com/dotdevs"
56+
target="_blank"
57+
rel="noopener noreferrer"
58+
onClick={() => track('buy_me_a_coffin_clicked', { from: 'footer' })}
59+
style={linkStyle}
60+
onMouseEnter={e => (e.currentTarget.style.color = 'var(--c-ink)')}
61+
onMouseLeave={e => (e.currentTarget.style.color = 'var(--c-muted)')}
62+
>
63+
⚰ Buy me a coffin
64+
</a>
5265
</div>
5366
</footer>
5467
)

0 commit comments

Comments
 (0)