CASE STUDY — 01

Pantera Family & Sport Club

Mokotów, Warsaw

Full redesign and infrastructure migration for a Warsaw martial arts and family sport club. From a generic WordPress theme on shared hosting to a custom Next.js + Payload CMS stack on a dedicated VPS.

dofbur.pl
ClientPantera Family & Sport Club
TypeMarketing site + CMS
StackNext.js · Payload CMS
Year2026

— Overview

The Brief

Pantera is a martial arts and family sport club in Warsaw's Mokotów district, offering Krav Maga, karate, power training, and Tai Chi across age groups. The club needed a website that could serve three very different audiences — parents enrolling children, adults seeking self-defense training, and seniors drawn to Tai Chi — while projecting the authority and warmth of a trusted local club.

My Role

End-to-end: sitemap, wireframes, custom design system, and a production build on a modern headless stack. Self-managed VPS replacing shared hosting.
Old pantera.waw.pl hero — generic WordPress theme with text overlay on stock-style image

Before / after — old WordPress hero next to the new looping cut.

The eight decisions this case study explains

Each item below is expanded later in its own section. This list exists at the top so the argument is visible even if you only skim — and so the rest of the page reads as evidence, not surprise.

  • 1Video hero over photographyHand-edited 10-second loop of real training — kids first, then Krav Maga, then Tai Chi. Authentic proof of the training environment, not a stock substitute.
  • 2Diagonal headline arrangementThe three fragments of the headline are indented progressively — each line shifted further right than the one above it. The text itself forms a diagonal that reads as motion and guides the eye toward the CTA. No graphic overlay needed.
  • 3Audience segmentation below the foldThree cards route parents, adults, and Tai Chi seekers immediately. The page asks one question and routes — it does not try to be one thing.
  • 4Varied section rhythmMarquee reviews, 50/50 USP, 3-col instructors. Rhythm variation signals hierarchy; uniform grids signal "nothing matters most".
  • 5No "most popular" pricing badgeStandard SaaS pattern, wrong tool here. Pantera has no online checkout — every CTA leads to a human conversation.
  • 6Instructor section keptIn martial arts, students choose the instructor before the club. Real names and faces close the trial booking; this also feeds Google E-E-A-T.
  • 7Torn-paper divider rejectedOrganic shapes conflict with the sharp, geometric brand. Background-color shift between sections does the separation job without competing for attention.
  • 8Headless stack migrationNext.js + Payload + Postgres + Coolify on a Hetzner VPS replaces WordPress on shared hosting. Performance is the visible win; control is the structural one.

— The Challenge

What needed solving

The primary design challenge was audience breadth. A single hero had to speak to a parent looking for safe children's classes, a 30-year-old wanting real self-defense, and someone older interested in low-impact movement. A secondary challenge was conversion logic: Pantera's sales process runs through a free trial class, not online purchase — every CTA had to funnel toward contact, not checkout.

Three audiences in one homepage
Free-trial conversion path, no checkout
WordPress baseline: Lighthouse 83, CLS 0.235

Chapter

Design

The hardest part of Pantera was not the layout — it was deciding who the homepage was for. Three audiences (parents, adults, seniors) share almost nothing in common: different fears, different vocabulary, different reasons for showing up. A single hero either picks one and ignores the rest, or addresses all three and reads as generic.

The page stops pretending it can be one thing. It asks one question — which class are you here for? — and routes. Everything below assumes that choice has been made.

Hero anatomy

