Kathu Cats
Website designed for Kathu Cats, a small animal rescue based in Kathu, South Africa. The purpose of the site is to give clear insight on what the organisation does, what impact it has on the animals and community, and to get support for the cause.
project snapshot
about this build
Kathu Cats & Kitten Rescues is a registered non-profit organisation operating out of Kathu in the Northern Cape. They rescue, rehabilitate, and rehome cats and kittens — as well as provide colony management, sterilisation drives, and emergency interventions. The site exists to give the organisation a credible public presence: explaining who they are, what they do, and making it as easy as possible for people to donate or get involved.
The site is fully static HTML/CSS/JavaScript — no frameworks, no build tools, no CMS. Payments are handled via a Vercel serverless function that creates a Yoco checkout session, keeping card details entirely off the site. An EFT option is also provided as a zero-fee alternative. The organisation is a registered PBO with Section 18A status, meaning donations are tax-deductible.
the problem
Small animal rescues often operate without any web presence — making it hard for potential donors, adopters, and volunteers to find them or understand the scale of what they do.
No credible public presence
Without a website, the organisation existed only on Facebook. There was no single place to explain the full scope of the work, present the impact clearly, or direct people to donate. Trust is harder to establish without it.
Donations were difficult to make
The only donation path was a bank transfer — which requires finding account details, opening internet banking, and manually creating a payment. Card donations were not possible at all, cutting off a large portion of potential supporters.
The scale of the work was invisible
Years of rescues, sterilisations, and active foster cases existed only in the heads of the volunteers. There was no structured way to present the impact — numbers, outcomes, ongoing campaigns — to the public.
what was built
Card Donations via Yoco
Integrated with the Yoco Checkout API via a Vercel serverless function. Donors select an amount, click once, and are redirected to a secure hosted checkout. Supports card, Apple Pay, and Google Pay — including international cards.
EFT Details
Full Capitec Business banking details displayed alongside the card option. No fees, no third party — for donors who prefer a direct bank transfer.
Impact Page
Structured presentation of the organisation's track record — years active, adoption rates, active foster cases, sterilisation numbers, and emergency rescues — built to make the scale of the work visible at a glance.
Active Campaigns
A dedicated campaigns section on the home page for highlighting current fundraising efforts. Supports multiple images and is updated by editing a single HTML block.
Campaign Notification Badge
A small dismissible notification shown on all non-home pages, linking back to the active campaign section. Persists dismiss state in localStorage so it only appears once per visitor.
Security
Rate limiting on the payment API endpoint, a strict Content Security Policy, and standard security headers configured at the CDN level via Vercel.
engineering decisions
Static HTML over a CMS or framework
The client has no technical background. A CMS adds login complexity, update fatigue, and ongoing hosting costs. Static HTML means the site has no moving parts to break, loads instantly, and can be edited by anyone who knows basic HTML. Vercel deploys straight from GitHub with zero configuration.
Vercel serverless function for payments
The Yoco secret key cannot be exposed in client-side JavaScript. A minimal serverless function handles the API call server-side — it receives an amount, validates it, creates a Yoco checkout session, and returns the redirect URL. No database, no session state, no complexity.
No JavaScript frameworks
The site uses vanilla JS only — a mobile nav toggle, a scroll observer for fade-in animations, and the Yoco payment handler. Total JS payload is minimal and there is nothing to update, version, or break.