HC Čestice
hockey club website
Client
HC Čestice
Role
Fullstack — data migration, CMS data model, frontend, tests, CI/CD and deployment.
Year
2026
Stack
Next.js 16, React 19, Payload CMS 3, PostgreSQL, TypeScript, Tailwind CSS, Playwright, Vitest, Docker
Project
Website for the HC Čestice ice-hockey club — news, fixtures and results including the amateur hockey league, player roster, photo galleries, club history, sponsors and merchandise. The project was a full migration from a legacy website to a modern CMS, preserving the entire archive and the original URLs.
Fullstack — data migration, CMS data model, frontend, tests, CI/CD and deployment.




What I built
A full archive migration from the legacy site — an XML export parser and import pipeline for articles, sections, galleries and files, plus seed scripts for players, fixtures, AHL rosters, history milestones, sponsors and products.
URL preservation — a redirect generator mapping legacy paths onto the new pages, so the migration cost the club no inbound links or search rankings.
An adapter layer over an immature navigation plugin — it normalises the plugin's behaviour and throws on unexpected upstream changes. Without it a regression would surface only as an English admin UI, with no explanation.
A custom navigation model separating link label, anchor and path, with a resolver kept apart from the server-only CMS config — otherwise the CMS would leak into the client bundle and break the build.
Tag-based rather than time-based navigation caching, with revalidation hooks on both create and delete — without them the cache TTL is a full year; import scripts opt out.
An audit log extended with the document ID and the acting user — neither of which the plugin records — and locked read-only so an admin cannot delete their own trail.
Editorial features — layout builder, draft and live preview, on-demand revalidation, search, form builder, reCAPTCHA v3, content-type-split sitemaps and maintenance mode.
Quality — Playwright e2e tests, Vitest integration tests, a design-token guard and typecheck behind a single command, and an internal catalogue of UI patterns and widgets.
Let's talk about your project!

