Internal reference
Design system
Reference for DonorNode's typography, colour palette, logo, buttons, and component patterns. Crib from this when you build new pages, blog posts, or extend the app surface.
Palette
Warm-ledger palette. Defined as CSS custom properties on :root in themes/donornode/assets/css/main.css. Use the var name in CSS so a future palette refresh is one place.
Type scale
Fraunces (display serif, 400–700) for headings, Karla (sans, 400/500/700) for body. Both are responsive via clamp() at h1 and h2.
A receipt for every gift.
Built for small nonprofits.
Recurring giving, done right.
Why donors stay
Fundraising infrastructure for small nonprofits — donation pages, recurring giving, automatic receipts. Your Stripe, your money.
DonorNode is the fundraising stack we wished we had when we ran a small charity ourselves. Donation pages that read like ledgers, monthly giving that survives Stripe quirks, and receipts that look like receipts — not marketing.
Logo
Mark is a coin dropping into a leaf-cup. Wordmark sets DonorNode in Fraunces 600 at 21px. Source SVGs live in static/brand/.
brand/logo.svg
brand/mark.svg36×36 viewBox, centered for circular crops.
_partials/logo.html
static/favicon.svg
translate(3 2.25) intact.
Buttons
Pill-shaped buttons (border-radius: 999px) with the offset shadow on hover. Four styles + .btn-lg modifier.
Component patterns
.feature-card
Automatic receipts
Every donor gets a clean, branded receipt the moment they give — no manual exports, no spreadsheet wrangling.
.stats / .stats-row
.section-title (ledger-dots motif)
What ships today
.cta-band
.prose blockquote & code
We swapped four tools for one — donate page, recurring engine, and receipts — and our donors barely noticed except that giving got easier.
Pass --task stripe_rate_auto_detect to the jobs runner to trigger the nightly sweep manually.
Links
This is a paragraph with an inline link in body context. Nav links live in the header partial.
Icons
Inline stroke-based SVG set, keyed by name. Render via {{ partial "icon.html" "heart" }}.
Spacing & container
One container width: --wrap: 70rem (1120px) centred with padding-inline: 1.5rem. No global numeric spacing scale — each section sets its own padding from the rhythm below.
@media (max-width: 860px) rule in main.css collapses the hero grid + footer grid + flips the nav into a burger. Use that breakpoint consistently in new sections.