The hero uses a 10-second loop of training sessions as the background — a deliberate choice over photography. The cut was edited by hand into three beats in a specific order: kids having fun, adult Krav Maga, then Tai Chi. Kids open the video because the majority of Pantera's classes are for kids — the footage mirrors the actual class mix, not a generic montage.

  • 1Google ratingStar rating anchors trust immediately — real reviews visible before any copy is read.
  • 2Three-fragment headlineEach fragment targets a different audience concern: methodology, parent trust, local proximity.
  • 3Color emphasis on "Bezpiecznie"The single word most likely to stop a parent from bouncing — color emphasis replaces a separate USP block.
  • 4One CTA"Pierwszy trening za darmo" removes financial friction. No secondary link, no menu of options.
  • 5Diagonal headline arrangementEach headline line is indented further than the one above it. The text itself forms a diagonal across the dark side of the hero, reading as motion and pointing the eye toward the CTA. No overlay graphic — the type is the diagonal.
  • 6Curated footage order — kids firstHand-edited 10s loop runs kids → adult Krav Maga → Tai Chi. Kids open the cut because they're the largest audience segment; visitors immediately see themselves (or their child) within the first 3 seconds.

Pantera hero — 10-second loop edited into three beats: kids, adult Krav Maga, Tai Chi.

The diagonal in the hero is not a graphic overlay — it is the headline itself. Each of the three lines is indented further right than the one above, so the type forms a falling slope across the dark zone. A flush-left block of text would feel static. Letting the text become the diagonal pulls the eye down toward the CTA without adding a single decorative element.

Audience segmentation

Immediately below the fold, three cards split the offer by audience group. This is the site's most critical UX decision: instead of making every visitor read through everything, the page asks one question and routes them to their own path.

Problem

Three audiences, one homepage

Parents, adult learners, and Tai Chi students have different fears, motivations, and vocabulary. A single narrative can't address all three without feeling vague.

Decision

Segment first, sell second

Three visually distinct cards with real training photos route each visitor immediately. Copy is audience-specific from this point forward.

Effect

Reduced cognitive load

Visitors don't have to figure out if Pantera is for them — they see themselves in the card and continue. Bounce probability drops at this section.

Three audience cards: Dla Dzieci, Dla Dorosłych, Tai Chi

Three audience cards — children, adults, seniors.

Rejected layouts

Two alternative directions were explored and discarded before arriving at the final design.

Rejected — v1
Torn paper divider between sectionsOrganic "ripped" SVG edge between hero and first content section. Intended to add visual dynamism. Discarded because it clashed with the geometric, sharp visual language of the brand — and at execution quality achievable without custom illustration, read as a generic template element.
Final
Clean section break, no dividerBackground color shift from dark hero to light content section provides sufficient visual separation. No additional element needed. A neutral transition doesn't compete with the content — which is the point.
Rejected — v2
Repeating 3-column grid throughoutOffer cards, instructor cards, review cards, and pricing all used identical 3-column grid. Created visual fatigue — every section had equal visual weight, removing hierarchy. Users stopped scanning because the layout gave no signal about what mattered most.
Final
Varied layout rhythm50/50 split for USP section, marquee scroll for reviews, standard 3-col for instructors. Rhythm variation signals hierarchy: marquee reviews feel infinite (more social proof), 50/50 sections feel deliberate. Each section has a distinct visual signature.

Social proof — reviews

Rather than a static grid of testimonials, reviews are presented as two horizontal marquee rows scrolling in opposite directions.

Motion direction

Counter-scroll rows

Row 1 scrolls left, row 2 scrolls right. The visual tension between them draws attention and creates a sense of depth — reviews feel like they're arriving from multiple sources simultaneously.

Psychological effect

Implied scale

A static grid of 6 reviews communicates "here are all our reviews." An infinite marquee communicates "there are too many to count." The latter is the accurate framing for a club with 100+ Google reviews.

UX note

Pause on hover

Animation pauses on hover, allowing users who want to read a full review to do so without chasing a moving card. Accessibility baseline for motion-sensitive users.

Counter-scrolling review marquee — pauses on hover.

In martial arts schools, students choose their instructor before they choose the club. Michał, Tomasz, and Janusz are the product. Presenting them as real people with credentials and faces removes the abstraction — a parent is no longer enrolling in "Pantera," they're trusting their child to Michał Jaworski, Krav Maga instructor.

Pricing section

The pricing section presents three tiers but deliberately avoids the "most popular" badge found in the rejected layout.

