Dutch Dwarf Goat Federation
A full rebuild of a breed federation's website on custom WordPress code, with herd-book data, shows and judging, pedigrees and a member area.

I am rebuilding the website of the Dutch federation of dwarf goat breeders' associations. The old site ran on a page builder with a paid plugin for every feature. The new one is a custom theme plus one custom plugin, with no paid plugins at all. It is running on a test environment and is close to launch.
It serves three groups: visitors looking for information, members who breed and show goats, and the volunteers who run shows and the federation. Most visitors are on a phone and most members are over 60, so the site uses large tap targets, real links and little JavaScript.

What was interesting to solve
- The herd book lives elsewhere. The official registry is kept in separate herd-book software, and the site imports its CSV exports. An early import that read columns by position silently emptied thousands of fields when an export came with fewer columns. The import tool I built afterwards maps columns by name, shows a preview first, and never blanks data for a column that is missing.
- Shows from entry to catalogue. Members enter animals online. Show staff build the catalogue, record placings and champions, and print a ready-to-fold A5 booklet generated as a PDF on the server. Printed booklets from other clubs, with placings written by hand, can be uploaded and read by the Claude API into a check table that staff confirm before anything is saved.
- Pedigrees and inbreeding. Members can plan a trial mating and get an estimate of the offspring's inbreeding coefficient, calculated with Wright's path-counting method over the local pedigree data.
- Page changes without reloads. A small script swaps only the page content and keeps the address bar in step. The site is also installable as a PWA.


Stack
WordPress, PHP 8.3, MySQL, vanilla JavaScript, FPDF, pdf.js, a read-only JSON REST API, service worker, Claude API. Deployed from Git through the host's panel, with every file linted before it goes out.