Skip to content

Commit 671702a

Browse files
committed
Add non-profit information
1 parent d312f80 commit 671702a

File tree

5 files changed

+355
-0
lines changed

5 files changed

+355
-0
lines changed

docs/nav.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,11 @@
565565
"title": "Synchronized Output"
566566
}
567567
]
568+
},
569+
{
570+
"type": "link",
571+
"path": "/sponsor",
572+
"title": "Financial Support"
568573
}
569574
]
570575
}

docs/sponsor.mdx

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
---
2+
title: Support Ghostty Development
3+
description: |
4+
Ghostty is fiscally sponsored by Hack Club (501(c)(3)).
5+
All donations are tax-deductible in the United States.
6+
---
7+
8+
Ghostty is developed as non-profit work, supported by donations. The
9+
Ghostty project (including the name, brand, intellectual property, code,
10+
etc.) is owned by a 501(c)(3) non-profit organization, Hack Club, who
11+
operates as the fiscal sponsor for the project.
12+
13+
We believe terminal and terminal-related technologies are critical
14+
infrastructure for modern computing and software development. Whether
15+
it's directly used by developers or indirectly used through products
16+
such as editors, CI logs, PaaS consoles, agentic tools, and more, terminals
17+
continue to be a foundational technology underpinning much of our
18+
modern computing ecosystem.
19+
20+
Aligned with this belief, we develop Ghostty as a non-profit project.
21+
Being a non-profit provides important legal protections to the people and
22+
communities that adopt and contribute to Ghostty. Importantly, it means we are
23+
not beholden to commercial interests or investor pressure. Ghostty cannot be
24+
sold, pivoted, or shuttered on a whim — its purpose and stewardship are bound
25+
to the public benefit it was created to serve.
26+
27+
## Donate
28+
29+
<DonateCard
30+
title="Support Ghostty"
31+
description="Your contribution helps sustain development and keeps Ghostty free and open source for everyone. Donations are tax-deductible in the United States."
32+
buttonText="Donate Now"
33+
/>
34+
35+
7% of all donations go directly to Hack Club. This covers the administrative
36+
costs of fiscal sponsorship, but also supports [Hack Club's broader mission](https://hackclub.com/philosophy/)
37+
to empower the next generation of technically-minded individuals around
38+
the world.
39+
40+
### Donation Methods
41+
42+
- **Credit card.** Use the [donation link above](https://donate.ghostty.org/).
43+
- **Donor-Advised Fund (DAF), Foundation, etc.** The EIN for Hack Club is
44+
81-2908499. Please indicate in the notes that the donation is for
45+
"Ghostty".
46+
- **Stock, cryptocurrency, or other non-cash assets.** Please reach out to
47+
[Paul Spitler at Hack Club](mailto:[email protected]) who can coordinate
48+
this.
49+
- **Any other concerns, questions, or special requests.** Please reach out to
50+
[Paul Spitler at Hack Club](mailto:[email protected]) who can respond
51+
via email, setup a phone call, or other method as needed.
52+
53+
## Usage of Funds
54+
55+
All funds donated to Ghostty go to one of three places:
56+
57+
- **Contributors.** Some individuals who are writing code or maintaining
58+
critical systems (such as community moderation) for Ghostty are compensated
59+
for their time and effort. More details are in the contributor
60+
compensation section below.
61+
- **Services.** Ghostty incurs various costs to operate, such as hosting
62+
this website, our Discord bot, continuous integration systems, code signing
63+
fees, etc.
64+
- **Upstream Projects.** Ghostty depends on many other open-source projects.
65+
The funds may be used to pay it forward to these projects, too.
66+
67+
All of Ghostty's finances down to individual transactions are
68+
[transparent](https://hcb.hackclub.com/ghostty), so you can see exactly how
69+
funds are being used and where donations are coming from.
70+
71+
**Explicitly, no funds are used for the personal benefit of the
72+
project creator, Mitchell Hashimoto.** Not a single cent of Ghostty
73+
contributions goes to Mitchell or any projects directly affiliated with him.
74+
In addition to creating the project, Mitchell is Ghostty's largest donor,
75+
and for both legal and altruistic reasons, he will not accept any compensation
76+
from the project.
77+
78+
<Important>
79+
The non-profit structure of Ghostty was only recently established in December,
80+
2025. As such, we are still refining our processes and reporting, such as what
81+
upstream projects we intend to support and how.
82+
</Important>
83+
84+
### Contributor Compensation
85+
86+
TODO!
87+
88+
## Mission Statement
89+
90+
The mission of Ghostty is to develop and maintain open-source terminal technologies that empower
91+
individuals and communities to learn, build, and participate in modern
92+
systems programming with a broad industry impact.
93+
94+
## Relationship to Hack Club
95+
96+
Ghostty is fiscally sponsored by Hack Club, a registered 501(c)(3) non-profit.
97+
98+
[Fiscal sponsorship](https://en.wikipedia.org/wiki/Fiscal_sponsorship) is a
99+
legal and financial arrangement in which a recognized non-profit extends its
100+
tax-exempt status to a project that aligns with its mission. This allows
101+
Ghostty to operate as a charitable initiative while Hack Club manages
102+
compliance, donations, accounting, and governance oversight.
103+
104+
We decided to pursue fiscal sponsorship rather than forming a new nonprofit
105+
for several reasons:
106+
107+
- **Cost.** There is significant financial cost and overhead associated
108+
with forming and maintaining a nonprofit organization. We calculated
109+
that the 7% fee paid to Hack Club would be substantially lower than the
110+
overall costs of managing a standalone nonprofit.
111+
112+
- **Speed.** Forming a new nonprofit can take months or even years, especially when
113+
applying for federal 501(c)(3) determination. Fiscal sponsorship allowed
114+
Ghostty to begin accepting tax-deductible donations and operate under a
115+
charitable structure on a much faster timeline.
116+
117+
- **Accountability.** Working under an existing nonprofit adds an additional layer
118+
of structure and stewardship. Hack Club provides financial oversight, legal
119+
guardrails, donation reporting, and compliance support—including IRS, audit,
120+
and grant-tracking requirements. This ensures Ghostty operates transparently,
121+
ethically, and in alignment with nonprofit best practices from day one.
122+
123+
- **A good cause.** There are other, for-profit non-profit management
124+
companies available that charge a similar fee structure to manage
125+
all the overhead of a nonprofit. With Hack Club, we pay a similar fee (7%),
126+
but that fee goes towards another non-profit with a mission we support.
127+
As Zach Latta, Hack Club's founder, put it: "it is a good-for-good trade."

src/components/custom-mdx/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Blockquote from "../blockquote";
44
import ButtonLinks from "../button-links";
55
import Callout, { Caution, Important, Note, Tip, Warning } from "../callout";
66
import CardLinks from "../card-links";
7+
import DonateCard from "../donate-card";
78
import CodeBlock from "../codeblock";
89
import GitHub from "../github";
910
import { processGitHubLinks } from "../github/mdx";
@@ -93,6 +94,7 @@ export default function CustomMDX({ content }: CustomMDXProps) {
9394
VTSequence,
9495
CardLinks,
9596
ButtonLinks,
97+
DonateCard,
9698
GitHub,
9799
Video,
98100
/* Callout Variants */
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
.donateCard {
2+
display: flex;
3+
align-items: flex-start;
4+
gap: 24px;
5+
padding: 32px;
6+
margin: 32px 0;
7+
border-radius: 16px;
8+
background: linear-gradient(
9+
135deg,
10+
hsl(var(--brand-color-hsl) / 0.08) 0%,
11+
hsl(var(--brand-color-hsl) / 0.02) 100%
12+
);
13+
border: 1px solid hsl(var(--brand-color-hsl) / 0.2);
14+
position: relative;
15+
overflow: hidden;
16+
17+
&::before {
18+
content: "";
19+
position: absolute;
20+
top: 0;
21+
left: 0;
22+
right: 0;
23+
height: 3px;
24+
background: linear-gradient(
25+
90deg,
26+
var(--brand-color) 0%,
27+
hsl(var(--brand-color-hsl) / 0.5) 100%
28+
);
29+
}
30+
}
31+
32+
.iconContainer {
33+
display: flex;
34+
align-items: center;
35+
justify-content: center;
36+
width: 56px;
37+
height: 56px;
38+
border-radius: 12px;
39+
background: linear-gradient(
40+
135deg,
41+
hsl(var(--brand-color-hsl) / 0.15) 0%,
42+
hsl(var(--brand-color-hsl) / 0.05) 100%
43+
);
44+
flex-shrink: 0;
45+
}
46+
47+
.icon {
48+
width: 28px;
49+
height: 28px;
50+
color: var(--brand-color);
51+
}
52+
53+
.content {
54+
flex: 1;
55+
min-width: 0;
56+
}
57+
58+
.title {
59+
margin: 0 0 8px 0;
60+
color: var(--gray-1);
61+
}
62+
63+
.description {
64+
margin: 0 0 20px 0;
65+
color: var(--gray-4);
66+
line-height: 1.6;
67+
}
68+
69+
.button {
70+
display: inline-flex;
71+
align-items: center;
72+
gap: 8px;
73+
padding: 12px 24px;
74+
border-radius: 8px;
75+
background-color: var(--brand-color);
76+
color: var(--gray-9);
77+
font-weight: 600;
78+
font-size: 15px;
79+
text-decoration: none;
80+
transition: background-color 0.15s ease, transform 0.15s ease;
81+
82+
&:hover {
83+
@media (hover: hover) {
84+
background-color: hsl(var(--brand-color-hsl) / 0.85);
85+
transform: translateY(-1px);
86+
}
87+
}
88+
89+
&:active {
90+
transform: translateY(0);
91+
}
92+
}
93+
94+
.buttonIcon {
95+
width: 18px;
96+
height: 18px;
97+
}
98+
99+
.actions {
100+
display: flex;
101+
align-items: center;
102+
gap: 16px;
103+
flex-wrap: wrap;
104+
}
105+
106+
.einButton {
107+
display: inline-flex;
108+
align-items: center;
109+
gap: 6px;
110+
padding: 10px 16px;
111+
border-radius: 8px;
112+
background-color: transparent;
113+
border: 1px solid var(--gray-3);
114+
color: var(--gray-6);
115+
font-size: 14px;
116+
cursor: pointer;
117+
transition: border-color 0.15s ease, background-color 0.15s ease;
118+
119+
&:hover {
120+
@media (hover: hover) {
121+
border-color: var(--gray-4);
122+
background-color: hsl(var(--brand-color-hsl) / 0.05);
123+
}
124+
}
125+
}
126+
127+
.einLabel {
128+
color: var(--gray-5);
129+
font-weight: 500;
130+
}
131+
132+
.einValue {
133+
font-family: monospace;
134+
font-weight: 600;
135+
color: var(--gray-8);
136+
}
137+
138+
.copyIcon {
139+
width: 14px;
140+
height: 14px;
141+
color: var(--gray-6);
142+
}
143+
144+
@media (max-width: 600px) {
145+
.donateCard {
146+
flex-direction: column;
147+
align-items: center;
148+
text-align: center;
149+
padding: 24px;
150+
gap: 16px;
151+
}
152+
153+
.actions {
154+
flex-direction: column;
155+
width: 100%;
156+
}
157+
158+
.button,
159+
.einButton {
160+
width: 100%;
161+
justify-content: center;
162+
}
163+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
"use client";
2+
3+
import { Check, Copy, Heart } from "lucide-react";
4+
import Link from "next/link";
5+
import { useState } from "react";
6+
import { H3, P } from "../text";
7+
import s from "./DonateCard.module.css";
8+
9+
interface DonateCardProps {
10+
href?: string;
11+
title?: string;
12+
description?: string;
13+
buttonText?: string;
14+
ein?: string;
15+
}
16+
17+
export default function DonateCard({
18+
href = "https://donate.ghostty.org",
19+
title = "Support Ghostty",
20+
description = "Your donation helps sustain development and keeps Ghostty free and open source.",
21+
buttonText = "Donate Now",
22+
ein = "81-2908499",
23+
}: DonateCardProps) {
24+
const [copied, setCopied] = useState(false);
25+
26+
const copyEin = async () => {
27+
await navigator.clipboard.writeText(ein);
28+
setCopied(true);
29+
setTimeout(() => setCopied(false), 2000);
30+
};
31+
32+
return (
33+
<div className={s.donateCard}>
34+
<div className={s.iconContainer}>
35+
<Heart className={s.icon} />
36+
</div>
37+
<div className={s.content}>
38+
<H3 className={s.title}>{title}</H3>
39+
<P className={s.description}>{description}</P>
40+
<div className={s.actions}>
41+
<Link href={href} className={s.button}>
42+
<Heart className={s.buttonIcon} />
43+
{buttonText}
44+
</Link>
45+
<button onClick={copyEin} className={s.einButton} title="Copy EIN">
46+
<span className={s.einLabel}>EIN:</span>
47+
<span className={s.einValue}>{ein}</span>
48+
{copied ? (
49+
<Check className={s.copyIcon} />
50+
) : (
51+
<Copy className={s.copyIcon} />
52+
)}
53+
</button>
54+
</div>
55+
</div>
56+
</div>
57+
);
58+
}

0 commit comments

Comments
 (0)