Rejected approach
"Most popular" badge on middle tierStandard SaaS pricing pattern. Works when clicking a plan leads to checkout. At Pantera, there is no checkout — the action is to call or send a message. The badge creates urgency toward a decision that can't actually be made on the page. Empty pattern.
Final
Three tiers, contact-first CTAsEach plan leads to "Skontaktuj się" or "Zapisz się" — every path goes through a human. The first tier ("Zapytaj o cenę") removes the price entirely for B2B/corporate clients, preventing premature price objections for high-LTV contracts.

Chapter

Performance

Lighthouse 95 / 92 / 100 / 100, up from 83 / 86 / 73 / 85. The headline number is useful; the meaningful one is Cumulative Layout Shift — 0.235 to 0.015. CLS is the only Core Web Vital users actually feel: the button that moves under your finger as you tap it, the image that shoves the headline down half a second after it appears.

The fixes were unglamorous — explicit image dimensions, preloaded fonts, the WordPress theme CSS gone. Not optimizations in the clever sense; the absence of choices the old theme was making by accident.

Lighthouse before & after

Old site
Redesign
Old site
Performance83
Accessibility86
Best Practices73
SEO85
Redesign
Performance95
Accessibility92
Best Practices100
SEO100
PageSpeed Insights panel — Performance 95, Accessibility 92, Best Practices 100, SEO 100

PageSpeed Insights — Performance 95, Accessibility 92, Best Practices 100, SEO 100. LCP 1.2s, CLS 0.015, TBT 20ms.

What actually changed

The most meaningful improvement is Cumulative Layout Shift — the metric users actually feel. The old site scored 0.235, sitting near Google's "poor" threshold of 0.25, which meant visible content jumps as the page loaded. The redesign brings it to 0.015, fully inside the "good" range.

CLS 0.235 → 0.015

The headline win. Layout shift was caused by images without explicit dimensions and late-loading fonts on the old site. Fixed by setting width/height attributes on every image and using font-display: swap with proper preload.

Best Practices 73 → 100

Old site had mixed content warnings, insecure third-party scripts, and deprecated APIs from old plugins. Perfect 100 reflects clean dependency management and proper HTTPS across all assets.

SEO 85 → 100

Correct heading hierarchy, meta descriptions, alt attributes, and structured data — all absent or broken on the old site. The new site ships with proper schema.org markup for LocalBusiness and SportsActivityLocation.

Performance 83 → 95

Static generation eliminates per-request PHP execution. The redesign also serves a video hero — load times remain comfortably within Google's "good" thresholds despite the heavier above-the-fold asset.

What the old site communicated

The previous pantera.waw.pl used a generic WordPress theme with no brand-specific design system. Several structural decisions actively worked against conversion.

No visual hierarchySix 3-column cards on the homepage with equal weight — Krav Maga, children's classes, birthday parties competing identically. No segmentation, no routing.
ALL CAPS in headings"PANTERA – KLUB SAMOOBRONY KRAV MAGA" in uppercase with small caps — dated typographic convention that reduces readability and trust.
Fragmented dark zonesNavigation bar in dark navy, hero in a separate dark treatment — two competing dark zones with no relationship, creating visual fragmentation.
No trust signals above foldNo stars, no social proof, no instructor faces visible without scrolling. The hero shows a stock-style image with text overlay — generic.
Buried CTA"Zapisz on-line" is a single nav item among six others — same visual weight as "Kontakt." No primary CTA button above the fold.
CLS 0.235Layout shift in the poor range — visible jumps on load, damaging both user experience and Google ranking signals.

Chapter

Stack

Replacing WordPress was not about performance — it was about control. Performance is the visible win; the structural one is that nothing about the CMS or the server requires logging into somebody else's dashboard to do the job.

Payload over Sanity (per-seat pricing turns hostile as the team grows), Strapi (mid-v5 migration churn), Contentful (priced for a different size of company). Coolify on a €5 Hetzner VPS over Vercel: the same push-to-deploy ergonomics on a flat-rate machine, without the bandwidth cliff a video-heavy site eventually walks off.

