DEV Community

Dingiu Liao
Dingiu Liao

Posted on

How I Built a 170-Page Game Database with Vanilla HTML, CSS, and Structured Data

How I Built a 170-Page Wuthering Waves Database with Vanilla HTML, CSS, and Structured Data

No frameworks. No build step. No CMS. Here's the architecture behind WutZone — a statically-generated game database that competes with wiki sites for Google rankings.


The Problem

Wuthering Waves has dozens of characters, weapons, and Echoes. Each one deserves its own page. That's 170+ pages of structured data — character stats, weapon rankings, team synergies, upgrade materials.

Game wiki sites (Fandom, game8, Prydwen) dominate the search results. To compete, you need:

  1. Fast load times — Google ranks on Core Web Vitals
  2. Rich structured data — Schema.org markup for rich snippets
  3. Entity relationships — internal links that form a knowledge graph
  4. Content that answers real search queries — not just data dumps

Here's how I built the Rover character page as a case study.


The Stack (It's Simple)

HTML            —  static pages, one per entity
CSS             —  shared.css + per-page overrides
JavaScript      —  nav, theme toggle, GA4, Clarity
JSON-LD         —  Schema.org structured data
Cloudflare Pages — auto-deploy from GitHub main branch
Enter fullscreen mode Exit fullscreen mode

No React. No Astro. No Hugo. When every page follows the same template pattern, a static HTML approach works fine — and ships zero JavaScript overhead to the client for content rendering.


Design System: Color-Coded by Element

Each character has an element (Havoc, Spectro, Glacio, Fusion, Aero, Electro). Rather than a flat design, the Rover page uses element-specific accent colors:

/* Havoc = purple, Spectro = gold */
:root {
  --havoc: #a855f7;
  --spectro: #facc15;
}

.cd-section.havoc { border-left: 3px solid #a855f7; }
.cd-section.spectro { border-left: 3px solid #facc15; }
Enter fullscreen mode Exit fullscreen mode

The comparison table between Havoc and Spectro forms uses column headers with matching colors — users visually know which column they're reading without checking the label.

This pattern scales to all 57 character pages: swap the accent color variable, and the entire page themes itself.


The "Quick Reference" Pattern

Most users don't read a build page. They scan for answers:

Best Form? → Havoc
Best Weapon? → Emerald of Genesis
Best Echo? → Dreamless
Enter fullscreen mode Exit fullscreen mode

Instead of a wall of text, we put three highlight cards at the top:

<div class="qr-grid">
  <div class="qr-card primary">Best Form → Havoc Rover</div>
  <div class="qr-card">Best Weapon → Emerald of Genesis</div>
  <div class="qr-card">Best Echo → Dreamless</div>
</div>
Enter fullscreen mode Exit fullscreen mode

Each card answers one question. No scrolling required. Google also extracts this for featured snippets when the data is well-structured.


Structured Data: Beyond Basic SEO

Every page has two JSON-LD blocks:

FAQ Schema — Google shows these as expandable Q&As in search results:

{
  "@type": "FAQPage",
  "mainEntity": [
    {"@type": "Question", "name": "Is Rover worth building?"},
    {"@type": "Question", "name": "Male or Female Rover — what's the difference?"}
  ]
}
Enter fullscreen mode Exit fullscreen mode

BreadcrumbList Schema — helps Google understand site hierarchy:

{
  "@type": "BreadcrumbList",
  "itemListElement": [
    {"name": "WutZone", "item": "https://wutzone.com/"},
    {"name": "Characters", "item": "https://wutzone.com/characters/"},
    {"name": "Rover"}
  ]
}
Enter fullscreen mode Exit fullscreen mode

The combination of both schemas on a single page significantly improves the SERP appearance — breadcrumbs show the navigation path, and FAQ accordions push competitors further down the page.


Internal Linking as a Knowledge Graph

Each character page links to:

  • Their weapons (/weapons/emerald-of-genesis/)
  • Their Echoes (/echos/dreamless/)
  • Their teammates (/characters/sanhua/)
  • Database indexes (/weapons/, /echos/, /items/)

This creates a web of entity relationships that Google treats as a knowledge graph. A user who lands on the Rover page can navigate to every related entity without hitting the navigation bar.

From an SEO perspective, internal links distribute PageRank across the site — the tier list page linking to Rover, Rover linking to weapons, weapons linking back to other characters. It's a self-reinforcing structure.


The Keyword Strategy

Rather than stuffing exact-match keywords, the page answers the questions people actually type into Google:

Search Intent How the Page Answers
"rover best weapon" FAQ: "What is Rover's best weapon?" + ranked weapon table
"rover havoc vs spectro" Dedicated comparison section with table
"rover s6 free" FAQ: "How do I get Rover's S6 for free?"
"rover male or female" FAQ: "Male or Female Rover — what's the difference?"

Each FAQ question is a real search query with volume behind it (sourced from Reddit trending topics and Google Trends data). Schema markup ensures Google can surface these as Featured Snippets.


Mobile-First Details

  • FAQ accordions use native <details> elements — zero JavaScript, works on every browser
  • Echo Cost visualization uses colored chips (4→3→3→1→1) instead of a text description — scannable at a glance
  • Team cards collapse to a single column on mobile via CSS Grid auto-fit

No media query hacks. No separate mobile templates.


Results (So Far)

The site is live at wutzone.com. After launching with these patterns:

  • Google indexed 80+ pages
  • Bing indexed 87 pages (53% character page coverage)
  • FAQ Schema generates rich results on individual character searches
  • Zero ad spend — all traffic is organic

The template now scales to any character page: change the data, swap the accent color, and the page is production-ready.


The Full Code

The entire site is open source:

🔗 github.com/liaodingjiu/wuthering-guide

Or check out the Rover page directly:

🔗 wutzone.com/characters/rover/


Built with vanilla HTML/CSS/JS · Deployed on Cloudflare Pages · Last updated: August 2026

Top comments (0)