Yuzhnye Portaly — a catalog website for an installation company
An 82-page static website for a company in Krasnodar that sells and installs gates, roller shutters, automation, seals, and dock levelers. Hand-built, no site builder, with its own backend for handling inquiries.
A demo copy of the site, blocked from search indexing.
Task
A company that sells and installs gates, roller shutters, automation, seals, and dock levelers needed a catalog website with a clear structure and a working inquiry form.
One condition was non-negotiable: no site builder, no CMS — built by hand, with full control over every detail of the markup, styling, and form behavior.
Solution
A static multi-page site built in plain HTML/CSS/JS, with no third-party framework or bundler, plus a custom Node.js backend for handling inquiries. The catalog is organized into three levels — category → subcategory → product — so customers can find the right model quickly instead of scrolling through a flat list of a hundred items.
The header and footer are byte-identical across all 82 pages except for the active menu item — the rules are written down in dedicated template documents, not kept in someone's head.
What was built
Discuss a similar project →Catalog, markup, and SEO
82 HTML pages built to a single template, with complete search markup on every one.
Accessibility
Built to a noticeably higher standard than is typical for a site of this size.
Lead intake and anti-spam
A dedicated Express/TypeScript backend built specifically for the inquiry form.
Result
The site is technically complete: inquiries flow through form → anti-spam check → queue → Telegram/email without loss even if the server fails partway through. Before delivery, we ran our own pre-launch audit across 6 areas — blockers, SEO, accessibility and markup, CSS and responsiveness, JS and backend, and speed and media.
To be candid: sitemap.xml, JSON-LD/schema.org, rel="canonical", and twitter:card aren't implemented yet — that's openly tracked in our own launch checklist as a scoped task, not an oversight.
Another case