Stack migration

The Pantera project is being rebuilt from a shared-hosting WordPress install to a modern headless stack — Next.js as the frontend framework, Payload CMS as the content layer, PostgreSQL as the database, and a Hetzner VPS replacing shared hosting. This is not just a redesign: it's a full infrastructure replacement.

Old stack
WordPress (theme-based)
Generic theme, no design system, content and presentation tightly coupled
Shared hosting
No control over PHP version, server config, or caching strategy
MySQL (managed by host)
No direct access, no migrations, no version control on schema
Plugin-dependent
SEO, forms, caching, security — all via third-party plugins of varying quality
New stack
Next.js 14 (App Router)
React server components, static generation for public pages, API routes for forms
Payload CMS 3.x
Headless CMS with typed collections, admin panel for client, no plugin dependency
PostgreSQL on Hetzner VPS
Full control, schema migrations via Payload, no shared-resource bottlenecks
Hetzner VPS (CX22) + Coolify
Dedicated compute managed via Coolify — automatic deploys from git, built-in reverse proxy and SSL, full server access

How it fits together

Content layer
Payload CMS admin
PostgreSQL
Payload REST / GraphQL API
Frontend layer
Next.js App Router
Static pages (ISR)
+
API routes (forms)
Hosting layer
Hetzner VPS
Coolify
Reverse proxy + SSL
Payload CMS admin panel for Pantera — collections grouped into Ustawienia, Strony, Treści, Wygląd, Komponenty

Payload admin — collections grouped by purpose, all field labels in Polish for the client.

Why this stack

Next.js over WordPress

Performance by default

Static generation means public pages are pre-rendered HTML — no PHP execution on request, no database query on page load. The Lighthouse gap between old and new site is partly structural, not just optimization.

Payload over ACF

Type-safe content schema

Payload collections are defined in TypeScript — instructors, classes, schedules have validated schemas. No more broken content from accidentally deleted required fields. Clean admin panel, not a duct-taped WordPress backend.

Payload over Sanity

No seat-based pricing

Sanity charges per editor seat at scale. Payload is self-hosted and open source — the client owns their CMS with no recurring SaaS cost. For a single-location sports club, this is the right trade-off.

VPS over shared hosting

Full infrastructure control

Shared hosting can't run Node.js processes or PostgreSQL. The VPS enables the entire stack, plus Coolify handles deploys, reverse proxy, and SSL out of the box — none of which were possible on the old host.

PostgreSQL over MySQL

Payload's native target

Payload 3.x uses Drizzle ORM with PostgreSQL as the primary target. Running the recommended combination avoids adapter quirks and gives access to full SQL capabilities — useful for future booking or reporting features.

Scalability

Reusable agency template

The Next.js + Payload + Postgres + Hetzner stack is now a repeatable base for future sport and martial arts school clients. WordPress was client-specific; this stack is productizable.

Payload's admin UI is significantly cleaner than WordPress for non-technical users — no plugin menu, no theme customizer, no 15-year-old UX debt. The client sees only the collections they need, with field labels in Polish.

Honest trade-offs

The new stack is the right choice, but it's not free. Documenting both sides keeps the case study honest.

Gains
  • Full control over server, caching, SSL
  • Type-safe content with no plugin dependencies
  • Performance ceiling much higher than WordPress shared
  • No recurring CMS licensing cost
  • Reusable stack for future clients
  • SEO 85 → 100, Best Practices 73 → 100
Costs
  • Higher initial build time vs WordPress theme
  • VPS requires manual server maintenance
  • No plugin ecosystem — custom code for edge cases
  • Client onboarding to Payload takes more time than WP
  • Manual updates for Next.js / Payload security patches
Next.js 14Payload CMS 3.xPostgreSQLDrizzle ORMTypeScriptTailwind CSSHetzner VPSCoolify

NEXT CASE STUDY

ProfilDance

Dance School · Warsaw, PL