Case · 17 / 17 HID Chess Club

HID Chess Club — a chess-club website with a hand-built CMS

Full cycle: architecture, backend, frontend, a custom admin and a VPS deploy. The club owner, with no technical background, manages the schedule, coaches, tournaments, blog and prices through a hand-built CMS with autosave — no Django-admin, no third-party platforms.

HID Chess Club website — homepage
01

About Product

HID is a chess club from Kharkiv that shapes leaders in the classroom and the community: weekly classes, education through chess, school and club tournaments. The club runs across several venues in Kharkiv and Poltava and brings together more than 250 members.

We designed and built the club’s website from scratch: a public site with the schedule, locations, tournaments and blog, a member’s personal account and, above all, a custom CMS the club team uses to run all the content on its own.

02

Brief

The club needed a website its owner could run alone, without a developer for every edit. Off-the-shelf CMSs did not fit: a bloated admin, entities they never needed, a platform fee. The content is specific — schedules by day and location, tournaments with statuses, learning levels, coaches.

We took our own Artbrain CMS engine (originally built for e-commerce) and reworked it entirely for the chess-club domain: its own entities, its own admin UI, autosave instead of Save buttons.

03

Desktop preview

Education, tournaments, about, locations and blog pages on a 1440-wide viewport. Click any tile to zoom.

Chess education
Club tournaments
About & impact
Locations & visit
Club blog
04

Mobile preview

Homepage, education, tournaments and membership pages in a narrow mobile viewport.

Homepage
Education
Tournaments
Membership
05

Tech stack

CMS

Власна CMS (автозбереження, 132 маршрути)

Backend

Python (Django 6.0 + DRF), SQLite / PostgreSQL

Frontend

Django templates, Tailwind, vanilla JS

Infrastructure

nginx + gunicorn + systemd, i18n uk/en

06

What was built

A hand-built CMS with autosave

Any form with data-autosave posts FormData and patches the DOM via [data-bind] — no Save buttons. Editing happens in slide-out side panels, with a dark/light theme on CSS variables. The club owner manages the schedule, coaches, tournaments, blog, prices and locations without a developer.

40 models, 132 admin routes

13,400 lines of Python, 65 HTML templates, ~7,000 lines of hand-written admin CSS/JS, 29 migrations. A hierarchy of education pages (home → section → level → summer camp), tournaments with divisions and results, and locations with their own opening hours.

Industrial-grade SEO

A single source of JSON-LD (Organization, Website, Course, SportsEvent, FAQPage, LocalBusiness, BlogPosting) fed straight from the CMS. A dynamic sitemap.xml covered by a drift test against the views, plus robots.txt, an /llms.txt for AI crawlers, canonical, OG and hreflang.

Content-security hardening

HTML entered by the client is sanitised through bleach + BeautifulSoup + lxml (stored-XSS protection). Rate-limiting on login and registration, a canonical-host middleware with a 301 from the old domain, CORS, and anti-XSS escaping inside <script> tags.

SSOT patterns, controlled blast radius

The day’s schedule (schedule_today.py), SEO data and tournament statuses are single sources of truth reused both in the header and across pages. The sync between views and the sitemap is covered by a test that fails on drift.

Automation and performance

A systemd timer updates tournament statuses by date every day at 00:05: registration open, closed or finished. Images are auto-resized and converted to WebP via Pillow, with lazy-loading, preconnect and decoding for fast loads.

07

Outcome

The club got a website it fully runs itself: content, schedule, tournaments, blog and prices update through the custom admin in seconds, with no developer involved.

Under the hood it’s an industrial architecture: 40 models, a REST API, SSOT patterns, invariants covered by tests, industrial-grade SEO and systemd automation. The site is deployed on a VPS (nginx + gunicorn + systemd) with two interface languages.

08

Frequently Asked Questions

The site runs on Python (Django 6.0) with Django REST Framework. The production database is SQLite with a schema compatible with PostgreSQL. The public frontend uses Django templates and vanilla JS, while the admin uses Tailwind plus hand-written CSS. The server stack is nginx + gunicorn + systemd.

It is an admin area written from scratch for a chess club: autosave without Save buttons, slide-out editing panels, dark and light themes, and only the entities the club actually needs. The standard Django admin is intentionally blocked, so the owner works only in the custom CMS.

Yes, that is the point of the project. Class schedules, coaches, tournaments, blog posts, prices, locations and legal pages are edited through the CMS without a developer, and changes are saved automatically.

JSON-LD is generated from a single source using data directly from the CMS (Organization, Course, SportsEvent, FAQPage, LocalBusiness, BlogPosting). The sitemap.xml is dynamic and covered by a drift test, with robots.txt, /llms.txt for AI crawlers, canonical, hreflang and OG tags.

Yes. We build websites with custom admin panels for specific industries when ready-made CMSs do not fit the task. Leave a request and we will get back within a few working hours.

Start your journey to success

Have a project? Let's bring it to life together.

Need a website with a custom admin tailored to your field, so you can manage content without a developer? Tell us about your task and we’ll reply within a few working hours.

All cases
— Also

Other services

Cost calculator →
— Journal · insights

From our blog

All articles →
Call+38 095 108 62 12 +38 097 599 66 89 Telegram Viber WhatsApp