The domain model has three levels: centre, event and session — a specific date with room options and extras. Consultation booking reads free slots from a calendar on the server side, so the visitor never sees an external link, only the slots on the page.

Payments run through Stripe together with a webhook. The contact form has a captcha and message templates, and the whole site is prepared bilingually in the code.

The SEO migration off the old site came to roughly forty redirect rules: trailing slashes removed, changed centre slugs and old numeric URLs. All of them written down in three documents in the repository.

The project also carries a cache rule born from our own disk outage: nothing that varies per request may enter the URL of an API call, because the framework keys its cache by URL and never cleans it off the disk. Dates go through a shared normalising function, and visitor input through an allow-list.